次のキャメルルートがあります:
<route id="myRoute">
<from uri="direct:aggregator" />
<aggregate strategy="aggregatorStrategy" completionInterval="60000" completionSize="500">
<correlationExpression>
<xpath>/fizz/buzz</xpath>
</correlationExpression>
<to uri="bean:postProcessor?method=run" />
</aggregator>
</route>
ご覧のとおり、 が<aggregator/>
受信した最初の 500 メッセージ、または 1 分間隔内のすべてのメッセージを集約し、集約したメッセージを という Bean に送信しますpostProcessor
。
この集計ロジックは、次のように考えることができます。
AGGREGATE UNTIL:
We have received 500 messages
OR
1 minute has elapsed
THEN:
Send to postProcessor
または疑似コードで: aggregateUntil(weHave500Message() || 1minHasElapsed())
. このロジックを次のように変更したいと思います。
AGGREGATE UNTIL:
We have received 500 messages
OR
1 minute has elapsed
OR
A message is received that has a property called "fireNow" and a value of "true"
THEN:
Send to postProcessor
または、再び疑似コードで: aggregateUntil(weHave500Message() || 1minHasElapsed() || messageHasProperty("fireNow", "true"))
.
つまり、3 つの条件のいずれかが満たされるまで集計します。これを実装する方法はありますか?私はおそらく とでこれを仕上げることができると感じていますが、ここの木を通して森を見ることはできません.completionPredicate
eagerCheckCompletion