0

I am using ActiveMQ-CPP 3.4.5 to connect from C++ program to message broker. The problem I encountered is connected with redelivery policy. Messages which are returned to queue are redelivered immediately. This is not the behaviour I expect. I would expect the messages to be returned after certain period of time which is set through redelivery policy.

This is a code snipped showing the way I set up redelivery policy:

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

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

connectionFactory.setRedeliveryPolicy(policy);

As I said before I would except the messages to be redelivered after 10000 ms, but the are not. They come back to consumer immediately.

Does anyone know what could be the reason of such behaviour?

4

2 に答える 2

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 に答える
0

最初の遅延をゼロに設定すると、トランザクションが最初にロールバックされたときにすぐに再配信されるようになります。最初の再配信サイクルで遅延させたい場合は、初期遅延も 10000 に設定する必要があります。

于 2013-03-20T14:00:32.100 に答える