【问题标题】:ActiveMQ-CPP - message redelivery delay do not get appliedActiveMQ-CPP - 未应用消息重新传递延迟
【发布时间】:2013-03-21 20:20:50
【问题描述】:

我正在使用 ActiveMQ-CPP 3.4.5 从 C++ 程序连接到消息代理。 我遇到的问题与重新投递政策有关。 返回到队列的消息会立即重新传递。这不是 我期望的行为。我希望消息在一段时间后返回 通过重新投递政策设置的时间。

这是一段代码,显示了我设置重新投递政策的方式:

policy = new activemq::core::policies::DefaultRedeliveryPolicy();

policy->setInitialRedeliveryDelay(0);
policy->setRedeliveryDelay(10000);
policy->setMaximumRedeliveries((int)activemq::core::RedeliveryPolicy::NO_MAXIMUM_REDELIVERIES);

connectionFactory.setRedeliveryPolicy(policy);

正如我之前所说,除了要在 10000 毫秒后重新传递的消息之外,我不会,但事实并非如此。 它们会立即返回给消费者。

有谁知道这种行为的原因是什么?

【问题讨论】:

    标签: c++ activemq activemq-cpp


    【解决方案1】:

    您将初始延迟设置为零,以便在事务第一次回滚时立即重新交付它们。如果您希望它们在第一个重新交付周期被延迟,那么您还需要将初始延迟设置为 10000。

    【讨论】:

    • Tim,我尝试将初始延迟设置为 10000,但没有帮助。消息仍然会立即到达。
    【解决方案2】:

    当我查看 ActiveMQ-CPP 源时,我在 ActiveMQConsumer.cpp 文件中发现了以下代码 sn-p:

    if( internal->redeliveryDelay > 0 && !this->internal->unconsumedMessages->isClosed() ) {
    // TODO - Can't do this until we can control object lifetime.
    // Start up the delivery again a little later.
    // this->internal->scheduler->executeAfterDelay(
    //    new StartConsumerTask(this), internal->redeliveryDelay);
        start();
    } else {
        start();
    }
    

    因此,回滚后似乎根本没有考虑 redeliveryDelay 。 这就是为什么,我想,我的消息在回滚后立即到达。

    onMessage 方法:

    void BaseProdListener::onMessage( const cms::Message* message ){    
    log4cxx::Logger::getLogger("BaseProdListener")->info("onMessage");
    
    _message = message;
    
    try {
        const cms::TextMessage* textMessage = dynamic_cast< const cms::TextMessage* >( message );
        std::string text = "";
        if( textMessage != NULL ) {
            text = textMessage->getText();
            log4cxx::Logger::getLogger("BaseProdListener")->debug("Received message:" + text);
            handleMessage(text);
        }
    } catch (cms::CMSException& e){
        log4cxx::Logger::getLogger("BaseProdListener")->error(e.getStackTraceString());
    }
    

    }

    【讨论】:

    • 升级到最新版本应该不会出现这些问题。
    • 是的,我认识蒂姆。我在 3.5.0 和 3.6.0 源中看到它应该可以正常工作。不幸的是,我无法升级,因为升级后我的应用程序停止工作。我在 onMessage 函数的侦听器中遇到异常。我不知道该异常的原因是什么。当我切换回 3.4.5 时,一切正常。我在答案中添加了 onMessage 方法列表。以下行似乎引发了异常: text = textMessage->getText();
    • 有用户组、jira 等。你所要做的就是整理一个测试用例并寻求帮助。
    猜你喜欢
    • 2014-09-27
    • 2011-03-27
    • 1970-01-01
    • 2018-06-08
    • 2015-04-25
    • 2022-12-14
    • 2019-07-18
    • 1970-01-01
    • 2011-01-12
    相关资源
    最近更新 更多