仅在消息数量达到计数或消息在通道中一段时间​​后才从通道消费

时间:2016-04-27 07:27:25

标签: spring spring-integration spring-xd

我有一个自定义接收器模块,只有当消息数量达到计数或者它们在某个时间段内在通道中时,我才会使用来自input的消息。简而言之,我想大力推动。

我尝试在消费并将消息存储到SimpleMessageStore支持的聚合频道后汇总消息数量,并MessageGroupStoreReaper检查频道中的消息。

我对这种方法不满意,因为我正在使用消息并将它们存储在内存存储中,我也知道JDBC存储,但我不想将此方法作为消息Spring XD中的频道由redis / mq支持我希望根据我的条件从input频道使用。

我当前的bean配置如下所示:

<int:aggregator id="messageAggregator" ref="messageAggregatorBean"
    method="aggregate" input-channel="input" output-channel="aggregatorOutputChannel"
    release-strategy="messageReleaseStrategyBean" release-strategy-method="canRelease"
    send-partial-result-on-expiry="true" message-store="resultMessageStore">
</int:aggregator>

<int:service-activator id="contributionIndexerService"
    ref="contributionIndexerBean" method="bulkIndex" input-channel="aggregatorOutChannel" />

<bean id="resultMessageStore"
    class="org.springframework.integration.store.SimpleMessageStore" />

<bean id="resultMessageStoreReaper"
    class="org.springframework.integration.store.MessageGroupStoreReaper">
    <property name="messageGroupStore" ref="resultMessageStore" />
    <property name="timeout" value="60000" />
</bean>

<task:scheduled-tasks>
    <task:scheduled ref="resultMessageStoreReaper" method="run"
        fixed-rate="10000" />
</task:scheduled-tasks>

有任何想法或意见吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

我不确定您是否能够确定Broker队列中的消息数(Redis / RabbitMQ,甚至只是普通的JMS),而不是确定它们在那里的数量。

你绝对应该消费来做这样的逻辑。

是的,我认为Aggregator可以帮到你。但是对:那必须是Persistent Message Store

案例

  

如果他们从某个时间开始进入频道

Aggregator建议使用group-timeout选项来发布那些尚未达到releaseStrategy条件的群组,但无论如何你想要发出它们过了一段时间:http://docs.spring.io/spring-integration/reference/html/messaging-routing-chapter.html#agg-and-group-to