JNDI 绑定在 JBOS for MQ 中



我需要一点帮助来配置 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>

最新更新