如何在Wildfly和ApacheActiveMQ Artemis之间创建jms-bridge?

时间:2019-08-27 11:49:04

标签: jms wildfly activemq-artemis

我正在尝试创建从WF 14.0.1.Final到Artemis 2.6.3独立经纪人的jms桥。

当我像这样搭桥时:

        <jms-bridge name="HelloWorldQueue-jms-bridge" quality-of-service="DUPLICATES_OK" failure-retry-interval="5000" max-retries="-1" max-batch-size="10" max-batch-time="100">
            <source connection-factory="ConnectionFactory" destination="queue/HelloWorldQueue"/>
            <target connection-factory="jms/RemoteConnectionFactory" destination="dynamicQueues/myQueue" user="admin" password="admin">
                <target-context>
                    <property name="java.naming.factory.initial" value="org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory"/>
                    <property name="java.naming.provider.url" value="tcp://localhost:5445?type=CF"/>
                </target-context>
            </target>
        </jms-bridge>

我知道

[org.apache.activemq.artemis.jms.bridge] (Thread-98) AMQ342010: Failed to connect JMS Bridge N/A: javax.naming.NameNotFoundException: jms/RemoteConnectionFactory
    at org.apache.activemq.artemis.jndi.ReadOnlyContext.lookup(ReadOnlyContext.java:236)
    at javax.naming.InitialContext.lookup(InitialContext.java:417)
    at javax.naming.InitialContext.lookup(InitialContext.java:417)
    at org.apache.activemq.artemis.jms.bridge.impl.JNDIFactorySupport.createObject(JNDIFactorySupport.java:46)
    at org.apache.activemq.artemis.jms.bridge.impl.JNDIConnectionFactoryFactory.createConnectionFactory(JNDIConnectionFactoryFactory.java:31)
    at org.apache.activemq.artemis.jms.bridge.impl.JMSBridgeImpl.createConnection(JMSBridgeImpl.java:961)
    at org.apache.activemq.artemis.jms.bridge.impl.JMSBridgeImpl.setupJMSObjects(JMSBridgeImpl.java:1159)
    at org.apache.activemq.artemis.jms.bridge.impl.JMSBridgeImpl.setupJMSObjectsWithRetry(JMSBridgeImpl.java:1258)
    at org.apache.activemq.artemis.jms.bridge.impl.JMSBridgeImpl.access$2600(JMSBridgeImpl.java:74)
    at org.apache.activemq.artemis.jms.bridge.impl.JMSBridgeImpl$FailureHandler.run(JMSBridgeImpl.java:1759)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

并且没有有关如何执行此操作的教程。

1 个答案:

答案 0 :(得分:2)

像任何普通的远程JMS客户端一样,思考JMS桥。它使用JMS和JNDI API访问任何兼容的代理。唯一需要配置的是JNDI环境参数(例如,诸如InitialContext工厂之类的东西)和JNDI查找名称(即,用于连接工厂和目标的名称)。

当网桥试图从网桥connection-factory查找target时,您将失败。配置方法如下:

<target connection-factory="jms/RemoteConnectionFactory" destination="dynamicQueues/myQueue" user="admin" password="admin">
    <target-context>
        <property name="java.naming.factory.initial" value="org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory"/>
        <property name="java.naming.provider.url" value="tcp://localhost:5445?type=CF"/>
    </target-context>
</target>

您已将connection-factory配置为jms/RemoteConnectionFactory。但是,该连接工厂默认情况下不可用,并且您尚未在target-context属性中显式配置它,因此会收到javax.naming.NameNotFoundException。我建议您仅使用默认情况下存在的连接工厂名称之一,例如ConnectionFactory。这样的更改将产生以下配置:

<target connection-factory="ConnectionFactory" destination="dynamicQueues/myQueue" user="admin" password="admin">
    <target-context>
        <property name="java.naming.factory.initial" value="org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory"/>
        <property name="java.naming.provider.url" value="tcp://localhost:5445?type=CF"/>
    </target-context>
</target>