[英]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進行修改以支持這一點是可以接受的。
如果有比使用攔截器更好的方法,我對此持開放態度。 主要目標是:
我不認為使用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做出反應。
要么使用Spring-DM,要么更好地將所有基於spring xml的路由轉換為藍圖路由。 這是在Karaf / Osgi中使用基於XML的路由的最佳支持方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.