OSGi 容器中的 Camel:将 InterceptStrategy 应用于所有 camel 上下文

Camel in OSGi Container: Apply InterceptStrategy to all camel contexts

我有几个包(A、B 和 C)部署到一个 OSGi 容器,每个包含一个 CamelContext 和一些路由。我有另一个 bundle (M),它有一个 CamelContext 和一个路由(用于收集监控数据)和一个 InterceptStrategy bean。我希望 M 中的 InterceptStrategy bean 自动应用于容器中的所有其他 CamelContexts(即 A、B 和 C 中的那些),而无需修改其他包。

最终,目标是从每个 CamelContext 窃听数据到 M 中的路由,而无需对 A、B 或 C 进行任何更改以显式路由 Exchange。这种方法或类似的方法可行吗?

所有 CamelContext 都使用 Spring XML 配置。


更新:附加上下文

Bundle A、B 和 C 包含负责处理数据的核心产品。 Bundle M包含一个可选的监控工具,旨在测量流经A、B和C的数据的某些参数。目前,添加可选工具需要更改A、B和C中的路由以添加额外的Processors 用监控数据丰富 Exchange 并在 <to /> 端点之前读取监控数据。

我们的目标是能够将 Bundle M 放入一个已经通过 A、B 和 C 验证工作的系统中;并使其自动应用于现有路由,而无需修改现有和工作包的配置。 可以接受对 A、B 和 C 进行修改以支持此功能,只要这些更改不会导致 A、B 和 C 依赖 M 来 运行(即,ABC 必须仍然 运行 没有 M)。

如果有比使用拦截器更好的方法来做到这一点,我愿意接受。主要目标是:

  1. 保持 A、B 和 C 与 M 分离(特别是在开发期间)
  2. 确保尽可能简单地将 M 与 A、B 和 C 集成
  3. 允许集成 M 而无需手动更改 A、B 或 C

要么使用 Spring-DM,要么更好地将所有基于 spring xml 的路线转换为蓝图路线。这是在 Karaf/Osgi 中使用基于 XML 的路由的最佳支持方式。

我认为使用 InterceptorStrategy 是不可能的,因为在相同的 camel 上下文中它是 运行。我知道跨多个上下文工作的唯一方法是使用 VM 端点(显然仅限于同一个 JVM),但是在这种情况下,您可能最好使用 JMS、JMX 或类似的东西。

JMS

A, B & C 中的每个 camel 上下文创建一个 InterceptorStrategy,将您的消息发布到 M

intercept().bean(transformForMonitoring).to("jms:queue:monitoring");

from("whatever:endpoint")
    .process(myProcessor)
    .to("target:endpoint");

如果您不想要 JMS 的开销,您也可以在 intercept() 上使用 vm 组件,但是这会将您的监视组件限制为单个 JVM。

JMX

这有点复杂,但基本思想是告诉 camel 上下文为 A, B & C

发布 MBean
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
  <jmxAgent id="agent" mbeanObjectDomainName="your.domain.name"/>
    ...
</camelContext>

然后让 M 连接到 JVM MBean 服务器并利用 NotificationListener 之类的东西对交换做出反应。

一种可能性是在 Bundle 'M' 中定义一个 custom Tracer 并将其导出为 osgi 服务。

在包 A、B、C 中定义对导出的 Tracer bean 的 osgi 引用

使用camel JMX启用跟踪。

这将导致捆绑包 A、B、C 发生变化,但变化很小,并且还将提供集成和配置跟踪(拦截)的能力

我自己没试过,但是hth