2014-11-03 1 views
1

В моем previous message Я искал решение для обработки входящих сообщений параллельно. После многих проб и ошибок, я думаю, у меня может быть рабочее решение.Потеря сообщений в процессорах при перезапуске брокера

Однако одно из требований платформы, над которой я работаю, заключается в том, что сообщения, которые обрабатываются, должны быть перезапущены или перезаписаны в случае внезапного перезапуска брокера.

Во время тестирования я успешно начал несколько процессоров сразу, чтобы выполнить единицу работы на сообщение. То, что я обнаружил при внезапном перезапуске брокера, заключается в том, что любое сообщение, «обработанное» внутри процессора, фактически потеряно. Однако, когда процессор выбрасывает преднамеренное исключение, сообщение пересылается в очередь.

Как я могу защитить свое сообщение во время его обработки (а часть работы еще не закончена)? Любые рекомендации очень ценятся.

Примечание: окончательная реализация будет использовать мастер-мастер-установку двух одинаковых брокеров за балансировщиком tcp.

+0

Вы используете транзакции и являетесь ли сообщения постоянными? –

+0

сообщения отправляются в очередь с DeliveryMode.PERSISTENT. Не уверен, как добавить транзакции к моим процессорам. В настоящее время все сообщения «в полете» исчезли, если я убью java-процесс для activemq. – djBo

+0

Я просто добавил транзакции для каждого маршрута, но затем сообщения перестают обрабатываться параллельно ... – djBo

ответ

0

Чтобы сохранить ваше сообщение, вы должны использовать транзакции с постоянными сообщениями. Без транзакций не учитываются все сценарии исключений, особенно если вы используете AUTO_ACKNOWLEDGE по умолчанию, который сообщает брокеру, что вы использовали это сообщение, поэтому зайдите в голову и удалите его, как только сообщение будет доставлено. Вот почему при перезапуске брокера вы теряете свое сообщение. Другого пути нет.

Предполагая, что у вас установлены правильные транзакции, нет причин, по которым вы не сможете обрабатывать параллельно. This blog is a bit older now, но по-прежнему заполнен хорошей информацией, чтобы убедиться, что вы правильно настраиваете свои транзакции.

+0

К сожалению, это не работает должным образом, особенно при выполнении действий в тандеме с использованием интерфейса AsyncProcessor. Из http://camel.apache.org/jms.html я прочитал, что параметр asyncConsumer = true игнорируется после установки transacted = true. Я могу получить поддержку для асинхронных транзакций в Camel 3.0 :( – djBo

+0

Это отдельная проблема. В ответ на ваш вопрос здесь единственный вариант для обеспечения полной обработки сообщений до того, как брокер удалит их, - это использовать транзакции. –

+0

Не можете ли вы используйте 'CLIENT_ACKNOWLEDGE', чтобы обеспечить доставку сообщений по крайней мере один раз? Вы получите повторную доставку при перезагрузке брокера вместо не доставки, но если потребитель сможет это обработать, вы бы не потеряли сообщения ... – Tim