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

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

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

如果有可能,任何人都可以指出我如何处理这个问题的正确方向?

编辑 - 12月5日

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

到目前为止's what I'已经完成了:我已经完成并创建了位于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”应用程序中,我将如何做到这一点?我是否必须创建一个单独的捆绑项目,该项目由以下捆绑/ jar 组成

  • org.eclipse.equinox.util

  • org.eclipse.equinox.ds

  • org.eclipse.osgi.services

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

编辑 - 12月6日

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

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

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

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