2014-04-08 32 views
0

OSGi的好处之一是版本explained here。根据文档,OSGi可以托管不同版本的“同一个jar”,并让其他应用程序相应地访问它们。osgi-karaf-多种版本的服务和骆驼路线

我已经被赋予了一个使用骆驼路线的任务来利用OSGi的相同属性(我正在使用Apache-Karaf容器)。

我有部署服务的多个版本,并有骆驼路线基于该请求的适当之一。我广泛搜索谷歌,但我还没有找到一个合适的例子:(

请把我的任何指针或指导我的例子。

更新

通过服务,我的意思是OSGi的这是这样

<osgi:service ref="transformService"> 
     <osgi:interfaces> 
      <value>demo.service.TransformService</value> 
     </osgi:interfaces> 
    </osgi:service> 

定义捆绑包服务,我已按照this tutorial提供来创建服务的步骤称为transformServiceTransformServiceImpl是此服务的实现类。

现在我们假设我将修改TransformServiceImpl并将其作为新版本发布(通过更新我的版本pom.xml)。另外,我会安装这两个版本,即demo.service-0.1.jardemo.service-0.2.jar卡拉夫(这是可以与卡拉夫)。在这种情况下,我如何路由到特定版本的服务?

我可以创建指向相同服务但不同版本的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&amp;period=10000"/> 
     <choice> 
       <when ...> <bean ref="myTransformV0.1" method="transform"/> 
       <otherwise> <bean ref="myTransformV0.2" method="transform"/> 
     </choice> 
     <to uri="log:ExampleRouter"/> 
    </route> 
    </camelContext> 
+0

你可以在中间放置一个队列,并将你的消息推送到队列中,并在队列中添加一个属性,指出需要处理的版本?那么您可以为每个版本创建一个订阅者,为每个消息应用一个过滤器,以便他们仅处理其版本的消息?我不确定您是否在Fuse中运行或有A-MQ易于使用 –

回答

1

OSGi版本控制与服务版本控制不同。我认为关键的问题是如何以不同的版本访问这些骆驼路线。

如果您的骆驼路由提供RESTful服务,可以使用不同的url(例如“/ service/v1”,“/ service/v2”)提供不同的版本。但是与OSGi版本控制不同,你仍然需要做一些工作来填补这个空白。

+0

谢谢@WillemJiang您的回复。我所说的服务是osgi捆绑服务。我已经更新了这个问题。希望现在很清楚。 – sanbhat

+0

我不确定是否使用osgi:引用支持版本,但如果您使用的是蓝图,则可以定义一个筛选器,指定服务可能公开的版本。 –

+0

再次感谢:) .. osgi:引用不支持版本,我只是为了问题而放。我将探索蓝图.. – sanbhat