【问题标题】:Synchronize Exchange copies in Apache Camel在 Apache Camel 中同步 Exchange 副本
【发布时间】:2012-05-22 01:09:51
【问题描述】:

根据 Apache Camel 中 onCompletion() 事件的文档,此处使用了交换的副本,并且处理在单独的线程中运行。显然,在使用 EventNotifierSupport 时也是如此,因为我在处理器中设置了一些交换属性,然后我有一个类似于

的方法
public void notify(EventObject event) throws Exception {

    if (event instanceof ExchangeCompletedEvent) {
    //..get exchange properties and print them using event.getExchange()
    }
}

看来我在处理器中设置的属性在此“已完成事件”中不可用,就像我在 DSL 中使用 onComplete() 时它们不可用一样。

如何合并到交换的明显副本,以便我可以可靠地获取在路由的其他处理器中设置/修改的属性?

谢谢

德里克

【问题讨论】:

    标签: java activemq apache-camel


    【解决方案1】:

    实际上,在参与交换的处理器中添加的属性在这两个回调中都可用,即在 onCompletion()EventNotifierSupport#notify() 中。

    可以通过在CamelContext 上注册以下EventNotifierSupport 回调来重现演示此行为的最小示例。

    // Create listener
    EventNotifierSupport eventNotifierSupport = new EventNotifierSupport(){
    
      @Override
      public void notify(EventObject event) throws Exception {
        if (event instanceof ExchangeCompletedEvent) {
          assert ((ExchangeCompletedEvent) event).getExchange().getProperties().containsKey("ADDED");
        }
      }
    
    ...
    
    }
    
    // Register listener in CamelContext
    CamelContext camelContext = new DefaultCamelContext();
    camelContext.getManagementStrategy().addEventNotifier(eventNotifierSupport);
    

    如果您使用 processor 创建一个路由,该路由将属性设置为发送给它的消息...

    camelContext.addRoutes(new RouteBuilder() {
    
      @Override
      public void configure() throws Exception {
        from("direct:start").process(new Processor() {
          @Override
          public void process(Exchange exchange) throws Exception {
            exchange.getProperties().put("ADDED","ADDED");
          }
        });
      }
    
    });
    camelContext.start();
    camelContext.createProducerTemplate().sendBody("direct:start", "addPropertyToMe");
    

    ...您将看到侦听器中的断言总是通过。这与 Camel 文档一致,该文档说交换的副本将在 交易完成(即交换已被修改)后发送给侦听器。

    你的问题出在其他地方。如果您提供一个在处理器中设置属性但在回调中丢失的情况的最小示例,我会为您提供帮助。

    【讨论】:

    • 抱歉,我没有尽快回复您 - 只是注意到我有答案。你能告诉我你用的是什么版本的骆驼吗?我似乎无法得到您所看到的相同行为。谢谢
    • 嗨,德里克。我正在使用 Camel 2.9.2。
    猜你喜欢
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多