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

Я работаю над менеджером динамической маршрутизации в Camel на основе веб-сервиса и jms-очереди. У меня есть следующая архитектура:

endpoint:cxf -> jms:queue -> dynamic routing to a jms:queue -> processing

Вот мое определение маршрута:

@Override
public void configure() throws Exception {
    routeDefinition = from(fromEndpoint).routeId(name)
            .dynamicRouter(method(DynamicRoutingManager.class, "getRoute")).process(exchange -> {
                final List<?> soaList = exchange.getIn().getBody(List.class);
                final String type = (String) soaList.get(0);
                final String documentNumber = (String) soaList.get(1);
                final String productionStepNumber = (String) soaList.get(2);
                final String message = (String) soaList.get(3);

                final String messageToSend = "Route ID=" + name + ", from=" + fromEndpoint + ", type=" + type
                        + ", document number=" + documentNumber + ", production step number" + productionStepNumber
                        + ", message=" + message;
                LOG.debug("==> message={}", messageToSend);
                exchange.getOut().setBody(messageToSend);
            }); // .to(DLQ);
}

и вот мой динамический диспетчер маршрутизации (я упрощаю):

public String getRoute(String body, @Header(Exchange.SLIP_ENDPOINT) String previous) {
    LOG.debug("========> BODY={}", body);
    return "jms:topic:urgent_doc1_prod1";
}

маршрут jms:topic:urgent_doc1_prod1 определяется во время выполнения и работает (просмотр в журналах)

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

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:hel="http://cxf.apache.org/wsse/handler/helloworld">
   <soapenv:Header/>
   <soapenv:Body>
      <hel:message>
         <!--Optional:-->
         <type>urgent</type>
         <!--Optional:-->
         <document_number>1</document_number>
         <!--Optional:-->
         <production_step_number>1</production_step_number>
         <!--Optional:-->
         <message>un message</message>
      </hel:message>
   </soapenv:Body>
</soapenv:Envelope>

Потому что я думаю, что мое сообщение не пересылается во вторую очередь jms:, поэтому можно выполнить любую обработку...

Что я делаю не так?

2 ответа

На самом деле, это было заблуждение от меня. Я не объявлял маршрут "от" независимо после динамической маршрутизации, так что не было никакого потребителя, поэтому таймаут.

@Override
public void configure() throws Exception {
    from(fromEndpoint).routeId(name + "a").recipientList(method(DynamicRoutingManager.class, "getRoute"));

    from(toEndpoint).routeId(name + "b").process(exchange -> {

        final List<?> soaList = exchange.getIn().getBody(List.class);
        final String type = (String) soaList.get(0);
        final Integer documentNumber = (Integer) soaList.get(1);
        final Integer productionStepNumber = (Integer) soaList.get(2);
        final String message = (String) soaList.get(3);

        final String messageToSend = "Route ID=" + name + ", from=" + fromEndpoint + ", type=" + type
                + ", document number=" + documentNumber + ", production step number" + productionStepNumber
                + ", message=" + message;

        LOG.debug("==> message={}", messageToSend);
        exchange.getOut().setBody(messageToSend);
    });
}

сделать это работает.

Использование recipientList или же toD если вы хотите направить сообщение в один динамический пункт назначения - см. этот FAQ: http://camel.apache.org/how-to-use-a-dynamic-uri-in-to.html

Динамический маршрутизатор похож на while loop он продолжает маршрутизацию до тех пор, пока вы не скажете ему остановиться на пустом / нулевом месте назначения. Смотрите документы в верхней части: http://camel.apache.org/dynamic-router.html. И ваш пример не делает это как жестко заданное значение назначения.

Другие вопросы по тегам