有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

OSGi容器中的java驼峰:将拦截策略应用于所有驼峰上下文

我在OSGi容器中部署了几个包(A、B和C),每个包都包含一个CamelContext和一些路由。我有另一个bundle(M),其中有一个CamelContext,一个路由(用于收集监控数据)和一个InterceptStrategybean。我希望M中的InterceptStrategybean自动应用于容器中的所有其他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进行修改以支持这一点是可以接受的

如果有比使用拦截器更好的方法,我对此持开放态度。主要目标是:

  1. 保持A、B和C与M分离(特别是在开发期间)
  2. 确保M与A、B和C的集成尽可能容易
  3. 允许在不必手动更改A、B或C的情况下集成M

共 (3) 个答案

  1. # 1 楼答案

    要么使用SpringDM,要么更好地将所有基于SpringXML的路由转换为蓝图路由。这是在Karaf/Osgi中使用基于XML的路由的最佳支持方式

  2. # 2 楼答案

    我认为使用InterceptorStrategy是不可能的,因为这要求它在同一个驼峰上下文中运行。我所知道的跨多个上下文工作的唯一方法是使用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

    这有点复杂,但基本思想是告诉camel上下文为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服务器,并使用类似NotificationListener的东西对交换做出反应

  3. # 3 楼答案

    一种可能性是在Bundle'M'中定义一个custom Tracer,并将其导出为osgi服务

    在bundle A、B、C中定义对导出的跟踪bean的osgi引用

    使用camel JMX启用跟踪

    这将导致bundle A、B、C中的更改,但这将是最小的,它还将提供集成和配置跟踪(拦截)的能力

    我自己没有试过,但是