Spring integration 如何从聚合器中释放组

Spring integration 如何从聚合器中释放组,spring-integration,Spring Integration,我在中发布了一个关于如何处理从聚合器中发布消息组的逻辑的问题,并得到了一些有用的回答,但我无法使逻辑按我所希望的那样工作,因此我将退后一步,在试图理解聚合器如何工作时问一个更基本的一般性问题 以下是我正在努力实现的目标。我想将这些消息发送到我的spring集成流,这些消息基本上通过聚合器路由 in.send(MessageBuilder.withPayload("a1").setCorrelationId("1").build()); in.send(MessageBuilder.withPay

我在中发布了一个关于如何处理从聚合器中发布消息组的逻辑的问题,并得到了一些有用的回答,但我无法使逻辑按我所希望的那样工作,因此我将退后一步,在试图理解聚合器如何工作时问一个更基本的一般性问题

以下是我正在努力实现的目标。我想将这些消息发送到我的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());
in是流的输入通道。如您所见,前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;
    }
}
所以基本上a2、b1、c2和d1都没有通过,只有第二组的一些信息被发布了。如果我打开调试,我会看到所有消息都通过了,但只有这些被记录的消息是聚合器处理的消息,而其他消息则不是,因此日志信息不多


如果您能帮我找出这个问题,我将不胜感激。

问题在于您有两个不同的记录器订户—日志适配器和聚合器

当一个点对点通道有多个订户时,消息会循环分发给订户,因此聚合器只会获取其他每一条消息

a1转到记录器,a2转到聚合器,a3转到记录器,等等

不指定输入通道的通道适配器将订阅与id匹配的通道

我没有注意到你在先前的问题中这样做

如果要记录通过通道的所有内容,请添加导线抽头

或者,改为使用记录器;这样,订阅服务器记录器和聚合器都将获得所有消息

正如我在对另一个问题/答案的评论中提到的,如果您查看了调试日志记录,您会看到日志处理程序和聚合处理程序之间交替出现的消息


与以往一样,对于此类问题,调试日志记录通常会使发生的事情变得显而易见。

是的,即使使用日志记录也很难弄清楚这一点:谢谢
<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