【问题标题】:Camel: getting current route's exchange without specfying exchange as parameterCamel:获取当前路由交换而不指定交换作为参数
【发布时间】:2015-03-14 18:01:31
【问题描述】:

当我使用 Camel 时,几乎我编写的每个方法都有 Exchange 作为参数,以便通过自动绑定获取当前的交换。

类似的东西:

class MyClass
{
    void doSomething(Exchange exchange, ........)
    {
        exchange.getIn().....

        .......
    }
}

有没有办法在不将其指定为参数的情况下获取当前交换?

也许是这样的......?

class MyClass
{
    @ExchangeAware
    Exchange exchange;

    void doSomething(........)
    {
        exchange.getIn().....

        .......
    }
}

更新

我实际上并没有考虑使用@ExchangeAware 天真地注入一些(哪个?:))特定的交换,但更多的是作为向框架发出信号以拦截对该字段的任何访问的一种方式。此时,框架应该使用如果它必须绑定一个交换参数(而不是使用当前的交换引用(可能为空))会使用的交换。

但是为什么不让它变得更简单呢。这样做怎么样:

class MyClass
{
    @ExchangeAware
    Exchange getExchange() {return null;}

    void doSomething(........)
    {
        getExchange().getIn().....

        .......
    }
}

框架可以用返回当前交换的方法覆盖@ExchangeAware 方法。

【问题讨论】:

    标签: java spring dependency-injection apache-camel


    【解决方案1】:

    不,这是不可能的。这也可能不是一个好主意,因为 MyClass 不再是线程安全的。如果路由 2 个并发 Exchange 并调用同一个 MyClass 实例怎么办?然后注入的@ExchangeAware 将是最后注入的任何可能干扰线程的东西。

    最好保持你的 pojo 线程安全并作为参数的一部分传入 Exchange - 然后它们是线程安全的。

    但是对于 CamelContext 它是另一回事,因为只有一个实例,因此您的类可以实现 CamelContextAware 并注入 CamelContext

    【讨论】:

    • 感谢您提出我的问题。 :) 请看我上面的更新。
    • 我的应用程序中有两个camelContexts,我实现了CamelContextAware(哪个上下文将被注入到我的类中)??
    【解决方案2】:

    Camel 2.9 可以实现。

    如果方法是doSomething(Exchange exchange, String someOtherParam) {}

    那么这样的方法可以从如下路由调用:

    .bean(bean_object_name, "doSomething(*, 'someOtherValue')")

    这里 *(通配符)将让 Camel 决定并注入交换对象。 更多详情请参考:http://camel.apache.org/bean-binding.html

    【讨论】:

    • 我明确写过我不想将交换指定为参数。
    猜你喜欢
    • 2015-10-25
    • 1970-01-01
    • 2011-07-24
    • 2016-12-09
    • 2021-06-30
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多