Apache Camel: сплиттер, CBR или динамический маршрутизатор?
У меня есть следующие POJO:
public class MyPOJO {
private Fizz fizz;
private Buzz buzz;
// ctor, getters, setters, etc.
}
И следующий маршрут (Spring XML):
<route id="myroute">
<from uri="timer://runOnce?repeatCount=1&delay=10" />
<to uri="bean:myPOJOFactory?method=newMyPOJO" />
<!-- Not sure what to do here -->
<!-- MyPOJO#Fizz should get routed to direct:fizzFarm. -->
<!-- MyPOJO#Buzz should get routed to direct:buzzFarm. -->
</route>
куда myPOJOFactory
является:
public class MyPOJOFactory {
public MyPOJO newMyPOJO(Exchange exchange) {
Fizz fizz = new Fizz(true, 3);
Buzz buzz = new Buzz("awesome");
MyPOJO pojo = new MyPOJO(fizz, buzz);
exchange.getOut().setBody(pojo);
}
}
Мне нужен способ теперь разделить MyPOJO
экземпляр (создается внутри myPOJOFactory
боб) в его состав Fizz
а также Buzz
свойства и маршрут Fizz
в одну сторону, и Buzz
по-другому.
Я понимаю, что Splitter просто берет тело обмена и разбивает его на коллекцию из 2+ объектов. Но я не думаю, что это то, что я хочу, потому что, хотя я хочу MyPOJO
"расколоться" на составляющую Fizz
а также Buzz
поля, я хочу, чтобы они направлялись в разные пункты назначения. возможно Fizz
идет к direct:fizzFarm
а также Buzz
идет к direct:buzzFarm
,
Мое понимание контентно-ориентированного маршрутизатора (<choice/>
), что позволяет добавить условие if-else-if
логика в маршрут. Но я не думаю, что хочу этого, потому что то, что мне нужно, не является условным: я всегда хочу MyPOJO#Fizz
идти direct:fizzFarm
и я всегда хочу MyPOJO#Buzz
идти direct:buzzFarm
,
Мое понимание динамического маршрутизатора заключается в том, что он будет динамически маршрутизировать сообщения в разные пункты назначения, хотя я пока не совсем уверен, как это сделать. Я считаю, что это то, что я хочу, однако, выход из myPOJOFactory
боб, обмен будет содержать MyPOJO
объект. Я чувствую, что должен сначала разделить MyPOJO
до отправки его в динамический маршрутизатор. Таким образом, динамический маршрутизатор сможет четко видеть, является ли сообщение Fizz
или Buzz
и правильно проложить маршрут.
Поэтому я считаю, что мне нужно использовать сплиттер в сочетании с динамическим маршрутизатором. Я просто не вижу леса сквозь деревья. Что-то вроде этого:
<route id="myroute">
<from uri="timer://runOnce?repeatCount=1&delay=10" />
<to uri="bean:myPOJOFactory?method=newMyPOJO" />
<split>
<tokenize token="Somehow split MyPOJO into Fizz and Buzz here" />
<to uri="direct:dynrouter" />
</split>
<from uri="direct:dynrouter" />
<dynamicRouter>
<!-- ??? Somehow route Fizz to direct:fizzFarm, and Buzz to direct:buzzFarm
</dynamicRouter>
</route>
Любые идеи относительно того, как я могу сделать это (расщепление #1 MyPOJO
в Fizz
а также Buzz
и #2 настройка маршрутизатора для маршрутизации Fizz
а также Buzz
в разные направления)?
1 ответ
Вы правы, поскольку логика всегда одинакова, маршрутизаторы могут быть излишними.
Разделители чаще всего используются с объектами одного типа (например, разделение списка и обработка каждого элемента отдельно)
Так что я могу предложить Multicast EIP, что-то вроде этого должно работать:
from("timer://runOnce?repeatCount=1&delay=10")
.bean(myPOJOFactory.class)
.multicast().to("direct:sendFizz", "direct:sendBuzz")
from("direct:sendFizz")
.setBody(simple("${body.fizz"))
.to("direct:fizzFarm")
from("direct:sendBuzz")
.setBody(simple("${body.buzz"))
.to("direct:buzzFarm")
(Это, очевидно, синтаксис DSL, вы также можете попробовать его в XML).