我需要一点帮助来配置 JBoss 以使用 MQ。我已经使用 IBM MQ 资源管理器在 MQ 中创建了初始上下文,并为所有绑定(如 file:/C:/jndi)提供了一个本地目录。我为此初始上下文创建了一个连接工厂。现在 JBoss 文档说要像这样绑定
<connection-definition class-name="com.ibm.mq.connector.outbound.ManagedConnectionFactoryImpl"
jndi-name="java:jboss/MQ.CONNECTIONFACTORY.NAME"
pool-name="MQ.CONNECTIONFACTORY.NAME">
我想我在这里错过了一些点。我如何告诉 Jboss 我的 InitialContext 绑定在一个目录中。我已经尝试了大多数组合。可能是我的概念不正确。有什么指示吗?
当我尝试从我编写的测试servlet访问此 MQ.CONNECTIONFACTORY.NAME 时,我得到javax.naming.NameNotFoundException。如果我在Java SE环境中遵循相同的步骤,我就能够成功建立连接。我是应用程序服务器的新手,这个问题可能很幼稚
问候
通过 MQExplorer 创建的资源的描述表明,这些资源已被放入由文件系统上下文支持的 JNDI 中。这完全没问题,但理论上现在需要做的是让 JBOSS 从 JNDI 上下文中读取对象,而不是 JBOSS 提供的通常的 JNDI 提供程序。连接定义提取中的设置正在使用标准 JBOSS JNDI 上下文。
作为将 JBOSS 与 WebSphere MQ Resoruce 适配器一起使用的示例,请查看此处 http://pic.dhe.ibm.com/infocenter/wmqv7/v7r5/topic/com.ibm.mq.dev.doc/q031810_.htm
这链接到一组示例定义,这些定义在 JBOSS JNDI 上下文中存储 WMQ JMS 管理的对象。
这是一个重要的问题。我为此使用了Spring,如下所示:
<util:properties id="remoteEnv">
<prop key="java.naming.provider.url">file:${my.config.path}/bindings</prop>
<prop key="java.naming.factory.url.pkgs">org.jboss.naming:org.jboss.naming.remote.client</prop>
<prop key="java.naming.factory.initial">com.sun.jndi.fscontext.RefFSContextFactory</prop>
<prop key="java.naming.security.principal">${mdb.user.name}</prop>
<prop key="java.naming.security.credentials">${mdb.user.pass}</prop>
</util:properties>
<bean id="remoteJNDITemplate" class="org.springframework.jndi.JndiTemplate">
<property name="environment" ref="remoteEnv" />
</bean>
<bean id="remoteJmsDestinationResolver" class="org.springframework.jms.support.destination.JndiDestinationResolver">
<property name="jndiTemplate" ref="remoteJNDITemplate" />
<property name="cache" value="true" />
</bean>
<jee:jndi-lookup id="senderQueue" jndi-name="MY_QUEUE_NAME" environment-ref="remoteEnv" />
<bean id="xamqconnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiTemplate">
<ref bean="remoteJNDITemplate"/>
</property>
<property name="jndiName" value="MYCONNECTIONFACTORYJNDINAME"/>
<property name="lookupOnStartup" value="false" />
<property name="proxyInterface" value="javax.jms.XAQueueConnectionFactory" />
</bean>
<bean id="xaMQSenderJMSTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory">
<ref bean="xamqconnectionFactory" />
</property>
<property name="pubSubDomain">
<value>false</value>
</property>
<property name="defaultDestination">
<ref bean="senderQueue" />
</property>
<property name="destinationResolver" ref="remoteJmsDestinationResolver" />
</bean>
但是,使用上面的配置,我们绕过资源适配器。否则这没有问题,但它会阻止事务加入 JBoss 事务,因此 JMS 消息会立即发送,而不是通过事务提交发送。我还没有找到解决方法。
com.sun.jndi.fscontext.RefFSContextFactory,用于读取.bindings文件,可以在以下依赖项中找到:
<dependency>
<groupId>com.sun.messaging.mq</groupId>
<artifactId>fscontext</artifactId>
<version>4.6-b01</version>
</dependency>