Динамическая маршрутизация с верблюдом не пересылать сообщения
Я работаю над менеджером динамической маршрутизации в 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. И ваш пример не делает это как жестко заданное значение назначения.