【发布时间】:2014-04-08 13:23:41
【问题描述】:
OSGi 的一个好处是版本控制为explained here。根据文档,OSGi 可以托管不同版本的“相同 jar”,并让其他应用程序相应地访问它们。
我的任务是使用 Camel 路由来利用 OSGi 的相同属性(我正在使用 Apache-Karaf 容器)。
我必须部署一个服务的多个版本,并让Camel、路由到正确的基于根据要求。我广泛搜索了谷歌,但我没有找到合适的例子:(
请给我任何指示或指导我举一个例子。
更新
service 是指osgi bundle 服务,它是这样定义的
<osgi:service ref="transformService">
<osgi:interfaces>
<value>demo.service.TransformService</value>
</osgi:interfaces>
</osgi:service>
我按照this tutorial 中提供的步骤创建了一个名为transformService 的服务,TransformServiceImpl 是该服务的实现类。
现在假设我将修改TransformServiceImpl 并将其作为新版本发布(通过在pom.xml 中更新我的版本)。另外,我将在 Karaf 中安装这两个版本,即demo.service-0.1.jar 和demo.service-0.2.jar(Karaf 可以)。在这种情况下,如何路由到特定版本的服务?
我可以创建 2 个osgi:reference 指向相同的服务但不同的版本吗?像这样?
<osgi:reference id="myTransformV0.1" version="0.1" interface="demo.service.TransformService"/>
<osgi:reference id="myTransformV0.2" version="0.2" interface="demo.service.TransformService"/>
并在路线中使用它们?
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="timer://myTimer?fixedRate=true&period=10000"/>
<choice>
<when ...> <bean ref="myTransformV0.1" method="transform"/>
<otherwise> <bean ref="myTransformV0.2" method="transform"/>
</choice>
<to uri="log:ExampleRouter"/>
</route>
</camelContext>
【问题讨论】:
-
你可以在中间放置一个队列,然后将你的消息推送到队列中,并在上面有一个属性,说明你需要处理它的版本吗?然后你可以为每个版本创建一个订阅者,对每条消息应用过滤器,以便他们只处理他们版本的消息?我不确定您是在 Fuse 中运行还是容易获得 A-MQ
标签: java osgi apache-camel apache-karaf blueprint-osgi