OSGi Container 中的骆驼:将 InterceptStrategy 应用于所有骆驼上下文

我有几个捆绑包(A,B和C)部署到OSGi容器,每个捆绑包都包含一个和一些路由。我有另一个捆绑包(M),带有路由(用于收集监视数据)和bean。我希望来自 M 的 bean 自动应用于容器中的所有其他 s(即 A、B 和 C 中的 bean),而不必修改其他捆绑包。CamelContextCamelContextInterceptStrategyInterceptStrategyCamelContext

最终,目标是将数据从每个路由窃听到 M 中的路由中,而不必对 A、B 或 C 进行任何更改来显式路由 .这种方法或类似的方法是否可行?CamelContextExchange

所有这些都是使用Spring XML配置的。CamelContext


更新:其他上下文

捆绑包 A、B 和 C 包含负责处理数据的核心产品。Bundle M 包含一个可选的监视工具,旨在测量流经 A、B 和 C 的数据的某些参数。目前,在可选工具上添加需要更改 A、B 和 C 中的路由以添加其他 s 以丰富监视数据,并在终结点之前读取监视数据。ProcessorExchange<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

答案 1

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

断续器

为每个驼峰上下文创建一个,将您的消息发布到InterceptorStrategyA, B & CM

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

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

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

断续器

这有点复杂,但基本思想是告诉骆驼上下文发布MBAansA, B & C

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

然后连接到 JVM MBean 服务器,并利用 NotificationListener 之类的东西来响应 Exchange。M


答案 2

其中一种可能性是在捆绑包“M”中定义一个自定义跟踪器,并将其导出为osgi服务。

在捆绑包 A、B、C 中,定义了对导出的示踪剂豆的 osgi 引用

使用驼 JMX 启用跟踪。

这将导致捆绑包 A、B、C 中的更改,但它将是最小的,并且它还将提供集成和配置跟踪(拦截)的能力。

我自己没有尝试过,但是hth


推荐