Программа агрегации

Я пытаюсь узнать больше об Apache Camel. Я нашел документацию несколько полезной, но у начинающих гонщиков 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 к маршруту, потому что по какой-то причине тело является нулевым при запуске этой программы.

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

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

Итак, как я могу начать агрегирование сообщений Stackru? 0_о

Мир,

user_loser

1 ответ

Решение

Это легко, так как вы предоставили фрагмент кода, хороший! Удалите.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");
    }

}

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

Р.

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