Вариант использования: я получаю сообщение от конечной точки источника. В зависимости от типа сообщения оно обрабатывается совершенно другой бизнес-логикой (например, HTTP-запрос, tcp-сообщение, вызов db). После этого результат и передается в нисходящем направлении (предполагается единый стандарт для выходного сообщения)
Маршрут будет выглядеть примерно так:
from(_source_)
...
// handle data (this is dynamic)
...
process(_logger_)
to(_receiver_)
Прямое решение будет использовать выбор ():
... // Upstream
.choice()
.when(someCondition).process(sendHTTP)
.when(anotherCondition).process(getToken).process(sendTCP)
.otherwise().process(sendToDB)
... // Downstream
Но это не очень масштабируемо.
Другим решением было бы просто поместить все в один процессор, который, в свою очередь, вызывает клиента с полиморфным поведением:
... // Upstream
.process(messageSwitch)
... // Downstream
public class MessageSwitch implements Processor {
public void process(Exchange ex) {
RequestClient client = this.resolveClient(ex);
client.sendRequest(ex.getIn());
}
}
Однако это также заставляет нас упускать из виду маршрут. В этом случае мой вопрос заключается в том, является ли обычной практикой выполнение нового маршрута, который происходит внутри процессора. Например, я могу захотеть выполнить вызов http через библиотеку http4 (http://camel.apache.org/http4.html).
А может, я неправильно подхожу к этой проблеме.