ActiveMQ-CPP - 消息重新传递延迟不会被应用

时间:2013-03-20 12:35:09

标签: c++ activemq activemq-cpp

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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());
}

}