我有一个场景,我想将流分成许多交易。我正在使用基于JdbcChannelMessageStore的队列通道来实现这一点并且效果非常好。它的强大,它只是工作。但是因为这些基于Jdbc的队列(数据库)是由执行程序轮询的,所以我对吞吐量有一个自然的限制(我真的不想将轮询器配置为每1毫秒轮询一次)。所以我的问题是,是否有一种方法让队列通道通知该通道的消费者新消息已经排队,然后触发“轮询器”以查看数据库以查看必须消耗的内容?
所以简单的场景: 1.有人发送消息的队列通道 2.一个服务激活器,它将处理该消息(并行)
<int:channel id="InputChannel">
<int:queue message-store="jdbcChannelStore"/>
</int:channel>
<task:executor id="TradeTransformerExecutor" pool-size="2-20" queue-capacity="20" rejection-policy="CALLER_RUNS"/>
<int:service-activator id="TradeConverter" input-channel="InputChannel" output-channel="TradeChannel" method="transform">
<beans:bean class="com.service.TradeConverter"/>
<int:poller task-executor="TradeTransformerExecutor" max-messages-per-poll="-1" receive-timeout="0" fixed-rate="100">
<int:transactional transaction-manager="dbTransactionManager"/>
</int:poller>
</int:service-activator>
<int:channel id="TradeChannel"></int:channel>
那么我怎么能让这个InputChannel通知轮询器(或其他东西)立即开始执行消息而不是等待100ms? 此外,我不想使用DirectChannels,因为我确实希望在定义的流之间存在一些持久性,以实现稳健性。
干杯队员。
纳斯
答案 0 :(得分:1)
根据需要无法改变触发器;您可以拥有动态触发器,但更改仅在下次轮询后生效。
请考虑使用出站通道适配器来存储数据和JDBC出站网关(仅使用查询,不进行更新),而不是使用支持JDBC的通道。
使用pub-sub频道,并在存储后,将消息(可能通过桥接的ExecutorChannel)发送到网关。
或者,只需将队列通道注入服务并通过<service-activator/>
调用它。您需要一个桥接到您的队列通道的pub-sub通道,第二个订户是服务激活器,当它在通道上收到消息receive()
时。
最后,考虑使用JMS或RabbitMQ支持的通道来实现高性能持久性 - 它们比数据库排队要好得多。