2016-10-20 2 views
0

Может ли кто-нибудь дать мне знать, как сделать гарантированную доставку с помощью верблюда?Camel гарантированная доставка с использованием Redis

Мой случай использования является то, как показано ниже: -

from("jetty:http://localhost:8888/hello").to("redis://...") 

Когда сообщение записывается в Redis отправить ответ успеха на HTTP-клиент, так что клиент не блокируется в ожидании ответа.

Тогда в другой маршрут я хочу обработать сообщение от Redis, как показано ниже, а затем удалить его из Redis, когда обработка успешно

from("redis://...").to(...) 
+0

Хороший подход - это шаблон «хранить и переадресовывать». См. Http://redis.io/commands/rpoplpush. Какова ваша проблема в реализации шаблона? – gusto2

+0

Как обрабатывать случай, когда есть ошибка после прочтения сообщения от redis в пути 'from (" redis: // ") .to (...). To (...)' и сообщение не доставляется до конечного пункта назначения? Как добавить сообщение обратно в исходный список? – tuk

+0

Если я использую BRPOPLPUSH и нет времени для тайм-аута, тогда переместите сообщение обратно в исходный список из списка адресатов. Если есть сообщение, удалите сообщение. Можете ли вы предложить, какой будет лучший способ реализовать это с помощью java dsl? – tuk

ответ

1

Хороший подход - это называется «магазин и вперед» узор.

и сообщение не доставлено в конечный пункт назначения?

then - а как насчет "try/catch"? попробуйте отправить сообщение, а при сбое просто верните его в redis.

Обычно эта модель реализуется с помощью обмена сообщениями (JMS), где обмен сообщениями, имеющий некоторые важные особенности: назначения, количество повторов, повторите попытку и Период очереди мертвых письмо и т.д.

Используя любой простой магазин (redis, jdbc, ...) вам придется реализовать эти функции обмена сообщениями самостоятельно. (Я должен администратор, я плохо разбираюсь в Redis, но та же проблема связана с использованием простого JDBC в качестве хранилища сообщений).

По крайней мере, добавьте счетчик повторов и «следующую метку доставки». И что происходит, когда сообщение не доставляется после предопределенного счета - это зависит от вас - отправьте почту, напишите журнал, остановите мир.

+0

Да, 'try/catch' есть. Я спрашивал о случае, если экземпляр верблюда упадет после прочтения сообщения от redis. – tuk

+1

Либо если конечные точки (redis, http) не являются полностью транзакционными. В этом случае у вас не будет идеального решения, и вам придется идти на компромисс. Вы можете использовать команду redis transaction или удалить объект redis только тогда, когда служебный вызов будет успешным. В последнем случае удаленная служба должна быть идемпотентной. – gusto2

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