0

我正在使用 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 毫秒后重新传递的消息之外,我不会,但事实并非如此。他们立即返回给消费者。

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

4

2 回答 2

0

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

于 2013-03-20T14:00:32.100 回答
0

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

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());
}

}

于 2013-03-21T07:28:47.847 回答