2016-04-29 3 views
0

Я пытаюсь запустить простую программу повторной последовательности, используя Apache Camel. Эта программа использует DSL для повторной последовательности входящих сообщений Java. Когда я запускаю эту программу, сообщения записываются в папку, но не отображаются в каком-либо конкретном порядке на основе значения заголовка или алфавитного порядка единственного слова в теле сообщения. Файлы, созданные Camel, все еще не работают, как если бы функция DSL resequence ничего не делала.Apache Camel Resequence Program Не работает

Как я могу получить эту программу для фактического заказа сообщений, как метод Arrays.sort()? Кроме того, как я могу заставить эту программу выполнить повторение, а затем агрегировать сообщения в правильном порядке сортировки в один файл?

Вот программа ... Я называю основной маршрут верблюда другим классом, который имеет метод main.

import org.apache.camel.builder.RouteBuilder; 

public class SortThoseMessages extends RouteBuilder { 

    @Override 
    public void configure() throws Exception { 

     from("direct:pointA") 
       .resequence(header("grocery")) 

       .to("file:target/pointB"); 
    } 

} 

Класс ниже имеет main и производит сообщения в очереди, точке А.

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

public class NewSequenceMain { 

    public static void main(String[] args) { 
     CamelContext c = new DefaultCamelContext(); 

     try { 

     c.addRoutes(new SortThoseMessages()); 



     ProducerTemplate template = c.createProducerTemplate(); 

     c.start(); 

     template.sendBodyAndHeader("direct:pointA", "apple", "grocery", 1); 
     template.sendBodyAndHeader("direct:pointA", "orange", "grocery", 3); 
     template.sendBodyAndHeader("direct:pointA", "bannanna", "grocery", 2); 

     Thread.sleep(5000); 
     c.stop(); 

     } catch(Exception ex) { 
      System.err.println("Exception thrown -> " + ex); 
      System.err.println("Now printing stacktrace..."); 
      ex.printStackTrace(); 
     } 

    } 

} 
+0

Что вы подразумеваете под "файлы не в порядке"? Являются ли временные метки файлов некорректными, так что ovbvious не происходит сортировка? Возможно, вы можете добавить регистратор в корневой каталог до и после resequence(), чтобы увидеть порядок сообщений. – Frank

+0

Привет @Frank, когда я говорю, что они не в порядке, я имею в виду, что файлы, созданные Camel, находятся в порядке того, как сообщения были созданы с помощью ProducerTemplate. Файлы заканчиваются цифрами - 1 для сообщения apple, 3 для оранжевого сообщения и 5 для сообщения о банане. Возможно, было бы полезно использовать когда-нибудь журнал, как вы описываете. Спасибо за помощь Фрэнка. :) Это сбивает с толку ... –

+0

@Frank После добавления в журнал DS в DSL, как вы предположили, я вижу, что, возможно, в соответствии с панибрами в заголовке, что сообщения были упорядочены или отсортированы в алфавитном порядке. Я попытаюсь проверить его, объединив все тела сообщений в один файл, чтобы сортировка была более очевидной. : D –

ответ

0

Сообщения могут быть перегруппированы внутри маршрута Camel, но не при записи в файл. Чтобы увидеть повторный вызов, вызовите aggregator Java DSL, чтобы увидеть тела сообщений в указанном порядке последовательности. Сообщения в опубликованной программе упорядочены в соответствии с номером заголовка. Вызов метода на ссылке ProducerTemplate задает заголовок как целое число в последнем аргументе для вызова метода sendBodyAndHeader().

Чтобы увидеть тейк эффект повторного секвенирования в одном файле в качестве конечного пункта маршрута Camel, пожалуйста, проверьте приведенный ниже пример:

import org.apache.camel.builder.RouteBuilder; 


public class ReorganizingMessages extends RouteBuilder { 

    @Override 
    public void configure() throws Exception { 

     from("direct:pointA") 
       .resequence(header("grocery")) 
       .to("log://org.apache.camel.howto?showAll=true&multiline=true") 

       .aggregate().constant(true).completionTimeout(100L). 
       aggregationStrategy(new StringAggregator()) 
       .to("file:target/pointB"); 
    } 

} 

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

import org.apache.camel.Exchange; 
import org.apache.camel.processor.aggregate.AggregationStrategy; 

public class StringAggregator implements AggregationStrategy { 

    @Override 
    public Exchange aggregate(Exchange old, Exchange new1) { 
     if (old == null) { 
      return new1; 
     } 

     String oldBody = old.getIn().getBody(String.class); 
     String newBody = new1.getIn().getBody(String.class); 
     old.getIn().setBody(oldBody + " " + newBody); 
     return old; 

    } 

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