我发布了一个问题,关于如何处理来自another thread聚合器的消息组的逻辑,并获得了一些有用的响应,但我无法让逻辑工作,因为我想要它所以我要去退一步,在尝试理解聚合器如何工作时,提出一个更基本的一般性问题。
这是我想要实现的目标。我想将这些消息发送到我的spring集成流程,其中这些消息基本上通过聚合器路由
in.send(MessageBuilder.withPayload("a1").setCorrelationId("1").build());
in.send(MessageBuilder.withPayload("b1").setCorrelationId("1").build());
in.send(MessageBuilder.withPayload("c1").setCorrelationId("1").build());
in.send(MessageBuilder.withPayload("a2").setCorrelationId("2").build());
in.send(MessageBuilder.withPayload("b2").setCorrelationId("2").build());
in.send(MessageBuilder.withPayload("c2").setCorrelationId("2").build());
in.send(MessageBuilder.withPayload("d1").setCorrelationId("1").build());
in.send(MessageBuilder.withPayload("d2").setCorrelationId("2").build());
中的是流的输入通道。正如您所看到的,前3条消息属于组1,接下来3条消息属于组2.现在,当我发送这些消息时,我希望所有这6条消息都被聚合,然后当我发送第7条消息时,它应该释放所有消息在第1组中,应该释放前3条消息和第7条消息,同时仍然将第2组消息保留在聚合器中。最后,我发送第8条消息,该消息应该发布第2组消息。
我的发布政策看起来像这样
public static class DReleasePolicy {
public boolean release(List<String> messages){
boolean release = false;
for(String m : messages){
if(m.startsWith("d")){
release = true;
break;
}
}
return release;
}
}
流程看起来像这样
<int:channel id="in" />
<int:service-activator
id="sa"
input-channel="in"
output-channel="logger"
expression="payload"
/>
<int:logging-channel-adapter
id="logger"
logger-name="com.test"
expression="'incmonig message => ' + payload"
/>
<int:aggregator
id="aggregator"
input-channel="logger"
output-channel="buffered"
release-strategy="releaser"
/>
<int:channel id="buffered" />
<int:splitter
id="splitter"
input-channel="buffered"
output-channel="finallogger"
/>
<int:logging-channel-adapter
id="finallogger"
expression="'released from aggregator => ' + payload"
/>
这就是预期的行为,但在输出中我所看到的是
[20:33:41:676] [main] INFO com.test - incmonig message => a1
[20:33:41:681] [main] INFO com.test - incmonig message => c1
[20:33:41:682] [main] INFO com.test - incmonig message => b2
[20:33:41:683] [main] INFO com.test - incmonig message => d1
[20:33:41:684] [main] INFO com.test - released from aggregator => a2
[20:33:41:685] [main] INFO com.test - released from aggregator => c2
所以基本上a2,b1,c2和d1甚至没有通过,只有第2组的一些消息被释放。如果我打开调试,我会看到所有的消息传递都会通过,但只有这些消息是由聚合器处理的,其他的根本不存在,所以记录信息不多。
我很感激在这里找出问题的任何帮助。
答案 0 :(得分:0)
问题是您有logger
的两个不同订阅者 - 日志记录适配器和聚合器。
当一个点对点通道有多个用户时,这些消息会循环分发给用户,因此聚合器只能获取所有其他消息。
a1
转到记录器,a2
转到聚合器,a3
转到记录器等。
未指定输入频道的频道适配器会订阅与id
匹配的频道。
我没有注意到你在之前的问题中已经这样做了。
如果您想记录通过频道的所有内容,请添加电话线。
或者,将logger
改为<publish-subscribe-channel/>
;这样,订阅者(记录器和聚合器)都将获得所有消息。
正如我在对其他问题/答案的评论中提到的,如果您查看了DEBUG日志记录,您会看到日志记录处理程序和聚合处理程序之间的消息交替出现。
与以往一样,有了这些问题,DEBUG日志记录通常会让事情变得明显。