Java Web应用集成OSGI(2)

这里选用了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中添加

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/91563148a67240b128c55c7eca1eb6d6.html