在运行时启动jms消息驱动的通道适配器

时间:2015-12-18 17:25:00

标签: java spring jms activemq

我在tomcat上运行了一个带有声明的activemq使用者的Web应用程序。应用程序工作正常,但现在我想在运行时启动使用者 - 所以我声明了控制总线并向此发送消息。

我的代码中有一段:

<channel id="controlChannel"/>

<control-bus input-channel="controlChannel"/>

<gateway service-interface="myApp.ControlGateway" default-request-channel="controlChannel"/>

<channel id="eventQueueChannel"/>

<jms:message-driven-channel-adapter
        id="eventQueueJMSIn"
        connection-factory="connectionFactory"
        destination="eventQueue"
        channel="eventQueueChannel"
        auto-startup="false"
        acknowledge="transacted"
        concurrent-consumers="${concurrentConsumers:1}"
        max-concurrent-consumers="${maxConcurrentConsumers:10}"/>

然后我按controlBusGateway.sendCommand("@eventQueueJMSIn.start()");启动此网关。

问题是消费者无法连接到activemq。此外,出版商也存在问题。

总之,当一切都自动开始时,没有问题。当我将消费者网关更改为auto-startup="false"时,我无法发送或接收来自activemq的任何消息。但是当我测试这个bug时,我假设如果在activemq中排队了消息,它会连接到它并且一切正常。

我非常惊讶,发布商存在问题 - 我没有改变它。我不知道为什么它有时会起作用......

编辑:

有一个错误: “org.apache.activemq.transport.tcp.TcpTransportFactory无法转换为org.apache.activemq.transport.TransportFactory” - 将auto-startup更改为false后会显示。

我还看到Thread.currentThread().getContextClassLoader()在一切正常时返回BundleDelegatingClassLoader,在抛出异常时返回AppClassLoader

1 个答案:

答案 0 :(得分:0)

如果它不是开销,那么您可以尝试使用Camel Framework来实现所描述的场景。