【问题标题】:ActiveMQCPP connection.start() hangs upActiveMQCPP connection.start() 挂断
【发布时间】:2011-07-05 04:28:57
【问题描述】:

如果重要的话,我正在使用 ActiveMQ CPP 5.2.3。

我有 JMS 生产者,它使用 failover 传输连接到 JMS 代理网络。 当我调用 connection->start() 时,它会挂断(参见AMQ-2114)。

如果我跳过连接 start() 并调用 connection->createSession(),那么这个调用也会被阻止。

要求是我的应用程序将永远尝试连接到代理。

有什么建议/解决方法吗?

注意

这不是 here 的重复,因为我说的是 C++ 和嵌入式代理之类的解决方案,spring 在 C++ 中不可用。

【问题讨论】:

    标签: c++ jms activemq activemq-cpp


    【解决方案1】:

    当连接等待传输连接到代理时,这是正常的。 start 方法必须在任何其他操作之前将客户端的 id 信息发送到代理,因此如果不存在连接,它必须阻塞。您可以在故障转移传输上设置一些选项,例如 startupMaxReconnectAttempts 选项,以控制在报告故障之前尝试连接多长时间。查看 URI 配置页面:

    http://activemq.apache.org/cms/configuring.html

    【讨论】:

    • 谢谢。但是如果我使用这个选项 connect->start() 会抛出异常。如果我忽略异常而不是调用 connect->createSession() 将引发异常。我试图在 TransportListener::transportResumed() 中调用 connect->createSession(),但这会导致 ActiveMQ 库中的一些死锁。是否有解决方法可以继续尝试在“后台”建立连接?
    • 恕我直言,根据JMS规范,配置完成后可以调用conenction->start()(即在connection->createSession()之后调用connection->start()),但这也不不工作
    • 不,代理需要在创建实际会话之前知道客户端 ID。最好的办法是让客户端在开始时挂起,或者在调用 transportResumed 时触发事件。您无法在不存在的服务器上创建资源。
    • 让我看看我是否理解正确 - 我可以在单独的线程中执行 connect->start() 并且线程将永远被阻塞,直到成功创建连接。创建连接后,ActiveMQ lib 会代表其线程调用 d transportResumed()。之后我需要从 transportResumed() 发送一个事件以代表其他线程继续初始化(例如 connection->createSession())。我可以直接在 transportResumed() 中继续初始化吗?
    • 我不建议尝试在 transportResumed 中创建任何资源,您很可能会遇到线程死锁。中断和恢复的回调实际上仅供参考,应谨慎使用。您可以在其中设置一个触发其他线程的事件。建立连接后,等待 connection.start 的线程将恢复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    • 2014-10-01
    • 2020-04-12
    • 2011-04-15
    • 2021-05-29
    • 1970-01-01
    相关资源
    最近更新 更多