消耗来自通道的给定数量的消息

时间:2015-03-17 13:14:39

标签: spring spring-integration

首先向Artem Bilan提问(我和你以前的同事一起工作)

我有这样的流程:

  • JdbcPollingChannelAdapter 用于获取数据集ASAP(因为DB是流程中的瓶颈)
  • CHAIN_OF_TRANSFORMATORS (由于业务需求)
  • ServiceActivator ,用于使用JmsTemplate
  • 发送JMS

根据要求,我必须在每个静态期间发送不同数量的消息(它由一些具有“10,20,100 ...”结构的“配置文件”提供,意味着“在第一分钟发送10条消息,在第二分钟发送20条消息” ,第三分钟100 msg ......“)。 实施期间非常简单,由PeriodicPoller提供。

问题是要求的第一部分。使用JdbcPollingChannelAdapter实现SqlParameterSource获得给定数量的表行的情况,但不符合上述“瓶颈”原因。是否可以“从频道获取N条消息”?

我尝试在适配器旁边的通道上使用一些ReleaseStrategy来实现它,但没有运气将其与定期轮询相结合。如果有人帮助我,我将详细描述使用的方法。

与使用Java DSL描述集成流上下文相关的其他困难,同时大部分示例都使用XML。

感谢您的任何建议!

1 个答案:

答案 0 :(得分:2)

在与Dmitrii私下讨论后,我们提出了这个解决方案。

<强>要求

  • 读取特定数量的消息并将它们逐个发送到JMS队列
  • 每个轮询间隔更改邮件数量
  • 发送消息并将其金额与特定轮询任务所需的金额进行比较。如果它们不相等则产生错误报告,则没有足够的消息进行轮询。

<强>解决方案

  1. 收集QueueChannel
  2. 中的邮件
  3. 在每次投票中更改端点maxMessagesPerPoll
  4. <poller>PollerMetadata)有adviceChain选项。
  5. 我们可以提供一些自定义AdviceMethodInterceptor
  6. PollingConsumer
  7. 之前注意我们的maxMessagesPerPoll更改invocation.proceed()
  8. 使用一些AtomicInteger bean来增加ChannelInterceptor#preSend中的resetAdvice
  9. 此外,您可以在该建议中检查先前的投票状态,将maxMessagesPerPoll与计数器进行比较。