先前介绍过OSGI中的服务的注册,上次讲的服务的注册是通过手工来完成的,比如
// 注册服务
context.registerService(LoginService.class.getName(), loginService, new Hashtable());
// create a tracker and track the service
loginServiceTracker = new ServiceTracker(context, LoginService.class.getName(), null );
loginServiceTracker .open();
//使用
service = (LoginService) loginServiceTracker .getService();
service .login();
可以看到,非常的麻烦,现在我给大家介绍一个工具,名称为 Equinox OSGI Declarative Service,通过使用这个东西,我们可以像使用Spring那样来声明注册服务。
Equinox 的org.eclipse.equinox.ds项目提供了OSGi R4规范中的Declarative Service标准服务的实现,该组件由Prosyst公司提供实现。Declarative Service提供了基于OSGI平台之上的面向服务构件模型(Service-Oriented Component Model),也为在OSGI基础之上搭建SOA应用提供了可能。Declarative Service实现并没有包含在Eclipse的默认软件包中,需要单独从 Eclipse 的的网站上获得,网站名称为 http://download.eclipse.org/eclipse/equinox/ 页面下载这个项目,这张网页也提供了其他的项目下载,有兴趣的话可以看看
在提供了DS之后我们可以采用XML文件的方式来声明:
<component name="LoginService">
<implementation class="org.vwpolo.osgi.service.model.impl.LoginServiceImpl"/>
<service>
<provide interface="org.vwpolo.osgi.service.model.LoginService"/>
</service>
</component>
上面的XML配置文件声明了LoginService的组件,组件实现类是 org.vwpolo.osgi.service.model.impl.LoginServiceImpl ,同时,声明了组件的服务接口为 org.vwpolo.osgi.service.model.LoginService 。我们将这个文件放在 OSGI-INF 文件夹中,文件结构如下图所示 :
接着我们再在 MANIFEST.MF 文件中指定服务配置文件的位置











上面的 " Service-Component: OSGI-INF/component.xml " 这行代码说明了 OSGI 服务配置文件的位置,下面先将项目的所有代码帖出来:
Org.vwpolo.osgi.services 项目的源代码:
Activator.java
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
public class Activator implements BundleActivator {
private BundleContext context;
public void start(BundleContext context) throws Exception {
}
public void stop(BundleContext context) throws Exception {
}
}
LoginService .java
public interface LoginService ...{
public void login(String name, String password);
}
LoginServiceImpl .java
import org.vwpolo.osgi.service.model.LoginService;
public class LoginServiceImpl implements LoginService {
@Override
public void login(String name, String password) {
if (name.equals("vwpolo") && password.equals("123" ))
System.out.println("登录成功" );
else
System.out.println( "登录失败,用户名或密码错误!" );
}
}
UseOSGIServiceExample 项目的源代码:
Activator.java
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.vwpolo.osgi.service.model.LoginService;
public class Activator implements BundleActivator {
private BundleContext context;
public void start(BundleContext context) throws Exception {
this.context = context;
ServiceReference serviceRef = context.getServiceReference(LoginService.class .getName());
LoginService loginService = (LoginService) context.getService(serviceRef);
loginService.login("vwpolo", "123" );
System.out.println("OSGI框架已经成功启动了,一切运行正常" );
}
public void stop(BundleContext context) throws Exception {
}
}
项目建好了发现如果有错误的话那么肯定是环境没配置好,比如包没有导出或导入,
在 org.vwpolo.osgi.services 项目 MANIFEST.MF 文件中的 Runtime 标签页将org.vwpolo.osgi.service.model 和 org.vwpolo.osgi.service.model.impl 这两个包导出
然后在 UseOSGIServiceExample 项目的 MANIFEST.MF 文件中的 Dependencies 标签页将上面导出的两个包导入就行了
下面我们来运行一下看看最终的效果,打开运行配置对话框,
依次勾选上图中的要依赖的项目, 还是列出来比较好:
org.vwpolo.osgi.services UserOSGIServiceExample org.eclipse.equinox.app org.eclipse.equinox.common org.eclipse.equinox.ds org.eclipse.equinox.registry org.eclipse.osgi org.eclipse.osgi.services org.eclipse.osgi.util |
点击运行,结果:
输入 ss 回车,可以看到插件的状态
osgi> ss
Framework is launched.
id State Bundle
0 ACTIVE org.eclipse.osgi_3.3.0.v20070530
3 RESOLVED UseOSGIServiceExample_1.0.0
4 ACTIVE org.vwpolo.osgi.services_1.0.0
5 ACTIVE org.eclipse.equinox.app_1.0.0.v20070606
6 ACTIVE org.eclipse.equinox.ds_1.0.0.v20060601a
7 ACTIVE org.eclipse.equinox.common_3.3.0.v20070426
8 ACTIVE org.eclipse.equinox.registry_3.3.0.v20070522
9 ACTIVE org.eclipse.osgi.services_3.1.200.v20070605
10 ACTIVE org.eclipse.osgi.util_3.1.200.v20070605
osgi>
我们看到 UseOSGIServiceExample 这个项目的状态没有激活,这是我们输入 start 3 (3代表OSGI框架分配的Bundle Id号),敲回车就可以看到结果了
osgi> start 3
登录成功
OSGI框架已经成功启动了,一切运行正常
osgi>
从以上这个例子可以看出 Equinox的Declarative Service实现了一个服务构件定义、加载、装配、服务查找的一个服务构件运行环境,我觉得和Spring差不多。好了,就到这里吧