我有一个包 A,它公开了以下服务:
在 OSGI-INF/config.xml
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0"
name="com.example.MyService" modified="updated" immediate="true">
<implementation class="com.example.impl.MyServiceImpl"/>
<service>
<provide interface="com.example.MyService"/>
</service>
</scr:component>
下一步,我想从 bundle B 中的一个 servlet 使用这个服务。
我要做的是:
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException {
BundleContext bundleContext = (BundleContext) getServletContext().getAttribute("osgi-bundlecontext");
if (bundleContext != null) {
// Here MyService is the service exposed as declarative service
MyService myService = getService(bundleContext, MyService.class);
if(myService != null) {
// I want to invoke some method declared in MyService interface
myService.invokeMyServiceMethod();
}
}
}// end of doPost
protected <T> T getService(BundleContext bundleContext, Class<T> type) {
ServiceReference<T> serviceRef = bundleContext.getServiceReference(type);
if (serviceRef == null) {
return null;
}
T service = bundleContext.getService(serviceRef);
return service;
}// end of getService method
随着OSGi中的服务来来去去,假设即使doPost方法中的非空引用检查通过,下一条语句myService.invokeMyServiceMethod()也不会抛出NPE是否正确?
我如何保证我将始终从服务注册表中获得对 MyService 的有效引用?
如果这不是从 Http Service 获取服务引用的正确方法,那么正确的方法是什么?
我使用 Equinox 作为 OSGi 实现。
干杯,鲍里斯