2014-06-10 2 views
0

몇 가지 메시지를 수집하고 (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> 

aggreagator :

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); 
    } 
} 

필수 단지 POJO이다.

문제는 집계 메소드가 호출되지 않는다는 것입니다. 집계 기가 없으면 메시지는 문제없이 서비스 활성기로 전달됩니다. 봄 통합 3.0.2.RELEASE (봄 부팅 1.0.2.RELEASE)를 사용하여

편집 : 변경 correlation-strategy-expression="headers['id']"correlation-strategy-expression="payload.id"에 그것은 내가 (모든 청크에 대해 서로 다른 ID를 통과 할 때 작동합니다 (필수 객체는 속성 ID를 가지고) 첫 번째 10은 id = 1, 다음 10은 2 ...) 이것이 상관 관계 분석의 작동 방식입니다. 나는 그것을 어떻게 넘어 설 수 있습니까? 난 단지 집계 된 목록의 크기를 제한하고 싶다.

답변

3

오른쪽; 당신은 무언가에 상관 관계를 가져야합니다. 헤더 [ 'id']를 사용하면 릴리스 전략을 결코 충족시키지 못하는 1 개의 항목 그룹이 많이 생성됩니다.

간단한 사용 사례의 경우 리터럴을 연결하십시오. correlation-expression="'foo'"이고 expire-groups-on-completion="true"으로 설정하십시오. 그러면 릴리스 다음에 그룹이 재설정되므로 새 ID (상관 ID가 동일한)가 다음 메시지에서 시작할 수 있습니다.

일부 시간 초과 후 부분 그룹을 해제하려면 MessageGroupStoreReaper이 필요합니다. 또는 4.0.x로 업그레이드 할 수있는 경우 집계자가 이제 group-timeout (또는 group-timeout-expression)이됩니다.

관련 문제