2015-04-14 2 views
2

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

@Component 
public class CamelRouter extends SpringRouteBuilder { 
    @Override 
    public void configure() { 
     from("rabbitmq://localhost/test-in?autoAck=false&autoDelete=false&durable=true&exchangeType=fanout&queue=test-in&username=guest&password=xxx") 
     .log(LoggingLevel.ERROR, "Output of message from Queue: ${in.body}") 
     .to("rabbitmq://localhost/test-out?autoAck=false&autoDelete=false&durable=true&exchangeType=fanout&queue=test-out&username=guest&password=xxx"); 
    } 
} 

Бревна следующие:

09:04:18.564 [thread] WARN route1          - Output of message from Queue: test 
09:04:18.700 [thread] WARN route1          - Output of message from Queue: test 
09:04:18.835 [thread] WARN route1          - Output of message from Queue: test 
09:04:18.968 [thread] WARN route1          - Output of message from Queue: test 
09:04:19.104 [thread] WARN route1          - Output of message from Queue: test 
09:04:19.238 [thread] WARN route1          - Output of message from Queue: test 

Что плохого в такой конфигурации верблюд? По-моему, это как можно проще.

+0

Какую версию верблюда вы используете? –

+0

Версия 2.15.1 –

ответ

1

Вместо того, чтобы удалять заголовки, лучше использовать исходящее сообщение на бирже, как показано ниже. В этом конкретном примере префикс rabbitmq, вероятно, одобрен, однако, если вы попробуете этот подход с другими компонентами (imap - отличный пример), он не будет работать по разным странным причинам.

from("rabbitmq://localhost/test-in?autoAck=false&autoDelete=false&durable=true&exchangeType=fanout&queue=test-in&username=guest&password=xxx") 
     .log(LoggingLevel.ERROR, "Output of message from Queue: ${in.body}") 
     .process(new Processor() { 

      @Override 
      public void process(Exchange exchange) throws Exception { 
       exchange.getOut().setBody(exchange.getIn().getBody());     
      } 
     }) 
     .to("rabbitmq://localhost/test-out?autoAck=false&autoDelete=false&durable=true&exchangeType=fanout&queue=test-out&username=guest&password=xxx"); 
0

Пожалуйста, попробуйте следующее:

@Component 
public class CamelRouter extends SpringRouteBuilder { 
    @Override 
    public void configure() { 
     from("rabbitmq://localhost/test-in?autoAck=false&autoDelete=false&durable=true&exchangeType=fanout&queue=test-in&username=guest&password=xxx") 
     .removeHeaders("rabbitmq.*") 
     .log(LoggingLevel.ERROR, "Output of message from Queue: ${in.body}") 
     .to("rabbitmq://localhost/test-out?autoAck=false&autoDelete=false&durable=true&exchangeType=fanout&queue=test-out&username=guest&password=xxx"); 
    } 
} 

Camel поддерживает переопределение некоторые настройки, как очереди из заголовка сообщения (и RabbitMQ компонент делает это), так что мы должны удалить их, чтобы избежать отправки сообщения обратно исходной очереди. Полный список заголовков rabitmq можно найти there. Я думаю, что заголовок «rabbitmq.REPLY_TO» является проблематичным.

+0

Это помогло. Но не могли бы вы объяснить, почему это необходимо? –

+0

См. Мою последнюю редакцию – cslysy

+0

Удаление заголовков может быть сопряжено со всякими болезненными ошибками. Лучше всего использовать это сообщение, я добавлю еще один ответ – stringy05

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