Java 如何使用camel aggregate将一封邮件聚合到多个组中?

Java 如何使用camel aggregate将一封邮件聚合到多个组中?,java,spring,apache,apache-camel,spring-dsl,Java,Spring,Apache,Apache Camel,Spring Dsl,我试图生成连续市场数据的聚合视图,这意味着我们需要计算每2条消息的总和。将输入的数据表示为: (V0,T0),(V1,T1),(V2,T2),(V3,T3).... V表示接收数据时的值T表示时间戳 我们需要为每2个点生成总和,例如: (R1=Sum(V0,V1),T1),(R2=Sum(V1,V2),T2),(R3=Sum(V2,V3),T3),.... 有没有建议我们如何使用聚合器2来实现这一点,或者我们需要为此编写一个处理器 你说得对,组件是个好方法。我想试试这样的东西: from("

我试图生成连续市场数据的聚合视图,这意味着我们需要计算每2条消息的总和。将输入的数据表示为:

(V0,T0),(V1,T1),(V2,T2),(V3,T3)....
V
表示接收数据时的值
T
表示时间戳

我们需要为每2个点生成总和,例如:

(R1=Sum(V0,V1),T1),(R2=Sum(V1,V2),T2),(R3=Sum(V2,V3),T3),....
有没有建议我们如何使用聚合器2来实现这一点,或者我们需要为此编写一个处理器

你说得对,组件是个好方法。我想试试这样的东西:

from("somewhere").split(body().tokenize("),")).streaming()
    .aggregate(new ValueAggregationStrategy()).completionTimeout(1500)
    .to("whatYouWant");

class ValueAggregationStrategy 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(extractValue(oldBody) + extractValue(newBody));
        return oldExchange;
    }

    public int extractValue(String body) {
        // Do the work "(V0,T0" -> "V0"
    }
}
NB:如果您可以使用这样的格式,那么解析就更容易了:
V0,T0;V1,T1…


更多信息:是克劳斯·易卜生(Claus Ibsen)写的一篇关于用Camel解析大文件的文章

在阅读了聚合器的源代码后,发现Camel只将一条消息聚合到一个组,为此我们必须构建一个“聚合器”。代码如下:

public abstract class GroupingGenerator<I> implements Processor {
private final EvictingQueue<I> queue;
private final int size;

public int getSize() {
    return size;
}

public GroupingGenerator(int size) {
    super();
    this.size = size;
    this.queue = EvictingQueue.create(size);
}

@SuppressWarnings("unchecked")
@Override
public void process(Exchange exchange) throws Exception {
    queue.offer((I) exchange.getIn().getBody());
    if (queue.size() != size) {
        exchange.setProperty(Exchange.ROUTE_STOP, true);
        return;
    } else {
        processGroup(queue, exchange);
    }
}

protected abstract void processGroup(Collection<I> items, Exchange exchange);

}
公共抽象类GroupingGenerator实现处理器{
私有最终逐出队列;
私人最终整数大小;
公共int getSize(){
返回大小;
}
公共分组生成器(整数大小){
超级();
这个。大小=大小;
this.queue=execisingqueue.create(大小);
}
@抑制警告(“未选中”)
@凌驾
公共作废进程(Exchange)引发异常{
queue.offer((I)exchange.getIn().getBody());
if(queue.size()!=size){
exchange.setProperty(exchange.ROUTE_STOP,true);
返回;
}否则{
processGroup(队列、交换);
}
}
受保护的抽象无效处理组(收集项、交换);
}

我相信在使用
aggregate()
方法之后,您需要使用
completionSize()
completionTimeout()
等方法告诉camel聚合消息何时准备就绪。感谢您的回复,可能是我没有说清楚,实际上输入数据是一个CSV文件,我已经将其流解析为一个POJO对象,其中包含数据作为字段,我们需要在每个连续的“n”记录上生成聚合结果(总和,平均值)(在本例中,完整的大小可能更适合:P),这导致(VX,TX)必须根据文档聚合到多个连续组(X,X+1,…,X+n-1),似乎我们需要提供一个相关id,它只将(VX,TX)放在一个组中(比如使用X作为corID)。还有其他建议吗?