Верблюд с JMS Transaction и REST после звонка - PullRequest
0 голосов
/ 20 ноября 2018

Мне нужно прочитать сообщение из очереди и вызвать службу REST, делающую сообщение.

Затем я искал транзакцию JMS с Camel, похоже, вы можете установить maximumRedeliveries вобработать сообщение очереди снова, поэтому, откатывая транзакцию в случае сбоя, мне было интересно, как она может работать, если на том же маршруте верблюда мы должны вызвать службу REST для публикации чего-либо, как эта часть может быть откатом ??

maxDelivery conf:

errorHandler(new TransactionErrorHandlerBuilder()
        .loggingLevel(LoggingLevel.ERROR)
        .useOriginalMessage()
        .maximumRedeliveries(2)
        .logHandled(false)
        .logExhausted(true)
    );

Псевдокод для маршрута:

//Reading message from the queue
from("activemq:AMQ.App.EMC2.In.PMQueue?jmsMessageType=Bytes").
    transacted().
    unmarshal(jaxbDataFormat).bean(pmMessageEnricher).
    to("direct:start-post");

//Then doing the post
from("direct:start-post").
    setHeader(Exchange.HTTP_METHOD, constant("POST")).
    setHeader(Exchange.CONTENT_TYPE, constant("application/json")).
    setBody(constant(pmMessageEnricher.toJson())).
    to("http://xxx").
    to("direct:start-somethingelse");

//Then doing something else
from("direct:start-somethingelse").
blabla...

Допустим, что исключение происходит в start-somethingelse, Как может быть пост-вызов RESTоткат?поскольку мы вызываем внешнюю службу без сохранения состояния.

1 Ответ

0 голосов
/ 21 ноября 2018

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

Однако, если вы поймете ошибку обработки, вы можете применить необходимую логику компенсации .Например, удалите уже опубликованные данные с другим запросом.

Кстати: не путайте доставки верблюдов и брокерские поставки!

Поставки верблюдов выполняются Camel Errorhandler (не брокер).В вашем примере это делает до 2 повторных поставок.Но имейте в виду, что Верблюды не перерабатывают весь маршрут, а только неисправный процессор .

Таким образом, если to("http://xxx") завершается неудачно и верблюд Camel Errorhandler выполняет повторную доставку, Camel повторяет только to("http://xxx").

В отличие от , если ваша транзакция JMS откатывается, брокер восстанавливает доставкусообщение верблюду и весь маршрут обрабатывается снова .

Позаботьтесь о том, чтобы вы не «маскировали» повторную доставку JMS с помощью обработчика ошибок Camel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...