基于Jdbc的队列通道没有轮询器。可能?

时间:2014-05-27 11:47:33

标签: spring-integration

我有一个场景,我想将流分成许多交易。我正在使用基于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 个答案:

答案 0 :(得分:1)

根据需要无法改变触发器;您可以拥有动态触发器,但更改仅在下次轮询后生效。

请考虑使用出站通道适配器来存储数据和JDBC出站网关(仅使用查询,不进行更新),而不是使用支持JDBC的通道。

使用pub-sub频道,并在存储后,将消息(可能通过桥接的ExecutorChannel)发送到网关。

或者,只需将队列通道注入服务并通过<service-activator/>调用它。您需要一个桥接到您的队列通道的pub-sub通道,第二个订户是服务激活器,当它在通道上收到消息receive()时。

最后,考虑使用JMS或RabbitMQ支持的通道来实现高性能持久性 - 它们比数据库排队要好得多。