ActiveMQ-CPP -消息重新传递延迟没有得到应用

ActiveMQ-CPP - message redelivery delay do not get applied

本文关键字:应用 延迟 消息 新传递 ActiveMQ-CPP      更新时间:2023-10-16

我使用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毫秒后重新发送消息,但事实并非如此。他们会立即回到消费者那里。

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

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

当我查看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());
}

}