【问题标题】:Starting jms message driven channel adapter at runtime在运行时启动 jms 消息驱动通道适配器
【发布时间】:2016-03-25 11:20:50
【问题描述】:

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

有一段我的代码:

<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 的任何消息。但是当我测试这个错误时,我假设如果在 activemq 中是排队的消息,它会连接到它并且一切正常。

我很惊讶,出版商有问题 - 我没有改变它。而且我不知道为什么它有时会起作用......

编辑:

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

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

【问题讨论】:

    标签: java spring jms activemq


    【解决方案1】:

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

    【讨论】:

    • 好的,我会尝试理解这个 Camel 框架,但是任何人都可以知道我的代码有什么问题吗?我花了这么多小时,仍然不知道发生了什么......似乎,禁用auto-startupTransportFactory 出现问题
    • 你为AMQ做的代码配置很好,没有问题。 Camel 可能无法解决所有问题,因为这是类路径问题,此外在 war 文件中捆绑骆驼可能是完全不同的路线。在此之前怀疑这可能是一个 activemq-client jar 问题。您能否更新一下您在项目中使用的 AMQ 代理、客户端 jar 的版本。
    • 我不知道我是否正确搜索,但我认为该版本是 5.4.2。我在 5.13.0 版本中使用 activeMQ。我现在修复了它,在尝试启动 activemq 队列/主题时更改了类加载器,然后返回到旧的类加载器。这不是很好的解决方案,但最近在这个项目中使用。我听说这可能是 osgi 集成的问题。
    猜你喜欢
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 2017-09-18
    • 2014-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多