3

我正在阅读《行动中的骆驼》一书,但无法在骆驼路线中使用 OSGi 服务制定示例(第 4.3.4 节 OsgiServiceRegistry)。这是我的 bean(公开为 OSGi 服务

public class HelloBean {
public String hello(String name){
    System.out.println(" Invoking Hello method ");
    return "Hello " + name;

 }
}

这是将上述 bean 公开为服务的 spring XML 文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:osgi="http://www.springframework.org/schema/osgi"
xsi:schemaLocation="
   http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://camel.apache.org/schema/spring
   http://camel.apache.org/schema/spring/camel-spring.xsd
   http://www.springframework.org/schema/osgi
   http://www.springframework.org/schema/osgi/spring-osgi.xsd">

<bean id="helloBean" class="camelinaction.testbeans.HelloBean" />

<osgi:service id="helloService" interface="camelinaction.testbeans.HelloBean" ref="helloBean" />

<camelContext xmlns="http://camel.apache.org/schema/spring">
    <route>
        <from uri="direct:start" />
        <bean ref="helloService" method="hello" />
    </route>
</camelContext>

</beans>

当我执行 maven 目标“camel:run”时,出现以下异常:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'helloService': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: required property 'bundleContext' has not been set

请让我知道如何设置 bundleContext。我使用 eclipse Equinox 作为 OSGi 容器。

4

3 回答 3

3

camel:run只需使用项目中的 Spring Camel 配置运行一个精简的非 OSGi 运行时。您收到的消息来自 SpringDM(实例化 的东西<osgi:service id="helloService"...>)无法定位 OSGi 环境。要使其工作,您需要将代码安装在支持容器中 - 例如 Servicemix 的 Karaf。

如果您希望看到 OSGi 与 Camel 一起工作,请查看https://github.com/FuseByExample/smx-bootstraps上的 Servicemix Bootstraps 项目- 那里有关于安装和调整代码的完整文档。您将感兴趣的捆绑包有smx-pongersmx-ponger-service,它们分别演示了 OSGi 服务的使用和提供。

于 2012-07-02T11:27:34.093 回答
1

过去我遇到过这样的情况,我的骆驼路线中有 OSGi 依赖组件,我想通过 Eclipse 之类的 IDE 运行/调试。

如果您希望在开发时进行调试,您可以部署到 ServiceMix 并远程调试:

http://servicemix.apache.org/developers/remote-debugging-servicemix-in-eclipse.html

Camel 2.10 可能会通过 OSGi 蓝图支持您的场景:

http://camel.apache.org/camel-run-maven-goal.html

于 2012-09-25T03:01:06.677 回答
0

Spring OSGI 扩展很好,但是正如您所见,当您从相同的 spring 上下文实现和声明 bean 时测试服务接口有点乱伦。您当然可以有 bean 引用 helloBean,但这违背了目的。

我不确定 spring-osgi 扩展行为,但至少对于与 pojosr 非常相似的骆驼蓝图,相同的测试可以使用修改后的 helloService 元素。

<to uri="bean:camelinaction.testbeans.HelloBean" method="hello" />

请注意一个不寻常的事实,即在 bean id 通常引用 bean id 的地方,您现在使用的是完全限定接口。

当然,这有一些不幸的局限性。如果只有一个服务实例实现所需的接口,它工作正常,但没有明显的方法(对我来说)如何应用过滤器。在这种情况下,一种替代方法是实际使用 CamelContext 的 bundleContext 属性并使用编程 API。但是,我们当然希望避免这种情况,而支持声明性方法。

于 2014-09-14T13:30:31.913 回答