WAS 8.5 - 管理OSGI服务的蓝图是否可以引用声明性服务托管的OSGI服务?

时间:2013-11-30 06:03:29

标签: websphere osgi blueprint-osgi declarative-services

我们使用WebSphere 8.5(NON-Liberty Profile ...只是直接的WAS),我们有一个Spring 3.2 Web应用程序正在访问OSGI服务,该服务通过SCA服务桥使用蓝图组件模型。我们这样做是因为根据我们的理解,这是能够从我们当前的架构中访问OSGI服务层的唯一方法。如果有人可能知道另一种/更好的方式,我也同样关注这一点。

在此蓝图管理服务中,我们希望引用其他服务。这个其他服务(以及其中的任何服务引用)我们希望由声明性服务组件模型管理。

我的问题是......这可能吗?有谁知道WAS 8.5中这两个组件模型的混合是否可以任何方式,形状或形式进行?

如果有可能的话,是否有人能指出我如何处理这个问题的正确方向?

编辑 - 12月5日

所以我决定采用的方法是首先构建一个小概念验证应用程序,该应用程序使用三个不同的OSGI捆绑包全部使用蓝图。然后,一旦我开始工作,请使用其中一个蓝图托管服务,并尝试将其转换为ds托管服务。

这是我到目前为止所得到的: 我已经浏览并创建了位于here的教程。我目前有CounterApp OSGI捆绑应用程序,其中包含以下捆绑包作为应用程序内容:

  • CounterServiceBundle
  • CounterWebBundle
  • CounterWorldBundle

正如本教程中所述,上述所有内容都是通过blueprint.xml文件使用蓝图组件模型绑定在一起的。

所以这一切都分解如下:

在CounterWebBundle的CounterServlet的doGet方法中,我有以下方式使用Greet服务:

    Greet greet;
    try {
        InitialContext ic = new InitialContext();
        greet = (Greet) ic.lookup("osgi:service/"+Greet.class.getName());
        String greetText = greet.getText();
        String output = "greet.getText()="+greetText;           
        response.getOutputStream().println(output);
    } catch (NamingException e) {
        e.printStackTrace(System.out);
    }

这个“greet”服务在蓝图xml中定义为“GreetBeanService”。现在,在其实现类中,它引用了另外两个服务,“CounterBean”和“WorldRef”。

以下是要解释的blueprint.xml文件:

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">

<bean id="CounterBean" class="com.ibm.ws.eba.counter.CounterImpl"
    init-method="init"></bean>

<service id="CounterBeanService" ref="CounterBean"
    interface="com.ibm.ws.eba.counter.Counter" />

<bean id="GreetBean" class="com.ibm.ws.eba.counter.GreetImpl"
    init-method="init">
    <property name="counter" ref="CounterBean"/>
    <property name="worldBean" ref="WorldRef"/>
</bean>

<service id="GreetBeanService" ref="GreetBean"
    interface="com.ibm.ws.eba.counter.Greet" />

<reference id="WorldRef" interface="com.ibm.ws.eba.world.World" />

</blueprint>

事情是这样的:

我的目标是将“WorldRef”服务转换为带有 component.xml 文件的DS托管服务,并将以下内容添加到实现的MANIFEST.MF标头Service-Component: OSGi-INF/component.xml中如果我理解正确的话,而不是API类。

这是我需要为转换做的全部吗?或者我还需要为类添加一个Activator?另外,我是否需要在API实现类中添加“激活”和“停用”方法?

另外我理解我必须以某种方式包含服务组件运行时,作为一个单独的包并将其包含在“CounterApp”应用程序中,我将如何做到这一点?我是否必须创建一个单独的捆绑项目,该项目包含以下捆绑/罐子

  • org.eclipse.equinox.util
  • org.eclipse.equinox.ds
  • org.eclipse.osgi.services

然后我会从所有这些罐子中重新导出所有导出的接口? 或者我是否必须定义某种类型的导出服务以暴露SCR?

编辑 - 12月6日

我继续创建了一个新的DS OSGI包/ jar,其中包含提供equinox DS实现所需的所有上述jar文件,然后只传递了这个新包中每个jar的导出。然后,我将此DS捆绑包添加到我的CounterApp应用程序,并将每个DS捆绑包导出导入到包含WorldRef服务的捆绑包中。

这是我似乎被挂断的地方:

OSGI框架正在加载包含WorldRef服务的bundle,但该服务没有被添加到注册表中,这表明没有读取定义服务的component.xml文件,实习生建议SCR是没有运行,因为它是根据我的理解读取该文件的内容。

因此仍然坚持让SCR运行的能力。我处于一个非常紧迫的期限内(我知道......谁不是,对吧?

0 个答案:

没有答案