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

How to create jms-bridge between Wildfly and ApacheActiveMQ Artemis?

我正在尝试创建一个从我的 WF 14.0.1.Final 到 Artemis 2.6.3 独立代理的 jms-bridge。

当我这样架桥时:

        <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.access00(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)

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

将 JMS 桥视为任何普通的远程 JMS 客户端。它使用 JMS 和 JNDI API 来访问任何兼容的代理。唯一需要配置的是 JNDI 环境参数(例如 InitialContext 工厂等)和 JNDI 查找名称(即连接工厂和目标)。

当网桥试图从网桥 target 中查找 connection-factory 时失败。这是配置方式:

<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>