簡體   English   中英

OSGi容器中的Camel:將InterceptStrategy應用於所有駝峰上下文

[英]Camel in OSGi Container: Apply InterceptStrategy to all camel contexts

我有幾個軟件包(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與監控數據並在<to />端點之前讀取監控數據。

目標是能夠將Bundle M放入已經過驗證的A,B和C系統; 並使其自動應用於現有路由,而無需修改現有和工作捆綁包的配置。 只要更改不會導致A,B和C依賴於M來運行(即,ABC必須仍然在沒有M的情況下運行),對A,B和C進行修改以支持這一點可以接受的。

如果有比使用攔截器更好的方法,我對此持開放態度。 主要目標是:

  1. 保持A,B和C與M分離(特別是在開發期間)
  2. 確保將M與A,B和C集成在一起盡可能簡單
  3. 允許集成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

<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
  <jmxAgent id="agent" mbeanObjectDomainName="your.domain.name"/>
    ...
</camelContext>

然后讓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的路由的最佳支持方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM