2016-04-24 3 views
0

Я пытаюсь узнать больше о Apache Camel. Я нашел документацию несколько полезной, но оставляет много догадок для начинающих гонщиков Верблюда, которые не знают, как небольшие сегменты кода должны легко вписываться в полностью функционирующие программы. Надеюсь, большинство людей знает, что я пытаюсь описать. Я был потерян много других раз в некоторых книгах по программированию, где сегменты кода показаны вне контекста полностью запущенной программы.Программа агрегирования

В любом случае, это моя программа, которая по какой-то причине не объединяет сообщения. Я надеялся, что он заполнит все мои сообщения, но эта программа не делает этого. При запуске программы я получаю пустой файл в качестве вывода, который равен , а не моей цели.

package laser.helmet.camel.friend; 

import org.apache.camel.builder.RouteBuilder; 

public class AggregatingMessagesRoute extends RouteBuilder { 

    @Override 
    public void configure() throws Exception { 

     from("direct:start") 
       .aggregate().constant(true) 
       .completionTimeout(100L) 
       .groupExchanges() 
       .to("file:target/this_folder/result?allowNullBody=true"); 
    } 

} 

Тогда я называю эту программу из приведенного ниже класса, который имеет main метод конечно.

package laser.helmet.camel.friend; 

import org.apache.camel.CamelContext; 
import org.apache.camel.impl.DefaultCamelContext; 
import org.apache.camel.ProducerTemplate; 

public class Main { 

    public static void main(String[] args) throws Exception { 
     CamelContext c = new DefaultCamelContext(); 
     c.addRoutes(new AggregatingMessagesRoute()); 
     ProducerTemplate pt = c.createProducerTemplate(); 

     c.start(); 

     pt.sendBody("direct:start", "1"); 
     pt.sendBody("direct:start", "2"); 
     Thread.sleep(5000); 
     c.stop(); 
    } 

} 

Я ожидал, что тело из двух сообщений, которые я создаю с ProducerTemplate быть как в файле после маршрута заканчивается, но это просто пустой файл. Мне пришлось добавить часть маршрута allowNullBody=true, потому что по какой-то причине тело при запуске этой программы имеет значение null.

Также, если вы новичок и задаетесь вопросом. Я ввожу зависимости с Maven вместо того, чтобы помещать camel.jars в свой путь Java classpath.

Спасибо, что прочитали это все. : D

Так как я могу начать агрегировать сообщения Stackoverflow? 0_о

Мир,

user_loser

+0

Если вы проголосовали, пожалуйста, укажите причины. Однако, если вы считаете, что это восходящий сноб не является веской причиной. Спасибо за внимание к этому небольшому комментарию. :) –

+1

Я проголосовал за это, чтобы сбалансировать это для вас, это очень хороший вопрос, и я уверен, что это поможет многим людям в будущем. –

ответ

2

Это легкий один, так как вы предоставили фрагмент кода, хороший один! Удалить .groupExchanges(), поскольку он становится устаревшим и вряд ли подходит. Вам всегда нужна AggregationStrategy, чтобы иметь мелкий контроль над тем, как агрегировать ваши обмены. Итак, добавьте следующий класс:

class StringAggregationStrategy implements AggregationStrategy { 

    public Exchange aggregate(Exchange oldExchange, Exchange newExchange) { 
     if (oldExchange == null) { 
      return newExchange; 
     } 

     String oldBody = oldExchange.getIn().getBody(String.class); 
     String newBody = newExchange.getIn().getBody(String.class); 
     oldExchange.getIn().setBody(oldBody + "+" + newBody); 
     return oldExchange; 
    } 
} 

И затем укажите его в своем маршруте; так что это будет примерно так:

public class AggregatingMessagesRoute extends RouteBuilder { 

    @Override 
    public void configure() throws Exception { 

     from("direct:start") 
       .aggregate().constant(true) 
       .completionTimeout(100L) 
       .aggregationStrategy(new StringAggregationStrategy()) 
       .to("file:target/this_folder/result?allowNullBody=true"); 
    } 

} 

Надеюсь, это поможет!

R.

+0

Awesome. Это действительно работает. Это может помочь предоставить инструкции импорта в исходном коде. Я знаю это, но кто-то еще более noobish, чем я, возможно, так запутался, что они спрыгнули со здания в результате бодрой ярости. Спасибо, Рамин за быструю экспертную помощь. : D :) –

+0

Я очень рад, что это помогло вам! –