2016-11-22 4 views
0

私は、Springブートを使用していて、私のプロジェクトですべてのファイルXMLを取り除いています。 残念なことに、Spring統合も私の経験からは非常に重くXMLベースです。Spring統合投票アグリゲータをプログラム的に

私はアグリゲータを必要とするシナリオを持っており、そのアグリゲータは毎秒x秒の間にポーリングされます。

これには、(前のSO質問から撮影した例)のようなXMLを使用して行うことができます:私はちょっとみかんトリックを行うクラスを見つけることができたし、それがBean定義です

<!-- 
    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分以上経過したすべてのグループを出力チャネルにリダイレクトしたい。 私の質問は、 - XML定義のようなポーラーをプログラムで追加する方法はありますか?

答えて

1

Javaの場合&注釈設定hereおよびhereをご覧ください。

AggregatorコンポーネントのJava設定が容易になるようにAggregatorFactoryBeanです。

とにかく、@ServiceActivator注釈とそのハンドラ定義に@Beanという注釈があることに注意する必要があります。正確に@ServiceActivatorにはpollerという属性があります。

また、Spring Integration用にJava DSLがあることに注意してください。

あなたの質問の別の部分はちょっと混乱しています。 pollerは完全にリリース戦略に関連していません。この場合、PollableChannelからメッセージを受信する責任は、logEntryChannelです。その後、すでにポーリングされたメッセージは、その相関関係と解放ロジックのためにアグリゲーターに送られます。

このサンプルで行われていることは、完全に異なるストーリーであり、別のSOスレッドで議論することができます。

+1

@artemによれば、ポーラーは完了とは何の関係もありません(チャンネルからメッセージを受け取り、グループが完了するのを除いて)。これは 'group-timeout'によって行われます。 'groupTimeoutExpression'(SpEL式)を設定して、グループを非同期にタイムアウトさせることができます。 '新しいSpelExpressionParser()。parseExpression(" 60000 ")'。 –

+0

ありがとう、それはまさに私が望んだことでした。 –

関連する問題