OSGi容器中的java驼峰:将拦截策略应用于所有驼峰上下文
我在OSGi容器中部署了几个包(A、B和C),每个包都包含一个CamelContext
和一些路由。我有另一个bundle(M),其中有一个CamelContext
,一个路由(用于收集监控数据)和一个InterceptStrategy
bean。我希望M中的InterceptStrategy
bean自动应用于容器中的所有其他CamelContext
(即A、B和C中的那些),而不必修改其他包
最终,目标是将数据从每个CamelContext
窃听到M中的路由中,而不必对A、B或C进行任何更改来显式路由Exchange
。这种方法或类似方法可行吗
所有的CamelContext
都是使用SpringXML配置的
更新:其他上下文
捆绑包A、B和C包含负责处理数据的核心产品。Bundle M包含一个可选的监视工具,用于测量流经A、B和C的数据的某些参数。当前,添加可选工具需要更改A、B和C中的路由,以添加额外的Processor
以使用监视数据丰富Exchange
并在<to />
端点之前读取监视数据
目标是能够将捆绑包M放入一个已验证为工作系统的a、B和C中;并使其自动应用于现有路由,而无需修改现有捆绑包和工作捆绑包的配置。只要更改不会导致A、B和C依赖M运行(即ABC必须在没有M的情况下运行),对A、B和C进行修改以支持这一点是可以接受的
如果有比使用拦截器更好的方法,我对此持开放态度。主要目标是:
- 保持A、B和C与M分离(特别是在开发期间)
- 确保M与A、B和C的集成尽可能容易
- 允许在不必手动更改A、B或C的情况下集成M
# 1 楼答案
要么使用SpringDM,要么更好地将所有基于SpringXML的路由转换为蓝图路由。这是在Karaf/Osgi中使用基于XML的路由的最佳支持方式
# 2 楼答案
我认为使用
InterceptorStrategy
是不可能的,因为这要求它在同一个驼峰上下文中运行。我所知道的跨多个上下文工作的唯一方法是使用VM端点(这显然限于同一个JVM),但是在这种情况下,您可能会更好地使用JMS、JMX或类似的东西JMS
为
A, B & C
中的每个camel上下文创建一个InterceptorStrategy
,该上下文将消息发布到M
如果不需要JMS的开销,也可以在
intercept()
上使用vm
组件,但是这将监视组件限制在单个JVM上JMX
这有点复杂,但基本思想是告诉camel上下文为
A, B & C
发布MBean然后让
M
连接到JVM MBean服务器,并使用类似NotificationListener的东西对交换做出反应# 3 楼答案
一种可能性是在Bundle'M'中定义一个custom Tracer,并将其导出为osgi服务
在bundle A、B、C中定义对导出的跟踪bean的osgi引用
使用camel JMX启用跟踪
这将导致bundle A、B、C中的更改,但这将是最小的,它还将提供集成和配置跟踪(拦截)的能力
我自己没有试过,但是