apache-camel - 如何启用从文件消费者到 JMS 生产者的骆驼交易?
问题描述
我有一条路线,它可以拾取文件,将其拆分为单独的记录,然后将这些记录发布到 JMS 主题。
from("ftp:..."
.unmarshal(bindy)
.split(body())
.marshal(jaxb)
.to("activemq:topic:myTopic");
这一直运行良好,直到最近 ActiveMQ 出现了一些奇怪的问题,它成功地处理了文件中的前几条消息,然后给出了一些奇怪的异常。这导致消费者假设交换失败,因此没有归档文件,然后重新处理它。这一次成功了,但这意味着已经处理过的记录被重复了。
我一直在阅读有关将事务与 JMS 和 Camel 一起使用的信息,但我不明白如何让它包含拆分为事务后生成的所有记录,这样如果出现问题,文件就会留下,但任何以前对该主题的“成功”帖子将被忽略。
这是否需要为拆分器启用共享工作单元?
据我所知,该.transacted()
指令适用于消费者而不是生产者,据我所知,基于文件的组件无论如何都不会被处理。
我如何确保我得到一个“全有或全无”被发布到每个消耗的文件的主题?
感谢您的关注!
解决方案
使用.transacted()
应该可以解决您的问题,因为发送到 ActiveMQ 队列的消息将一起提交或回滚。
是的,为了确保发送到 ActiveMQ 的消息在同一个事务中处理,您需要启用shareUnitOfWork()
拆分。
为了便于阅读,我个人也会缩进并结束拆分。
也许是这样的:
from("ftp:..."
.transacted()
.unmarshal(bindy)
.split(body()).shareUnitOfWork()
.marshal(jaxb)
.to("activemq:topic:myTopic")
.end();
如果您想确保只收到一次消息,还可以查看“indempotence”。 https://camel.apache.org/manual/latest/idempotentConsumer-eip.html
推荐阅读
- powershell - Powershell读取csv文件,重新格式化成多行,写入csv文件
- python - 定义和使用自己的函数
- javascript - javascript代码未在python + selenium中运行
- reactjs - SetState 没有改变状态值
- r - 在一个数据集中查找与 R 中另一个数据集中的坐标缓冲区匹配的坐标
- python - 在 Python 中使用 .CSV 中的列附加空列表
- machine-learning - 如何在 SimpleImputer 中选择策略
- reactjs - React 无法从返回中访问变量
- git - 如何从私有远程存储库中删除旧的 git 条目?
- django - 如何使 django 上传的图像显示在 CloudFront 前端 + Beanstalk 后端