【发布时间】:2019-05-09 05:39:27
【问题描述】:
我从事的任务需要:
- 使用来自 JMS 的数据;
- 处理它;
- 将其加载到数据库中。
- 我从
<int-jms:message-driven-channel-adapter channel="CHANNEL1" ... />开始向CHANNEL1频道发送新的JMS消息; - 我应用了the transformer,它将消息从
CHANNEL1通道转换为JobLaunchRequest,其作业将数据插入数据库和包含原始JMS消息有效负载的有效负载; - 转换后的消息进入
CHANNEL2频道; -
<batch-int:job-launching-gateway request-channel="CHANNEL2"/>在频道中出现新消息时开始执行新作业;
问题是每次收到新的jms消息时我都会启动一个新的数据库事务。
问题:我应该如何处理这样的流程?常见的模式是什么?
更新
我为每条消息开始工作。一条消息包含一条数据。如果我只使用spring-batch,那么我将不得不管理某种轮询器(如果我错了,请纠正我),但我想应用一种消息驱动的方法,比如(任何一个):
- 宽限期:当出现新消息时,我会等待
10更多消息,或者在收到第一条消息几秒后开始处理我收到的所有消息10。 - 在收到队列包含新消息的通知后,我只是阅读了
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