我有一个场景,我想将流分成许多交易 . 我正在使用基于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,因为我确实希望在定义的流之间存在一些持久性,以实现稳健性 .
干杯伙计们 .
乔纳斯
1 回答
没有办法按需改变触发器;您可以拥有动态触发器,但更改仅在下次轮询后生效 .
考虑使用出站通道适配器来存储数据和JDBC出站网关(仅使用查询,不使用更新),而不是使用JDBC支持的通道 .
使用pub-sub通道,并在存储后,将消息(可能通过桥接的ExecutorChannel)发送到网关 .
或者,只需将队列通道注入服务并通过
<service-activator/>
调用它 . 您需要一个桥接到您的队列通道的pub-sub通道,第二个订户是服务激活器,当它接收到通道上的消息呼叫receive()
时 .最后,考虑使用JMS或RabbitMQ支持的通道来实现高性能持久性 - 它们比数据库排队要好得多 .