Java Spring集成聚合器-丢失消息

Java Spring集成聚合器-丢失消息,java,spring,spring-integration,Java,Spring,Spring Integration,我想收集一些消息,比如10,并将它们作为列表传递给服务激活器,而不是逐个传递 背景: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=...> <int:channel id="ch.http.in"/> <int:channel id="ch.http.trans"/> <int:channel id="ch.http.aggr"/> <i

我想收集一些消息,比如10,并将它们作为列表传递给服务激活器,而不是逐个传递

背景:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns=...>

    <int:channel id="ch.http.in"/>
    <int:channel id="ch.http.trans"/>
    <int:channel id="ch.http.aggr"/>
    <int-http:inbound-channel-adapter path="test" channel="ch.http.in"/>

    <int:map-to-object-transformer input-channel="ch.http.in" output-channel="ch.http.trans" type="demo.Req"/>
    <int:aggregator 
        input-channel="ch.http.trans" 
        output-channel="ch.http.aggr"
        release-strategy-expression="size() == 10"
        correlation-strategy-expression="headers['id']"
        ref="aggr" method="add"/>
    <int:service-activator ref="srv" method="httpTest" input-channel="ch.http.aggr"/>

    <bean id="srv" class="demo.IntService"/>
    <bean id="aggr" class="demo.HttpAggregator"/>
</beans>
Req只是一个POJO

问题是聚合器方法从未被调用。如果没有aggregator,消息将毫无问题地传递给服务激活器。 使用Spring Integration 3.0.2.释放弹簧护套1.0.2.释放

编辑:
当我将correlation strategy expression=headers['id']更改为correlation strategy expression=payload.idReq对象具有属性id时,当我为每个Chunk传递不同的id时,它会工作例如。对于前10个,id=1;2下一个10。。。看来这就是关联策略的工作原理。我怎样才能通过呢?我只想限制聚合列表的大小。

对;你必须在某些事情上相互关联;使用标题['id']将得到大量的一组项目,这些项目永远不会满足发布策略

对于像您这样的简单用例,在文本上进行关联-例如,关联表达式='foo'并将expiregroupsoncompletion=true。这将在发布后重置组,以便在下一条消息中可以启动具有相同关联id的新组


如果要在超时后释放部分组,则需要MessageGroupStoreReaper。或者,如果可以升级到4.0.x,聚合器现在有一个组超时或组超时表达式。

对;你必须在某些事情上相互关联;使用标题['id']将得到大量的一组项目,这些项目永远不会满足发布策略

对于像您这样的简单用例,在文本上进行关联-例如,关联表达式='foo'并将expiregroupsoncompletion=true。这将在发布后重置组,以便在下一条消息中可以启动具有相同关联id的新组

如果要在超时后释放部分组,则需要MessageGroupStoreReaper。或者,如果可以升级到4.0.x,聚合器现在有一个组超时或组超时表达式

public class HttpAggregator{
    public List<Req> add(List<Req> reqs) {
        System.out.println(reqs);
        return reqs;
      }
}
public class IntService {
    public void httpTest(Req msg){
        System.out.println(msg);
    }
}