我们正在使用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>
所有Osgi服务都隐含地注册为oSGI regsitry for camel to search。但我得到了; ::
[Bean[ref:cust... because of No bean could be found in the registry for: customPaymentProcessor
答案 0 :(得分:3)
这是一个关于如何做的简单示例。您可以发布不同的界面实现,让捆绑包请求最适合的界面 首先,让我们了解要求:
ExportBundle必须:
PaymentProcessor
interface ImportBundle必须:
PaymentProcessor
interface 包的所有导入和导出通常由 maven-bundle-plugin 配置。大多数时候它是正确的。在Karaf控制台内部,使用headers <bundleid>
检查存在哪个服务和包导入/导出。
<blueprint>
<bean id="customPaymentProcessor" class="my.app.impl.CustomPaymentProcessorImpl">
<service id="customPaymentProcessorService" ref="customPaymentProcessor"
interface="my.app.PaymentProcessor" />
</blueprint>
<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)
看起来你在混合东西:
您还应该使用蓝图作为路线定义,以便您也有机会使用所有蓝图/ osgi内容(config-admin,服务引用等)。