2013-12-19 4 views
0

У меня есть следующий POJO:Apache Camel: Splitter, CBR или Dynamic Router?

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.

Мой понимание из Content-Based Router (<choice/>) является то, что она позволяет добавить условие if-else-if логики в маршрут. Но я не думаю, что я хочу, это либо потому, что мне нужно, это не условное: Я всегда хочу MyPOJO#Fizz идти к direct:fizzFarm, и я всегда хочу MyPOJO#Buzz пойти в direct:buzzFarm.

Dynamic Router - это то, что он будет динамически маршрутизировать сообщения в разные пункты назначения, хотя пока не совсем уверен. I считаю, что это то, что я хочу, однако, исходя из боба 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 различным направлениям)? Заранее спасибо!

ответ

3

Вы правы, поскольку логика всегда одна и та же, маршрутизаторы могут быть излишними.

Разветвители чаще всего используются с объектами того же типа (например,разделив список и обработки каждого элемента отдельно)

Так может я предлагаю 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)

Упование вы считаете это полезным.

+0

Удивительный ответ, отличный совет! Это было легко преобразовать в Spring XML, еще раз спасибо! – IAmYourFaja

+0

Приветствую вас! – vikingsteve

 Смежные вопросы

  • Нет связанных вопросов^_^