すぐに使用できるものは何もありませんが、SimpleMessageStore
. RollingMessageStore
Gistに全文を掲載しました。
removeGroup
肝心なのは、グループ全体ではなく、最初のメッセージのみを削除するように変更することです。また、completeGroup
何もしないでください。
expreGroupOnCompletion
アグリゲーターがグループを強制的に「削除」するように設定します (変更されたremoveGroup()
メソッドを呼び出します。
SimpleMessageGroup
との違いは次のとおりRollingMessageGroup
です...
182,184c190,194
<
< groupUpperBound.release(groupIdToMessageGroup.get(groupId).size());
< groupIdToMessageGroup.remove(groupId);
---
> Message<?> message = this.groupIdToMessageGroup.get(groupId).getOne();
> if (message != null) {
> this.groupUpperBound.release(1);
> this.removeMessageFromGroup(groupId, message);
> }
(さらに、 内のすべてのコードを削除しますcompleteGroup()
。
そしてテストケース...
@Test
public void testRolling() {
AggregatingMessageHandler aggregator = new AggregatingMessageHandler(new MultiplyingProcessor(), new RollingMessageStore());
aggregator.setExpireGroupsUponCompletion(true);
aggregator.setReleaseStrategy(new ReleaseStrategy() {
@Override
public boolean canRelease(MessageGroup group) {
return group.size() == 3;
}
});
QueueChannel replyChannel = new QueueChannel();
Message<?> message1 = createMessage(3, "ABC", 3, 1, replyChannel, null);
Message<?> message2 = createMessage(5, "ABC", 3, 2, replyChannel, null);
Message<?> message3 = createMessage(7, "ABC", 3, 3, replyChannel, null);
Message<?> message4 = createMessage(9, "ABC", 3, 3, replyChannel, null);
Message<?> message5 = createMessage(11, "ABC", 3, 3, replyChannel, null);
aggregator.handleMessage(message1);
aggregator.handleMessage(message2);
aggregator.handleMessage(message3);
aggregator.handleMessage(message4);
aggregator.handleMessage(message5);
Message<?> reply = replyChannel.receive(10000);
assertNotNull(reply);
assertEquals(reply.getPayload(), 105);
reply = replyChannel.receive(10000);
assertNotNull(reply);
assertEquals(reply.getPayload(), 315);
reply = replyChannel.receive(10000);
assertNotNull(reply);
assertEquals(reply.getPayload(), 693);
}
先に進んでJIRA の新機能の問題を開いてください。今後の 3.0 リリースにこれ (またはより一般的な解決策) を追加することを検討します。
使用correlation-strategy-expression="'foo'"
して
release-strategy-expression=size()==3
.