2013-03-20 3 views
0

Я использую ActiveMQ-CPP 3.4.5 для подключения от C++ к брокеру сообщений. Проблема, с которой я столкнулся, связана с политикой переопределения. Сообщения, которые возвращаются в очередь, немедленно возвращаются. Я не ожидаю такого поведения . Я ожидаю, что сообщения будут возвращены после определенного периода времени времени, которое задано политикой пересылки.ActiveMQ-CPP - сообщение redelivery delay не применяется

Это код отрезала показывает путь настроить Redelivery политику:

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 мс, но не являются. Они немедленно возвращаются к потребителю.

Кто-нибудь знает, что может быть причиной такого поведения?

ответ

0

Вы устанавливаете начальную задержку на ноль, чтобы они были повторно отправлены сразу же при первом откате транзакции. Если вы хотите, чтобы их задерживали в первом цикле повторной доставки, вам также нужно установить начальную задержку на 10000.

+0

Тим, я попытался установить intitial задержку до 10000, но это не помогло. Сообщения все равно поступают немедленно. – Damian

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

}

+0

Обновление до последней версии, и вы не должны иметь эти проблемы. –

+0

Да, я знаю Тима. Я видел в источниках 3.5.0 и 3.6.0, что он должен работать должным образом. К сожалению, я не могу обновиться, потому что после обновления мое приложение перестает работать. Я получаю исключение в моем слушателе в функции onMessage. Я не знаю, в чем причина этого исключения. Когда я вернусь к 3.4.5, все будет хорошо. Я добавил список методов метода myessage в свой ответ. Исключение похоже на следующую строку: text = textMessage-> getText(); – Damian

+0

Есть группы пользователей, джира и т. Д. Все, что вам нужно сделать, это собрать тестовый пример и попросить помочь. –

Смежные вопросы