如何启用从文件使用者到JMS生产者的骆驼交易?

时间:2019-11-19 16:48:38

标签: apache-camel

我有一条路线可以选择一个文件,将其拆分为单独的记录,然后将这些记录发布到JMS主题中。

from("ftp:..."
    .unmarshal(bindy)
    .split(body())
    .marshal(jaxb)
    .to("activemq:topic:myTopic");

这一直很好,直到最近ActiveMQ出奇的错误,它成功处理了文件中的前几条消息,然后给出了一些奇怪的异常。这导致使用者认为交换失败,因此没有将文件存档,然后重新处理它。这次成功了,但这意味着已经处理的记录已经重复。

我一直在阅读有关通过JMS和Camel使用事务的信息,但是我不明白如何将事务拆分后的所有记录都包含进去,因此如果出现问题,则保留文件,但之前对该主题的所有“成功”发布都会被忽略。

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

据我所知,.transacted()指令适用于消费者而不是生产者,而且据我了解,基于文件的组件也不会被处理。

如何确保每个消耗的文件都将“全部或全部”发布到主题?

感谢您的光临!

1 个答案:

答案 0 :(得分:0)

使用.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

相关问题