Apache camel 如何启用从文件使用者到JMS生产者的camel事务?

Apache camel 如何启用从文件使用者到JMS生产者的camel事务?,apache-camel,Apache Camel,我有一个路由,它拾取一个文件,将其拆分为单独的记录,并将这些记录发布到JMS主题 from("ftp:..." .unmarshal(bindy) .split(body()) .marshal(jaxb) .to("activemq:topic:myTopic"); 这一直运行良好,直到最近ActiveMQ出现了一些奇怪的错误,它成功地处理了文件中的前几条消息,然后出现了一些奇怪的异常。这导致使用者认为exchange失败,因此没有存档文件,然后重新处理它。这

我有一个路由,它拾取一个文件,将其拆分为单独的记录,并将这些记录发布到JMS主题

from("ftp:..."
    .unmarshal(bindy)
    .split(body())
    .marshal(jaxb)
    .to("activemq:topic:myTopic");
这一直运行良好,直到最近ActiveMQ出现了一些奇怪的错误,它成功地处理了文件中的前几条消息,然后出现了一些奇怪的异常。这导致使用者认为exchange失败,因此没有存档文件,然后重新处理它。这一次它成功了,但这意味着已经处理过的记录被重复了

我一直在阅读有关使用JMS和Camel事务的内容,但我不明白如何让它包含拆分为事务后生成的所有记录,这样,如果出现问题,文件将被保留,但以前对该主题的任何“成功”帖子都将被忽略

这是否需要为拆分器启用共享工作单元

就我所见,
.transact()
指令适用于使用者而不是生产者,据我所知,基于文件的组件无论如何都不会进行事务处理

我如何确保为每个使用的文件在主题中发布“要么全部,要么什么都没有”的消息

谢谢你的关注

使用
.transact()
应该可以解决您的问题,因为发送到ActiveMQ队列的消息将一起提交或回滚

是的,为了确保发送到ActiveMQ的消息在同一事务中处理,您需要为拆分启用
shareUnitOfWork()

为了便于阅读,我个人也会缩进并结束拆分

可能是这样的:

from("ftp:..."
    .transacted()
    .unmarshal(bindy)
    .split(body()).shareUnitOfWork()
        .marshal(jaxb)
        .to("activemq:topic:myTopic")
    .end();
如果您想确保消息只接收一次,还可以查看“Indemptence”。