2014-11-12 2 views
0

Предположим, у меня есть маршрут следующим образомПерехватив Обмен в Camel

from("direct:A") 
    .process(new ProcessA()) 
    .setHeader(Exchange.HTTP_METHOD, "get") 
    .recipientList(simple(httpUri + header("doc_id")), "false") 
    .process(new ProcessB()) 
    .to("direct:B"); 

В приведенном выше пути httpUri = "http4: // локальный: 25600". Теперь я пытаюсь перехватить сообщение следующим образом.

context.getRouteDefinitions().get(0).adviceWith(context, new AdviceWithRouteBuilder() { 
    @Override 
    public void configure() throws Exception { 
     interceptSendToEndpoint("http4*") 
     .skipSendToOriginalEndpoint() 
     .process(new Processor() { 
      @Override 
      public void process(Exchange exchange) throws Exception { 
       //TODO         
      } 
     }); 
    } 
}); 

Проблема здесь заключается в том, что обмен не перехватываются и контекст на самом деле пытается сделать связь с httpUri хозяин даже есть skipSendToOriginalEndpoint.

Пожалуйста, дайте мне знать, если что-то не так в коде. Заранее спасибо.

+0

Я предполагаю, что это в контексте единичного теста, расширяющего 'CamelTestSupport', правильно? – Ray

+0

да Рэй, ты прав. –

ответ

0

Используется динамический маршрут, что означает, что конечная точка не известна во время определения. В результате вы не сможете перехватить на основе конечной точки http.

Вместо этого я бы заменил весь список получателей, а не только адрес назначения, называемый получателем.

Как простой способ сделать это с помощью weaveByType. Для того, чтобы сплести в процессоре, это будет выглядеть так:

weaveByType(RecipientListDefinition.class).replace().process(...) 

Как всегда с adviceWith, убедитесь, что для реализации isUseAdviceWith вернуться true, и затем вызвать context.start() после advicing в routeDefinition.

+0

Спасибо Рей. Это сработало –