2016-11-22 3 views
0

저는 스프링 부트를 사용하여 프로젝트에서 모든 XML 파일을 없앴습니다. 불행히도 내 경험에 의하면 매우 통합 된 Spring 통합을 사용합니다. XML 기반입니다.스프링 통합 투표 수집기 프로그래밍 방식으로

필자에게 애그리 게이터가 있어야하고, x 초마다 해당 애그리 게이터를 폴링하는 시나리오가 있습니다.

이 그렇게 (이전 SO 질문에서 가져온 예) 같은 XML을 사용하여 수행 할 수 있습니다 : 나는 좀 그렇다고 트릭을 수행하는 클래스를 찾을 관리했습니다 그것은 빈 정의의

<!-- 
    the poller will process 100 messages every minute 
    if the size of the group is 100 (the poll reached the max messages) or 60 seconds time out (poll has less than 100 messages) then the payload with the list of messages is passed to defined output channel 
--> 
<int:aggregator input-channel="logEntryChannel" output-channel="logEntryAggrChannel" 
    send-partial-result-on-expiry="true" 
    group-timeout="60000" 
    correlation-strategy-expression="T(Thread).currentThread().id" 
    release-strategy-expression="size() == 100"> 
    <int:poller max-messages-per-poll="100" fixed-rate="60000"/> 
</int:aggregator> 

은 다음과 같습니다

@Bean(name = "aggregatingMessageHandler") 
public AggregatingMessageHandler aggregatingMessageHandler() { 

    AggregatingMessageHandler aggregatingMessageHandler = 
      new AggregatingMessageHandler(messageGroupProcessorBean(), 
        new SimpleMessageStore(10)); 

aggregatingMessageHandler.setCorrelationStrategy(customCorrelationStrategyBean()); 

    aggregatingMessageHandler.setReleaseStrategy(
      new TimeoutCountSequenceSizeReleaseStrategy(3, 
        TimeoutCountSequenceSizeReleaseStrategy.DEFAULT_TIMEOUT)); 

    aggregatingMessageHandler.setExpireGroupsUponCompletion(true); 

    aggregatingMessageHandler.setOutputChannel(outputAggregatedChannelBean()); 

    return aggregatingMessageHandler; 
} 

그러나 이는 새로운 메시지가 아닌 원하는 결과가 아닌 일정 시간 간격으로,이 핸들러와 관련된 inboundChannel에서 수신 만 ReleaseStrategycanRelease() 방법을 트리거한다. 1 분보다 오래된 모든 그룹을 출력 채널로 리디렉션하려고합니다. 제 질문은 - 프로그래밍 방식으로 폴러 (poller)를 XML 정의에 첨부하는 방법이 있습니까?

답변

1

Java 용 & 주석 구성 herehere을 살펴보십시오.

Aggregator 구성 요소는 Java 구성을 쉽게하기 위해 AggregatorFactoryBean입니다.

어쨌든 @ServiceActivator 주석과 함께 해당 핸들러 정의에 @Bean이 있다는 점에 유의해야합니다. 그리고 정확히 @ServiceActivator에는 poller 속성이 있습니다.

또한 스프링 통합을 위해 Java DSL이 있다는 점에 유의하십시오.

질문의 또 다른 부분은 약간 혼동입니다. poller은 완전히 릴리스 전략과 관련이 없습니다. 이 경우 PollableChannel에서 메시지를 수신해야하는 책임은 logEntryChannel입니다. 그 후에 만 ​​이미 폴링 된 메시지가 상관 관계 및 릴리스 논리에 대한 집계기에 배치됩니다.

샘플에서 수행되는 작업은 완전히 다른 이야기이며 별도의 SO 스레드에서 논의 할 수 있습니다.

+1

@artem이 말했듯이 폴러는 완료와 아무런 관련이 없습니다 (채널에서 메시지를 받고 그룹이 완료 될 때를 제외하고). 이것은'group-timeout'에 의해 이루어진다. 그룹을 비동기 적으로 타임 아웃 시키려면'groupTimeoutExpression' (SpEL 표현식)을 설정할 수 있습니다. '새로운 SpelExpressionParser(). parseExpression ("60000")'. –

+0

고마워, 그게 내가 원하는거야. –

관련 문제