簡體   English   中英

如何使用駱駝聚合將一條消息聚合到多個組中?

[英]How to aggregate one message into multiple group with camel aggregate?

我正在嘗試生成連續市場數據的匯總視圖,這意味着我們需要每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做到這一點,或者我們需要為此編寫一個處理器嗎?

沒錯, 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"
    }
}

注意:如果您有這樣的格式,則解析起來會更容易: V0,T0;V1,T1...

有關更多信息: 是克勞斯·易卜生(Claus Ibsen)撰寫的有關使用駱駝解析大文件的文章

閱讀了Aggregator的源代碼后,事實證明駱駝只能將一個消息聚合到一組,為此我們必須構建一個“聚合器”。 這是代碼:

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);

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM