我们使用WebSphere 8.5(NON-Liberty Profile ...只是直接的WAS),我们有一个Spring 3.2 Web应用程序正在访问OSGI服务,该服务通过SCA服务桥使用蓝图组件模型。我们这样做是因为根据我们的理解,这是能够从我们当前的架构中访问OSGI服务层的唯一方法。如果有人可能知道另一种/更好的方式,我也同样关注这一点。
在此蓝图管理服务中,我们希望引用其他服务。这个其他服务(以及其中的任何服务引用)我们希望由声明性服务组件模型管理。
我的问题是......这可能吗?有谁知道WAS 8.5中这两个组件模型的混合是否可以任何方式,形状或形式进行?
如果有可能的话,是否有人能指出我如何处理这个问题的正确方向?
所以我决定采用的方法是首先构建一个小概念验证应用程序,该应用程序使用三个不同的OSGI捆绑包全部使用蓝图。然后,一旦我开始工作,请使用其中一个蓝图托管服务,并尝试将其转换为ds托管服务。
这是我到目前为止所得到的: 我已经浏览并创建了位于here的教程。我目前有CounterApp OSGI捆绑应用程序,其中包含以下捆绑包作为应用程序内容:
正如本教程中所述,上述所有内容都是通过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”应用程序中,我将如何做到这一点?我是否必须创建一个单独的捆绑项目,该项目包含以下捆绑/罐子
然后我会从所有这些罐子中重新导出所有导出的接口? 或者我是否必须定义某种类型的导出服务以暴露SCR?
我继续创建了一个新的DS OSGI包/ jar,其中包含提供equinox DS实现所需的所有上述jar文件,然后只传递了这个新包中每个jar的导出。然后,我将此DS捆绑包添加到我的CounterApp应用程序,并将每个DS捆绑包导出导入到包含WorldRef服务的捆绑包中。
这是我似乎被挂断的地方:
OSGI框架正在加载包含WorldRef服务的bundle,但该服务没有被添加到注册表中,这表明没有读取定义服务的component.xml文件,实习生建议SCR是没有运行,因为它是根据我的理解读取该文件的内容。
因此仍然坚持让SCR运行的能力。我处于一个非常紧迫的期限内(我知道......谁不是,对吧?