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

Vee*_*Arr 22 java osgi apache-camel interceptor osgi-bundle

我有几个软件包(A,B和C)部署到OSGi容器,每个包含一个CamelContext和一些路由.我有另一个包(M),CamelContext带有一个路由(用于收集监控数据)和一个InterceptStrategybean.我希望InterceptStrategyM中的bean自动应用于CamelContext容器中的所有其他s(即A,B和C中的那些),而不必修改其他bundle.

最终,目标是将每个数据从CamelContextM中窃听到路线中,而不必对A,B或C进行任何更改以明确路由Exchange.这种方法或类似的方法是否可行?

所有CamelContexts都是使用Spring XML配置的.


更新:附加上下文

捆绑包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.

str*_*y05 4

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

联合管理系统

InterceptorStrategy为每个骆驼创建一个上下文,A, B & C将消息发布到M

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

from("whatever:endpoint")
    .process(myProcessor)
    .to("target:endpoint");
Run Code Online (Sandbox Code Playgroud)

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

吉米克斯

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

<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
  <jmxAgent id="agent" mbeanObjectDomainName="your.domain.name"/>
    ...
</camelContext>
Run Code Online (Sandbox Code Playgroud)

然后M连接到 JVM MBean Server 并利用诸如NotificationListener之类的东西对 Exchange 做出反应。