如何从聚合器中释放组

时间:2014-04-30 00:39:55

标签: spring-integration

我发布了一个问题,关于如何处理来自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组的一些消息被释放。如果我打开调试,我会看到所有的消息传递都会通过,但只有这些消息是由聚合器处理的,其他的根本不存在,所以记录信息不多。

我很感激在这里找出问题的任何帮助。

1 个答案:

答案 0 :(得分:0)

问题是您有logger的两个不同订阅者 - 日志记录适配器和聚合器。

当一个点对点通道有多个用户时,这些消息会循环分发给用户,因此聚合器只能获取所有其他消息。

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

未指定输入频道的频道适配器会订阅与id匹配的频道。

我没有注意到你在之前的问题中已经这样做了。

如果您想记录通过频道的所有内容,请添加电话线。

或者,将logger改为<publish-subscribe-channel/>;这样,订阅者(记录器和聚合器)都将获得所有消息。

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

与以往一样,有了这些问题,DEBUG日志记录通常会让事情变得明显。