Camel路由无法在其他蓝图xml文件中找到bean(其他包)

时间:2017-03-14 16:23:42

标签: java apache-camel osgi-bundle blueprint-osgi

我们正在使用Blueprint + Camel + Karaf,从Spring迁移。 我是OSgi Blueprint的新手。我们使用Blueprint XML来定义blueprint xml中定义的bean的服务。

我们在Blueprint XML中添加了Service之后,至少从karaf获取如下: fyi:bundle处于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"/>

请帮助我如何在APPConfig(在karaf根目录下)文件夹中的Routes XML文件中访问此bean。

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 for camel to search。但我得到了; ::

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

3 个答案:

答案 0 :(得分:3)

这是一个关于如何做的简单示例。您可以发布不同的界面实现,让捆绑包请求最适合的界面 首先,让我们了解要求:

ExportBundle必须:

  • 导出包含PaymentProcessor interface
  • 的包
  • 将接口的实现导出为OSGi服务

ImportBundle必须:

  • 导入包含PaymentProcessor interface
  • 的包
  • 要求OSGi注入所需的服务,这是接口的实现
  • 在bean中保留对此类服务的引用,并在Camel Context
  • 中使用它

包的所有导入和导出通常由 maven-bundle-plugin 配置。大多数时候它是正确的。在Karaf控制台内部,使用headers <bundleid>检查存在哪个服务和包导入/导出。

使用Blueprint导出OSGi服务:

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

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

使用Blueprint导入OSGi服务并在Camel:

中使用它
<blueprint>
    <reference id="customPaymentProcessor" interface="my.app.PaymentProcessor" />

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

注意:在Blueprint上下文之间不共享 bean 。但是,在单个捆绑包中,您可以根据需要在.xml文件夹中包含尽可能多的OSGI-INF/blueprint个文件。在这种情况下,bean 共享的,因为所有文件都同意构建相同的Blueprint上下文。为了增加乐趣,如果您在多个文件中定义CamelContexts,则会得到不同的上下文。
在更大的bundle中,我通常定义一个beans.xml来配置bean和服务,并定义一个routes.xml来定义使用来自&#34;其他&#34;的bean的Camel路由。文件。

工作示例

我已经在开展一个类似的项目了,请随时查看一个示例on my GitHub

答案 1 :(得分:1)

为了将您的OSGi服务导入您的捆绑包,您可以执行以下操作:

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

答案 2 :(得分:0)

看起来你在混合东西:

  • 用于导出服务的蓝图文件
  • 驼峰xml路线定义

您还应该使用蓝图作为路线定义,以便您也有机会使用所有蓝图/ osgi内容(config-admin,服务引用等)。