【问题标题】:Access synchronization from failed Camel Exchange从失败的 Camel Exchange 访问同步
【发布时间】:2012-06-08 07:19:26
【问题描述】:

我想访问在骆驼路线期间添加到交换中的所有同步。

这样做的原因是,当发生特定类型的异常时,我想将消息路由到错误处理组件,并让该错误处理组件执行这些同步的“onCompletion”,即使发生异常也是如此。

通过使用添加同步

exchange.getUnitofWork().addSynchronization(new MySyncAdapter());

我试图用

访问它们
exchange.handoverCompletions();

但是,我认为我一定做错了什么,因为无论我尝试从哪个组件(我的真实组件或错误组件)获取完成,列表都是空的。

编辑:

根据他在下面的回答,这应该可行:

exchange.addOnCompletion(new MySyncAdapter());
List<Synchronization> syncs = exchange.handoverCompletions();

但是,syncs 仍然为空。有什么建议吗?

【问题讨论】:

    标签: java activemq apache-camel


    【解决方案1】:

    在这种情况下,Exchange 没有 Completions/Synchronizations,当您调用 exchange.handoverCompletions() 时,UnitOfWork 实例会这样做,您将得到一个空值。您也无权访问 UnitOfWork 中的同步,因为它是在不同的线程中处理的。任何修改它们的尝试,这就是 handoverCompletion 所做的,都会导致并发异常。

    实际上,您正试图以非预期的方式使用某些东西。应通过调用 Exception Clause DSL 概述 here 来处理交换错误。它旨在通过允许开发人员定义异常类型并将 Exchange 转发到路由以供错误处理组件进一步处理,从而以细粒度的方式捕获交换错误。

    最好的问候, 斯科特 ES

    【讨论】:

    • 我也试过这个。我在编辑中添加了示例。同步仍然为空
    • 你用的是什么版本?我刚刚针对主干编写了一个简单的单元测试,它按预期通过了。
    • 我们在这里使用的是 2.6。我环顾四周,并尝试使用骆驼源进行调试。看来只有当我将交易所的工作单元设置为空时,它才会按照您建议的方式工作。应该是这样吗?还有其他副作用吗?
    • 让我先深入挖掘一下。这听起来不正确。
    • 好的。只是你也知道,我想我无论如何都必须坚持使用 UnitOfWork。看起来如果我有多个处理器,并且我在每个处理器中添加同步到交换,ex​​change.handoverCompletions() 只会给我来自那个处理器的那些,而不是来自之前运行的处理器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多