如何使用camel聚合将一条消息聚合成多个组?

时间:2013-11-05 12:59:55

标签: 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),....

有任何建议我们如何使用aggregator2或者我们需要为此编写处理器?

2 个答案:

答案 0 :(得分:1)

你是对的,aggregator2组件是最好的方法。我会尝试这样的事情:

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...

有关详细信息: here是Claus Ibsen在使用Camel解析大型文件时写的一篇文章

答案 1 :(得分:1)

在阅读了Aggregator的源代码之后,事实证明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);

}