2016-07-27 2 views
0

У меня есть rest-api, которые создают ресурс и отправляют его в очередь AMQ.Верблюд отправляет измененное тело в AMQ без изменения тела маршрута

Я использую верблюд отдых и DSL создал что-то вроде этого:

rest("/api") 
      .consumes("application/json").produces("application/json") 
       .post("/test").type(Test.class) 
        .route() 
        .to(ExchangePattern.InOnly, "direct:sendTestAmq") 
        .endRest() 
from("direct:sendTestAmq") 
      .convertBodyTo(TestProtos.Test.class) 
      .marshal().protobuf() 
      .to(ExchangePattern.InOnly, "amq:queue:test.queue"); 

Когда я называю конечную точку, я получаю ответ base64, соответствующий Protobuf двоичный файл.

Я хотел бы получить ответ Test.class json. Я думал, что использовать «to (ExchangePattern.InOnly, ...)» позволит это, не изменяя тело.

Это еще один номер example, ответ «После», и я хотел, чтобы это было «раньше».

Кто-нибудь знает, как я могу это сделать?

Благодаря

+1

См. WireTap EIP –

+0

@ClausIbsen Wiretap работает параллельно, я прав? Я хотел бы дождаться отправки сообщения перед отправкой ответа. У меня будет событие статуса 200, если в маршруте «direct: sendTestAmq» возникает исключение –

ответ

0

На основе @ClausIbsen ответ я обнаружил, что многоадресного() также использовать копию обмена для каждого маршрута, но вместо прослушку, не Параллельная по-умолчанию.

Я мог бы достичь своей цели, заменив .to(ExchangePattern.InOnly, "direct:sendTestAmq") на multicast().to(ExchangePattern.InOnly, "direct:sendTestAmq", "direct:mock").end().

Поскольку multicast принимает в качестве результата последний обмен маршрутами, «direct: mock» - это маршрут, который ничего не сохраняет, кроме как сохраняет исходный корпус.