2017-03-14 39 views
2

我們正在使用Blueprint + Camel + Karaf,從Spring遷移。 我是新的OSgi藍圖。我們使用Blueprint XML來定義blueprint xml中定義的bean的服務。駱駝路線無法找到在其他藍圖xml文件(其他捆綁)中定義的bean

後,我們在藍圖XML增值業務,至少從karaf得到如下: FYI:束處於Active狀態

karaf>service:list | grep custom 
    [org.apache.camel.Processor, com.rnd.model.impl.PaymentServiceProcessorBase,com.rnd.generic.CustomServiceP rocessor]osgi.service.blueprint.compname = customPaymentProcessor 

我相信bean被註冊到OSGi服務。但不知何故,其他Bundle中的其他XML不可見。

**Blueprint XML**:: 
    <bean id="customPaymentProcessor" class="blah blah"/> 
    <service ref="customPaymentProcessor" auto-export="all-classes"/> 

請幫我如何獲得accesss(下karaf根目錄)文件夾這個bean在路由XML文件中的AppConfig。

myRoutes.xml

<!-- Add this route to CamelContext Using LoadRouteDefinitions --> 
    <routes id="xyz-Context" xmlns="http://camel.apache.org/schema/spring"> 

    <route id="xyz-one"> 
       <from uri="direct:xyz"/> 
       <!-- this customPayProcesssor is exposed as above --> 
       <process ref="customPayProcesssor"/> 
      </route>  

    </routes> 

我從這個裁判明白: https://access.redhat.com/documentation/en-US/Red_Hat_JBoss_Fuse/6.0/html/Deploying_into_the_Container/files/DeploySimple-Publish.html

所有OSGi服務都隱含註冊爲OSGi regsitry駱駝進行搜索。但我得到; ::

[Bean[ref:cust... because of No bean could be found in the registry for: customPaymentProcessor 

回答

1

爲了導入OSGi的服務到你的包,你可以做這樣的事情:

<reference id="myService" component-name="customPaymentProcessor" 
    interface="com.rnd.model.impl.PaymentServiceProcessorBase" /> 
+0

在我嘗試你的之前,我已經閱讀過我上面提到的redhat論壇。在我的routes.xml中,我如何使用這是無效的? – Slok

+0

如果您確實使用藍圖(而不是Spring),則參考元素應該可用。也許你錯過了一個命名空間? – noMad17

0

看起來你是混合的東西:

  • 藍圖文件導出您的服務
  • 駱駝xml路由定義

您應該使用藍圖也用於您的路由定義,以便您也有機會使用所有blueprint/osgi的東西(config-admin,服務引用等)。

+0

如果我使用藍圖進行路線定義,則意味着路線上下文正確。如果我使用路由上下文,我不能動態加載到駱駝上下文中。 – Slok

3

這是一個簡單的例子,介紹如何做到這一點。你可以發佈一個接口的不同實現,並讓這些包要求最適合的接口。
首先,讓我們瞭解需求:

ExportBundle必須:

  • 導出包含PaymentProcessor接口
  • 出口接口的實現作爲OSGi服務

ImportBundle必須在程序包:

  • 導入包含PaymentProcessor接口封裝
  • 問OSGi的注入所需的服務,這是該接口
  • 保持在一個bean這種服務的引用的實現,並使用它駱駝上下文中

所有包的導入和導出通常由配置maven-bundle-plugin。大部分時間都是正確的。在Karaf控制檯內部,使用headers <bundleid>來檢查哪些服務和軟件包的導入/導出存在。

出口OSGi服務使用藍圖:利用藍圖,並用它

<blueprint> 
    <bean id="customPaymentProcessor" class="my.app.impl.CustomPaymentProcessorImpl"> 

    <service id="customPaymentProcessorService" ref="customPaymentProcessor" 
      interface="my.app.PaymentProcessor" /> 
</blueprint> 

導入OSGi服務的駱駝:

<blueprint> 
    <reference id="customPaymentProcessor" interface="my.app.PaymentProcessor" /> 

    <camelContext> 
     <route> 
      <from uri="direct:start" /> 
      <to uri="bean:customPaymentProcessor" /> 
     </route> 
    </camelContext> 
</blueprint> 

注意:豆類不藍圖上下文之間共享 。但是,在一個包中,您可以根據需要在OSGI-INF/blueprint文件夾中包含儘可能多的.xml文件。在這種情況下,beans 共享爲,因爲所有文件都同意構建相同的藍圖上下文。爲了增加趣味性,如果將CamelContexts定義在多個文件中,則會獲得不同的上下文。
在更大的包中,我通常定義一個beans.xml來配置bean和服務,並定義一個routes.xml來定義使用來自「other」文件的bean的Camel路由。

工作實例

我已經在一個類似的項目工作,隨時檢查爲例進行on my GitHub