这里选用了Apache Felix来开发,主要是因为Apache Felix是Apache的顶级项目。社区活跃,对OSGI功能支持比较完备,并且文档例子比较全面。
其实OSGI支持两种方式来部署Bundle。
单独部署OSGI容器,通过OSGI自带的Web中间件(目前只有jetty)来对外提供Web服务
将OSGI容器嵌入到Web应用中,然后就可以使用Weblogic等中间件��运行Web应用
从项目的整体考虑,我们选用了第二种方案。
BundleActivator开发开发Bundle时,首先需要开发一个BundleActivator。OSGI在加载Bundle时,首先调用BundleActivator的start方法,对Bundle进行初始化。在卸载Bundle时,会调用stop方法来对资源进行释放。
public void start(BundleContext context) throws Exception; public void stop(BundleContext context) throws Exception;
在start方法中调用context.registerService来完成对外服务的注册。
Hashtable props = new Hashtable(); props.put("servlet-pattern", new String[]{"/login","/logout"}) ServiceRegistration servlet = context.registerService(Servlet.class, new DispatcherServlet(), props);
context.registerService方法的第一个参数表示服务的类型,由于我们提供的是Web请求服务,所以这里的服务类型是一个javax.servlet.Servlet,所以需要将javax.servlet.Servlet传入到方法中
第二个参数为服务处理类,这里配置了一个路由Servlet,其后会有相应的程序来处理具体的请求。
第三个参数为Bundle对外提供服务的属性。在例子中,在Hashtable中定义了Bundle所支持的servlet-pattern。OSGI容器所在Web应用通过Bundle定义的servlet-pattern判断是否将客户请求分发到这个Bundle。servlet-pattern这个名称是随意起的,并不是OSGI框架要求的名称。
应用服务集成OSGI容器首先工程需要添加如下依赖
<dependency> <groupId>org.apache.felix</groupId> <artifactId>org.apache.felix.framework</artifactId> <version>5.6.10</version> </dependency> <dependency> <groupId>org.apache.felix</groupId> <artifactId>org.apache.felix.http.bundle</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>org.apache.felix</groupId> <artifactId>org.apache.felix.http.bridge</artifactId> <version>3.0.18</version> </dependency> <dependency> <groupId>org.apache.felix</groupId> <artifactId>org.apache.felix.http.proxy</artifactId> <version>3.0.0</version> </dependency>
然后在web.xml中添加