【问题标题】:Programmatically adding context-scoped onCompletion() to Camel Context以编程方式将上下文范围的 onCompletion() 添加到 Camel Context
【发布时间】:2019-01-12 03:53:31
【问题描述】:

有没有办法将 onCompletion 上下文范围的“处理程序”添加到 Camel 上下文? Camel onCompletion documentation 展示了如何使用 Spring XML DSL 进行操作,但我无法找到以编程方式进行操作的方法。

【问题讨论】:

    标签: java apache-camel


    【解决方案1】:
    // define a global on completion that is invoked when the exchange is complete
    onCompletion().to("log:global").to("mock:sync");
    

    【讨论】:

    • 我试过这个没有运气:camelContext.addRoutes(new RouteBuilder() { @Override public void configure() throws Exception { onCompletion().to("log:com.company.project.insights. log.output?level=INFO"); } });我的日志中从未显示任何消息。显然,我使用单独的 camelContext#addRoutes 调用添加了其他路由,这些调用使用单独的 RouteBuilder 实现。
    • 确保您在要将此行为添加到的同一 RouteBuilder 中添加 onCompletion()...
    • 由于我当前的设计,我使用单独的 RouteBuilder 实现和 CamelContext#addRoutes 调用向 Camel Context 添加多个路由。当我尝试在这些 RouteBuilder#configure() 方法之一中添加 onCompletion() 时,它被添加到那里正在构建的路由中。
    • 理论上,您应该可以使用 includeRoutes(RouteBuilder) 将它们全部放在同一个 RouteBuilder 中以重用 onCompletion() 然后...
    【解决方案2】:

    因为 onComplete 只能是 RouteBuilder 范围。创建一个真正的全局 onComplete 处理器

    // Initialize an instance of the definition
    OnCompletionDefinition globalOnComplete = new OnCompletionDefinition();
    globalOnComplete.to("log:onComplete");
    

    在您的RouteBuilder 实现中,在定义任何路由之前,将上面的实例添加到定义中

    @Override
    public void configure() throws Exception {
        // Add onCompletion instance for all routes within this RouteBuilder
        this.getRouteCollection()
                .getOnCompletions()
                 .add(globalOnComplete);
    
    
        // Route definition
        from("direct:input").to("log:output");        
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      • 2017-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多