我们使用 WebSphere 8.5(NON-Liberty Profile……只是直接的 WAS),我们有一个 Spring 3.2 Web 应用程序,它正在访问一个 OSGI 服务,该服务通过 SCA 服务桥使用蓝图组件模型。我们这样做是因为据我们了解,这是能够从我们当前架构中访问 OSGI 服务层的唯一方法。如果有人可能知道另一种/更好的方法,我也对此全神贯注。
在此蓝图托管服务中,我们希望引用另一个服务。我们希望由声明式服务组件模型管理这个其他服务(以及其中的任何服务引用)。
我的问题是……这可能吗?有谁知道在 WAS 8.5 中混合这两个组件模型是否可以以任何方式、形状或形式进行?
如果可能的话,是否有人能够指出我如何解决这个问题的正确方向?
编辑 - 12 月 5 日
所以我决定采用的方法是首先构建一个小的概念验证应用程序,该应用程序使用三个不同的 OSGI 包,它们都使用蓝图。然后,一旦我完成了这项工作,请使用其中一项蓝图托管服务,并尝试将其转换为 ds 托管服务。
这是我到目前为止所得到的:我已经完成并创建了位于此处的教程。我目前有 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);
}
此“问候”服务在蓝图 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>
所以事情是这样的:
我的目标是使用component.xml文件将“WorldRef”服务转换为 DS 托管服务,并将以下内容添加到Service-Component: OSGi-INF/component.xml
实现类的 MANIFEST.MF 标头中,如果我理解正确,则不是 API 类。
这就是我需要为转换做的所有事情吗?还是我还需要为班级添加激活器?另外,我需要在 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 运行的能力。我的最后期限非常紧迫(我知道……谁不是,对吧?