2.23.0 版本没有 CamelContext 无法创建 Camel DefaultMessage
Camel DefaultMessage cannot be created without CamelContext in version 2.23.0
我的实际代码(Camel 2.10.x)创建一个新的 Camel 消息来包装一些数据(http 查询),如下所示:
Message message = new DefaultMessage();
message.setHeader(HEADER_QUERY, query);
message.setHeader(HEADER_BRAND, brand);
message.setHeader(HEADER_LIST_ID, listId);
在我迁移我的平台时,我们使用的 Camel 版本是:2.23.0,现在我们可以看到空构造函数已被弃用。
执行代码时,我们遇到了与官方 Camel 论坛 this post 中提到的相同问题。
创建消息的好方法似乎是使用构造函数和 CamelContext in 参数,如下所示:
Message message = new DefaultMessage(camelContext);
message.setHeader(HEADER_QUERY, query);
message.setHeader(HEADER_BRAND, brand);
message.setHeader(HEADER_LIST_ID, listId);
我在 OSGI 上下文中,但代码在我没有 Exchange
或原始 Message
可用的 Bean 中。
我只是想知道如何将 CamelContext
提供给 Message 构造函数,或者是否有另一种方法可以在没有 CamelContext 的情况下创建 DefaultMessage
。
请注意,我不在 Camel Route 中,Bean 是从 REST 接口调用的(我怀疑有一些重构可以清理它,但我们计划很快停用它)。我正在寻找一个速赢的解决方案。
你可以试试org.apache.camel.main.Main
class。它是一个单例,所以你可以使用 Main.getInstance()
获取实例,然后你可以调用 getOrCreateCamelContext()
方法来获取 CamelContext.
不幸的是,Main.getInstance().getOrCreateCamelContext()
的解决方案似乎在我的上下文 (OSGI) 中不起作用:Main.getInstance()
总是 returns null。
但我终于找到了另一种方法让它工作:
第一步
将 bundleContext 注入我的 Bean:
<bean id="myCustomMessageFactory" class="org.mycompany.module.factory.CustomMessageFactory">
<property name="bundleContext" ref="blueprintBundleContext" />
</bean>
blueprintBundleContext
是自动设置的,不需要声明。
第二步
来自 Bean(Java 代码):
ServiceReference sr = bundleContext.getServiceReference(CamelContext.class);
CamelContext camelContext = (CamelContext) bundleContext.getService(sr);
// and then I can inject the camelContext into the message constructor
Message message = new DefaultMessage(camelContext);
它在 OSGI 环境中完美运行。
我的实际代码(Camel 2.10.x)创建一个新的 Camel 消息来包装一些数据(http 查询),如下所示:
Message message = new DefaultMessage();
message.setHeader(HEADER_QUERY, query);
message.setHeader(HEADER_BRAND, brand);
message.setHeader(HEADER_LIST_ID, listId);
在我迁移我的平台时,我们使用的 Camel 版本是:2.23.0,现在我们可以看到空构造函数已被弃用。 执行代码时,我们遇到了与官方 Camel 论坛 this post 中提到的相同问题。
创建消息的好方法似乎是使用构造函数和 CamelContext in 参数,如下所示:
Message message = new DefaultMessage(camelContext);
message.setHeader(HEADER_QUERY, query);
message.setHeader(HEADER_BRAND, brand);
message.setHeader(HEADER_LIST_ID, listId);
我在 OSGI 上下文中,但代码在我没有 Exchange
或原始 Message
可用的 Bean 中。
我只是想知道如何将 CamelContext
提供给 Message 构造函数,或者是否有另一种方法可以在没有 CamelContext 的情况下创建 DefaultMessage
。
请注意,我不在 Camel Route 中,Bean 是从 REST 接口调用的(我怀疑有一些重构可以清理它,但我们计划很快停用它)。我正在寻找一个速赢的解决方案。
你可以试试org.apache.camel.main.Main
class。它是一个单例,所以你可以使用 Main.getInstance()
获取实例,然后你可以调用 getOrCreateCamelContext()
方法来获取 CamelContext.
不幸的是,Main.getInstance().getOrCreateCamelContext()
的解决方案似乎在我的上下文 (OSGI) 中不起作用:Main.getInstance()
总是 returns null。
但我终于找到了另一种方法让它工作:
第一步
将 bundleContext 注入我的 Bean:
<bean id="myCustomMessageFactory" class="org.mycompany.module.factory.CustomMessageFactory">
<property name="bundleContext" ref="blueprintBundleContext" />
</bean>
blueprintBundleContext
是自动设置的,不需要声明。
第二步
来自 Bean(Java 代码):
ServiceReference sr = bundleContext.getServiceReference(CamelContext.class);
CamelContext camelContext = (CamelContext) bundleContext.getService(sr);
// and then I can inject the camelContext into the message constructor
Message message = new DefaultMessage(camelContext);
它在 OSGI 环境中完美运行。