Программа агрегации
Я пытаюсь узнать больше об 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");
}
}
Надеюсь это поможет!
Р.