首页 文章

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

提问于
浏览
1

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

  • 1

    没有办法按需改变触发器;您可以拥有动态触发器,但更改仅在下次轮询后生效 .

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

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

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

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

相关问题