如何启用从文件使用者到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();

如果你想确保只收到一次信息,也可以看看"不后悔"。https://camel.apache.org/manual/latest/idempotentConsumer-eip.html

最新更新