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).
如果有比使用拦截器更好的方法,我对此持开放态度.主要目标是:
我认为这是不可能的,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 做出反应。
| 归档时间: |
|
| 查看次数: |
597 次 |
| 最近记录: |