【问题标题】:How enable a camel transaction from File consumer to JMS producer?如何启用从文件消费者到 JMS 生产者的骆驼交易?
【发布时间】:2019-11-19 16:48:38
【问题描述】:

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

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

这一直很好,直到最近 ActiveMQ 出现了一些奇怪的错误,它成功地处理了文件中的前几条消息,然后给出了一些奇怪的异常。这导致消费者假设交换失败,因此不归档文件,然后重新处理它。这次成功了,但这意味着已经处理过的记录被重复了。

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

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

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

我如何确保我得到一个“全有或全无”被发布到每个使用的文件的主题?

感谢收看!

【问题讨论】:

    标签: apache-camel


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2013-05-23
      • 2017-07-13
      • 2011-09-12
      • 2018-03-07
      • 1970-01-01
      • 2012-05-18
      • 1970-01-01
      • 2013-06-03
      • 2015-08-27
      相关资源
      最近更新 更多