我使用ActiveMQ-CPP3.4.5从C++程序连接到message broker。我遇到的问题与重新交付策略有关。返回到队列的消息会立即重新传递。这不是我所期望的行为。我预计消息将在通过重新投递策略设置的特定时间段后返回。
这是一段代码片段,显示了我设置重新交付策略的方式:
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毫秒后重新发送,但它们不是。它们会立即返回给消费者。
有谁知道这种行为的原因是什么?
发布于 2013-03-20 22:00:32
您将初始延迟设置为零,以便在第一次回滚事务时立即重新发送它们。如果您希望它们在第一个重新交付周期中延迟,则还需要将初始延迟设置为10000。
发布于 2013-03-21 15:28:48
当我查看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());
}}
https://stackoverflow.com/questions/15523712
复制相似问题