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

Spring integration 没有轮询器的基于Jdbc的队列通道。可能的,spring-integration,Spring Integration,我有一个场景,在这个场景中,我希望将流程分离为多个事务。我使用基于JdbcChannelMessageStore的队列通道来实现这一点,这非常有效。它很健壮,而且能正常工作。但由于这些基于Jdbc的队列(数据库)是由执行者轮询的,因此吞吐量自然会受到限制(我并不想将轮询器配置为每1毫秒轮询一次)。所以我的问题是,队列通道是否有一种方法可以通知该通道的使用者一条新消息已经排队,然后触发“轮询器”查看数据库,查看需要消耗的内容 因此,简单的情况是: 1.某人放置消息的队列通道 2.将(并行)处理该消

我有一个场景,在这个场景中,我希望将流程分离为多个事务。我使用基于JdbcChannelMessageStore的队列通道来实现这一点,这非常有效。它很健壮,而且能正常工作。但由于这些基于Jdbc的队列(数据库)是由执行者轮询的,因此吞吐量自然会受到限制(我并不想将轮询器配置为每1毫秒轮询一次)。所以我的问题是,队列通道是否有一种方法可以通知该通道的使用者一条新消息已经排队,然后触发“轮询器”查看数据库,查看需要消耗的内容

因此,简单的情况是: 1.某人放置消息的队列通道 2.将(并行)处理该消息的服务激活器


那么,我怎样才能让这个InputChannel通知轮询器(或其他东西)立即开始执行消息,而不是等待100毫秒呢? 此外,我不想使用DirectChannel,因为出于健壮性原因,我确实希望在定义的流之间有一些持久性

干杯,伙计们


乔纳斯

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

<>而不是使用一个JDBC支持的通道,考虑使用一个出站通道适配器来存储数据和一个JDBC出站网关(只是查询,没有更新)。 使用发布子通道,并在存储后将消息(可能通过桥接执行器通道)发送到网关

或者,只需将您的队列通道注入服务并通过
调用它即可。您需要一个连接到队列通道的发布子通道,第二个订阅者是服务激活器,当它接收到通道上的消息调用
receive()


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

谢谢加里。我试试看。将来我可能会用一个实际的JMS代理来替换jdbc。但我只是认为可能已经有了一些东西,因为我假设索赔检查模式必须执行类似的操作(存储到数据库,然后向消费者发送“票据”)。但有一件事我不明白你的选择。如何创建队列通道而不为其定义轮询器?因为如果我理解正确,recieve()将由服务激活器中的bean调用,而不会由其他人调用?正确;您将不轮询队列,而是按需调用
receive()
on-demand(可能是在执行器通道下游的新线程上),服务激活器的输入消息将被丢弃,输出消息将是您从通道接收的消息。
<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>