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&amp;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&amp;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).

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