我有几个软件包(A,B和C)部署到OSGi容器,每个包含CamelContext
和一些路由。我有另一个包(M),其中CamelContext
带有路由(用于收集监控数据)和一个InterceptStrategy
bean。我希望M中的InterceptStrategy
bean自动应用于容器中的所有其他CamelContext
(即A,B和C中的那些),而不必修改其他包。
最终,目标是将每个CamelContext
的数据窃听到M中的路由,而不必对A,B或C进行任何更改以明确路由Exchange
。这种方法或类似方法是否可行?
所有CamelContext
都是使用Spring XML配置的。
更新:附加上下文
捆绑包A,B和C包含负责处理数据的核心产品。 Bundle M包含一个可选的监控工具,用于测量流经A,B和C的数据的某些参数。目前,添加可选工具需要更改A,B和C中的路由以添加额外的{{1}使用监控数据丰富Processor
并在Exchange
端点之前读取监控数据。
目标是能够将Bundle M放入已经过验证的A,B和C系统;并使其自动应用于现有路由,而无需修改现有和工作捆绑包的配置。只要更改不会导致A,B和C依赖于M来运行(即,ABC必须仍然是 可以对A,B和C进行修改以支持此操作没有M)。
如果有比使用拦截器更好的方法,我对此持开放态度。主要目标是:
答案 0 :(得分:4)
我不认为这可以使用InterceptorStrategy
,因为它期望它在相同的camel上下文中运行。我知道在多个上下文中工作的唯一方法是使用VM端点(显然仅限于相同的JVM),但在这种情况下,您可能会更好地利用JMS,JMX或类似的东西。
<强> JMS 强>
为InterceptorStrategy
中的每个camel上下文创建一个A, B & C
,将您的邮件发布到M
intercept().bean(transformForMonitoring).to("jms:queue:monitoring");
from("whatever:endpoint")
.process(myProcessor)
.to("target:endpoint");
如果您不想要JMS的开销,也可以使用vm
上的intercept()
组件,但是这会将监视组件限制为单个JVM。
<强> JMX 强>
这有点复杂,但基本的想法是告诉驼峰上下文为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 Server并利用NotificationListener之类的东西来对Exchange做出反应。
答案 1 :(得分:2)
其中一种可能性是在Bundle&#39; M&#39;中定义custom Tracer。并将其导出为osgi服务。
在包A,B,C中定义对导出的Tracer bean的osgi-reference
使用camel JMX启用跟踪。
这将导致捆绑包A,B,C发生变化,但它会很小,并且还可以集成和配置跟踪(拦截)
我自己没试过,但是
答案 2 :(得分:1)
使用Spring-DM,或者更好地将所有基于spring xml的路由转换为蓝图路径。这是在Karaf / Osgi中使用基于XML的路由的最佳支持方式。