我正在尝试创建从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)
并且没有有关如何执行此操作的教程。
答案 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>