私は、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
に受信されるだけReleaseStrategy
のcanRelease()
方法をトリガします。 1分以上経過したすべてのグループを出力チャネルにリダイレクトしたい。 私の質問は、 - XML定義のようなポーラーをプログラムで追加する方法はありますか?
@artemによれば、ポーラーは完了とは何の関係もありません(チャンネルからメッセージを受け取り、グループが完了するのを除いて)。これは 'group-timeout'によって行われます。 'groupTimeoutExpression'(SpEL式)を設定して、グループを非同期にタイムアウトさせることができます。 '新しいSpelExpressionParser()。parseExpression(" 60000 ")'。 –
ありがとう、それはまさに私が望んだことでした。 –