1

在配置 JBoss 以使用 MQ 时,我需要一点帮助。我已经使用 IBM MQ Explorer 在 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 环境中遵循相同的步骤,我就可以成功建立连接。我是应用程序服务器的新手,这个问题可能很幼稚

问候

4

2 回答 2

0

这是一个重要的问题。我为此使用了 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>
于 2014-01-13T12:40:28.187 回答
0

通过 MQExplorer 创建的资源的描述表明这些资源已被放入由文件系统上下文支持的 JNDI。这很好,但理论上现在需要做的是让 JBOSS 从 JNDI 上下文中读取对象,而不是 JBOSS 提供的通常的 JNDI 提供程序。连接定义摘录中的设置使用标准 JBOSS JNDI 上下文。

作为将 JBOSS 与 WebSphere MQ 资源适配器一起使用的示例,请查看此处http://pic.dhe.ibm.com/infocenter/wmqv7/v7r5/topic/com.ibm.mq.dev.doc/q031810_.htm

这链接到在 JBOSS JNDI 上下文中存储 WMQ JMS 管理对象的一组示例定义。

于 2013-09-09T14:23:49.490 回答