【问题标题】:How to create jms-bridge between Wildfly and ApacheActiveMQ Artemis?如何在 Wildfly 和 ApacheActiveMQ Artemis 之间创建 jms-bridge?
【发布时间】:2019-08-27 21:55:59
【问题描述】:

我正在尝试创建一个从我的 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.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)

并且没有关于如何做到这一点的教程。

【问题讨论】:

    标签: jms wildfly activemq-artemis


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2017-01-23
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      • 2017-03-03
      • 2017-11-30
      • 2020-04-25
      • 2017-03-28
      • 2020-10-01
      相关资源
      最近更新 更多