OSGi容器中的Camel:将InterceptStrategy应用于所有驼峰上下文
我有几个软件包(A,B和C)部署到OSGi容器,每个包含一个CamelContext
和一些路由。 我有另一个包(M),带有一个CamelContext
,一个路由(用于收集监控数据)和一个InterceptStrategy
bean。 我希望M中的InterceptStrategy
bean能够自动应用于容器中的所有其他CamelContext
(即A,B和C中的那些),而不必修改其他bundle。
最终,目标是将每个CamelContext
数据窃听到M中的路由,而无需对A,B或C进行任何更改以显式路由Exchange
。 这种方法或类似的方法是否可行?
所有CamelContext
都是使用Spring XML配置的。
更新:附加上下文
捆绑包A,B和C包含负责处理数据的核心产品。 Bundle M包含一个可选的监控工具,用于测量流经A,B和C的数据的某些参数。目前,添加可选工具需要更改A,B和C中的路由以添加额外的Processor
以丰富Exchange
与监控数据并在端点之前读取监控数据。
目标是能够将Bundle M放入已经过validation的A,B和C系统; 并使其自动应用于现有路由,而无需修改现有工作包的配置。 只要更改不会导致A,B和C依赖于M来运行(即,ABC必须仍然在没有M的情况下运行),对A,B和C进行修改以支持这一点是可以接受的。
如果有比使用拦截器更好的方法,我对此持开放态度。 主要目标是:
- 保持A,B和C与M分离(特别是在开发期间)
- 确保将M与A,B和C集成在一起尽可能简单
- 允许集成M而无需手动更改A,B或C.
我不认为使用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
这有点复杂,但基本的想法是告诉驼峰上下文为A, B & C
发布MBean
...
然后让M
连接到JVM MBean Server并利用NotificationListener之类的东西来对Exchange做出反应。
其中一种可能性是在Bundle’M’中定义一个自定义Tracer并将其导出为osgi服务。
在包A,B,C中,定义对导出的Tracer bean的osgi-reference
使用camel JMX启用跟踪。
这将导致捆绑包A,B,C中的更改,但它将是最小的,并且还将提供集成和配置跟踪(拦截)的能力
我自己没试过,但是
要么使用Spring-DM,要么更好地将所有基于spring xml的路由转换为蓝图路由。 这是在Karaf / Osgi中使用基于XML的路由的最佳支持方式。
- 无法通过Camel将日期字段保存为mongo db中的ISO日期?
- org.apache.camel.NoTypeConversionAvailableException:没有类型转换器可用于转换类型:
- Exchange.getIn()。getBody()在第二次调用时返回camel中的空字符串
- 如何以自动方式关闭独立的Apache Camel应用程序?
- 引起:java.net.SocketException:来自服务器的文件意外结束
- JDBC和JMS的Spring事务同步
- 如何在不同的camel路由上的方法之间共享对象
- 在spring boot中使用现有的http服务器作为camel端点
- 在Apache Camel应用程序中,unit testing如何注入模拟端点来代替真实端点?