2013-06-04 5 views
0

Я использую ActiveMQ для C++. В нашем запланированном проекте мы собираемся использовать сообщения, передавать их на асинхронную обработку, и только тогда сообщение считается обработанным. Мы хотели бы обрабатывать несколько сообщений параллельно - каждый закончит свою обработку в другое время - и вы получите только те, которые закончили обработку. Это, во избежание потери сообщений, когда сервер идет вниз, сбой процесса и т. Д.ActiveMQ: по одному сообщению за один раз

Как из документации, так и по тестированию я понимаю, что в режимах CLIENT_ACKNOWLEDGE и SESSION_TRANSACTED нет никакого способа ответить только на одно сообщение. Есть ли наилучшая практика для таких случаев? Должен ли я удерживать «сеансовый пул», каждый сеанс обрабатывает одно сообщение синхронно, а затем запускает его?

Спасибо.

ответ

0

При создании сеанса вы можете использовать режим подтверждения cms :: Session INDIVIDUAL_ACKNOWLEDGE, который позволяет вам выбрать одно сообщение. Объект cms :: Message имеет метод подтверждения, который вы можете использовать для каждого сообщения.

cms::Session* session = connection.createSession(cms::Session::INDIVIDUAL_ACKNOWLEDGE); 

Чтобы Ack сообщение:

cms::Message* message = consumer.receive(); 
message->acknowledge(); 
+0

Как-то я пропустил этот вариант. Спасибо, это работает! –

0

Хотя я никогда не реализовал параллельный потребитель в C++ для ActiveMQ, так вы обычно обрабатываете такие случаи на Java.

Создайте несколько потоков с сеансом и слушателем сообщений, каждый из которых читает сообщения очереди, обрабатывает и затем совершает транзакцию (или, если вы не хотите транзакций).

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