【问题标题】:Spring Batch Integration: Increase throughput when consuming data from jmsSpring Batch Integration:使用来自 jms 的数据时增加吞吐量
【发布时间】:2019-05-09 05:39:27
【问题描述】:

我从事的任务需要:

  1. 使用来自 JMS 的数据;
  2. 处理它;
  3. 将其加载到数据库中。

作为the documentation suggests:

  1. 我从<int-jms:message-driven-channel-adapter channel="CHANNEL1" ... /> 开始向CHANNEL1 频道发送新的JMS 消息;
  2. 我应用了the transformer,它将消息从CHANNEL1 通道转换为JobLaunchRequest,其作业将数据插入数据库和包含原始JMS 消息有效负载的有效负载;
  3. 转换后的消息进入CHANNEL2 频道;
  4. <batch-int:job-launching-gateway request-channel="CHANNEL2"/> 在频道中出现新消息时开始执行新作业;

问题是每次收到新的jms消息时我都会启动一个新的数据库事务。

问题:我应该如何处理这样的流程?常见的模式是什么?

更新

我为每条消息开始工作。一条消息包含一条数据。如果我只使用spring-batch,那么我将不得不管理某种轮询器(如果我错了,请纠正我),但我想应用一种消息驱动的方法,比如(任何一个):

  1. 宽限期:当出现新消息时,我会等待10 更多消息,或者在收到第一条消息几秒后开始处理我收到的所有消息10
  2. 在收到队列包含新消息的通知后,我只是阅读了 JMS 队列中包含的所有内容。

当然,我希望解决方案是跨国的:消息处理的顺序无关紧要。

【问题讨论】:

  • 如果我理解正确,您为每条消息运行一个作业,对吗?消息的有效负载是什么?是一条消息=要插入数据库的一项,还是一条消息可以包含多个项?这对于解决方案的设计很重要,因为您可能有一个从 JMS 队列中读取项目并将它们插入数据库的作业。
  • @MahmoudBenHassine,我更新了帖子,请检查。
  • I start the job for each message. One message contains one piece of data.:这意味着您将为每个项目分配一份工作,这不再是批处理,对我来说使用 Spring Batch 没有意义。由于消息是一个项目,我建议使用从队列中读取消息并将它们处理/写入数据库的单个作业。对于事务,需要使用 Jta 事务管理器来协调 DB 和队列之间的事务(在回滚的情况下,消息回到队列中)。
  • 是的,你明白我的意思:我知道当我为一条消息运行一项工作时,这不再是 Spring Batch,我不喜欢它。我还将 Spring Batch 用于其他内容,例如重试。您如何建议使用作业阅读消息?它将成为基于轮询器的解决方案吗?我希望有一个消息驱动的。
  • 对消息驱动的阅读器没有希望。面向块的步骤在事务中执行。如果读者是一个监听器,这意味着我们开始一个事务,然后等待消息到达,处理它并等待下一条消息,处理它等等,直到形成一个块,然后我们写入数据并提交事务.如果一整天没有消息到达会发生什么?交易是否应该保持开放这么长时间?你看到问题了吗?这就是为什么读者在拉数据,JmsItemReader 也不例外,它从队列中读取数据直到超时。

标签: spring design-patterns spring-integration spring-batch


【解决方案1】:

BatchMessageListenerContainer 可用于您的用例。它支持在单个事务中批量处理消息。

注意这个类不是主框架的一部分,它实际上是一个测试类,但如果它适合你的需要,你可以使用它。

希望这会有所帮助。

【讨论】:

  • 感谢您的回答,但我决定放弃使用spring-integration 的想法,因为不清楚如何通过作业参数将一堆jms 消息传递给作业。我的poller-based 解决方案似乎已经足够好了。
  • @Mahmoud Ben Hassine,我了解 BatchMessageListenerContainer 在单个线程中接收多条消息。但我不明白这些消息是如何传递给 MessageListener 的。你能检查一下设置超时的帖子吗?stackoverflow.com/questions/55750449/…
猜你喜欢
  • 1970-01-01
  • 2012-07-05
  • 1970-01-01
  • 2017-09-06
  • 2019-06-14
  • 1970-01-01
  • 2017-03-25
  • 2020-10-13
  • 1970-01-01
相关资源
最近更新 更多