利用felix和struts2实现osgi web.docx

上传人:b****6 文档编号:7617271 上传时间:2023-01-25 格式:DOCX 页数:30 大小:263.34KB
下载 相关 举报
利用felix和struts2实现osgi web.docx_第1页
第1页 / 共30页
利用felix和struts2实现osgi web.docx_第2页
第2页 / 共30页
利用felix和struts2实现osgi web.docx_第3页
第3页 / 共30页
利用felix和struts2实现osgi web.docx_第4页
第4页 / 共30页
利用felix和struts2实现osgi web.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

利用felix和struts2实现osgi web.docx

《利用felix和struts2实现osgi web.docx》由会员分享,可在线阅读,更多相关《利用felix和struts2实现osgi web.docx(30页珍藏版)》请在冰豆网上搜索。

利用felix和struts2实现osgi web.docx

利用felix和struts2实现osgiweb

利用felix和struts2实现osgiweb——实例讲解

文章分类:

Java编程

系列文章请参看文章列表:

http:

//xingtongkun-tom-

系列文章一:

使用Felix和Struts2开发Web应用

原文地址:

OpenServiceGatewayInitiative(OSGi)是一个针对Java动态模块开发的规范。

基于中间件的OSGi技术提供了一个面向服务,基于组件的开发环境,并提供标准化的方式来管理整个软件生命周期。

OSGi为那些需要长时间运行,动态更新并且对运行环境的影响尽可能小的系统提供了很好的支持。

基于OSGi开发的系统具有复杂度低、可重用、动态部署、可持续运行、开发简单等特点。

OSGi技术结合了上述特点的各方面来定义一个动态服务部署框架,可以进行远程管理。

OSGi技术起初只是关注于嵌入式领域,诸如机顶盒、服务网关、手机等应用环境。

但是它完美地适用在任一模块化、面向组件、面向服务的项目。

EclipseV3.0以后采用OSGi作为其模块化和动态化平台,设计了Equinox内核,使用OSGi技术帮助其进行类载入,大大提升了Eclipse的启动速度。

在应用服务器上,WebSphere,Weblogic,JBOSS等著名的服务器都支持或使用了OSGi技术。

Felix是一个Apache旗下OSGi实现的开源框架,它的最终的目标是提供一个完全兼容的OSGi框架和标准服务的实现。

Felix当前实现了OSGi规范4的大部分内容,目前Felix提供的OSGi框架功能是非常稳定的。

采用SpringDM和Jetty等Web容器开发基于OSGi的Web应用的方法已经在很多书本或技术文章上提及。

但是这种开发方法与传统的Web开发差别较大,开发人员很难转换到这种开发模式上,并且它的稳定性也没有得到充分的验证。

很多Web开发都采用Struts作为其控制层,很幸运的是,最新发布的Struts2.1.8.1中,加入了对FelixOSGi的支持,能够在传统的Web开发中集成OSGi的模块管理平台,而且开发方法没有太大的改变,开发后的应用程序仍像原先一样可以方便的部署在Tomcat,JBoss等容器上。

本文将通过下面的示例,详细讲述如何使用Felix和Struts开发Web应用。

下面讲解的示例是一个获取时间信息并在Web浏览器中显示的简单示例,该示例主要介绍了怎样使用Felix和Struts结合起来开发Web应用。

该示例中有两个获取时间信息的bundle,这两个bundle实现同一个接口服务,但是有不同的实现,这两个bundle可以在应用中动态部署。

通过该示例,可以体现出基于OSGi开发的项目具有良好的模块化以及OSGi的bundle动态部署的能力,从而说明了OSGi适用于开发持续运行且需要动态更新的系统。

在这个示例中,一共包括五个工程,一个WebApplication工程和四个OSGibundle工程。

WebApplication工程是用于Web部署。

四个OSGibundle中,包括一个Webbundle,用于Web交互;一个timeservicebundle,包含一个获取时间信息的接口服务;一个localtimeservicebundle,实现接口服务,用于获取本地时间信息;一个utctimeservicebundle,用于获取世界标准时间(UniversalTimeCoordinated,UTC)信息。

本示例的结构原理如图1所示。

在WebContainer中注册了StrutsOSGi的监听器,该监听器会去启动或停止ApacheFelixHost,ApacheFelixHost是StrutsOSGiPlugin和FelixFramework的连接点。

FelixHost会去创建和初始化FelixFramework,FelixFramework负责管理系统中的其余的所有bundle,StrutsOSGiPlugin会监听bundle的变化,如果发生变化的bundle是一个Strutsbundle,则会去加载Struts的配置。

图1.示例结构原理图

建立OSGi的Web开发环境

本文示例使用的Web开发环境包括如下组件,部分框架可以参考资料中下载。

∙Eclipse3.5forJavaEEDevelopers

∙SunJDK1.6.0

∙Tomcat6.0.24

∙Struts2.1.8.1(EssentialDependenciesOnly)

∙spring-osgi-1.1.2-with-dependencies(OnlyNeedwhenaddingSpringSupport)

WebApplication工程的创建方式与通常的Web工程类似,但是需要加入Felix的支持和Struts2OSGiPlugin.Felix是OSGi的平台,用于管理整个系统中的所有的bundle,而Struts2OSGiPlugin是Struts2和OSGi连接的桥梁,通过Struts2OSGiPlugin将Felix融入到Struts2框架中。

另外,还需要加入Struts2OSGiAdminbundle,这个bundle向管理人员提供基于Web的管理OSGi平台中的bundle的操作入口。

同时在web.xml中需要加入StrutsOSGi监听器,这样OSGi平台中的bundle发生变化时,会触发该监听器去做一些与Struts相关测操作,例如增加Action或使Action失效。

web.xml中过滤器和监听器部分的配置内容如清单1:

清单1.web.xml过滤器和监听器配置

struts2-prepare

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter

struts2-execute

org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter

struts2-prepare

/*

struts2-execute

/*

org.apache.struts2.osgi.StrutsOsgiListener

org.apache.struts2.dispatcher.ng.listener.StrutsListener

WebApplication工程的目录结构如图2所示:

图2.WebApplication工程的目录结构

将WebApplication部署到Tomcat上并启动Tomcat,然后在浏览器中输入http:

//localhost:

8080/webapp/osgi/admin/bundles.action,(webapp是项目部署到Tomcat中的名字)如果看到了类似于图5的bundles列表,说明OSGi环境配置成功。

开发获取时间消息接口服务bundle

消息接口服务bundle是提供消息服务的接口,该接口将被Webbundle所使用,其他bundle可以不同的形式实现该接口。

在这里利用eclipse新建插件工程的功能来创建OSGibundle。

需要特别设置anOSGIframework为standard方式,这种方式允许部署项目到标准的OSGI容器中。

新建OSGi工程的向导如图3所示。

图3.新建OSGi工程向导图

在该项目中开发一个用于获取时间信息的接口,通过该接口可以获取字符串形式的时间信息。

清单2.获取时间服务接口代码

packagecom.example.time.service;

publicinterfaceTimeService{

publicStringgetTime();

}

需要将该bundle中的服务包的类和接口就暴露给了其他的bundle,其他的bundle可以通过import这个包来使用其中的类和接口。

开发获取本地时间消息实现服务bundle

获取本地时间消息服务bundle实现了时间消息接口服务。

在该bundle种返回的时间消息是当前时区的时间信息。

因为用到了接口服务包,所以需要在Import-Package中加入接口服务包。

清单3.获取本地时间实现代码

packagecom.example.time.local.service;

importjava.text.SimpleDateFormat;

importjava.util.Calendar;

importjava.util.Date;

importcom.example.time.service.TimeService;

publicclassLocalTimeServiceimplementsTimeService{

@Override

publicStringgetTime(){

Calendarcalendar=Calendar.getInstance();

Datedate=calendar.getTime();

SimpleDateFormatformatter=newSimpleDateFormat("yyyy-MM-ddHH:

mm:

ss");

return"Thelocaltime:

"+formatter.format(date);

}

}

OSGibundle中的服务要能够被其他bundle使用,使用将服务发布出来。

在该bundle的Activator的start()方法中注册该服务,可以发布这个服务。

当这个bundle启动时,将获取本地时间发布为一个服务。

服务发布的代码如清单4所示。

清单4.服务发布

publicvoidstart(BundleContextcontext)throwsException{

context.registerService(TimeService.class.getName(),newLocalTimeService(),null);

}

开发获取UTC时间消息实现服务bundle

获取UTC时间消息实现服务同样实现了时间消息接口服务,该bundle主要是用于和上一个bundle即获取本地时间消息服务进行动态的替换,用于表现OSGi的动态部署的能力。

清单5.获取UTC时间服务实现

publicclassUTCTimeServiceimplementsTimeService{

@Override

publicStringgetTime(){

Calendarcalendar=Calendar.getInstance();

intzoneOffset=calendar.get(Calendar.ZONE_OFFSET);

intdstOffset=calendar.get(Calendar.DST_OFFSET);

calendar.add(Calendar.MILLISECOND,-(zoneOffset+dstOffset));

Datedate=calendar.getTime();

SimpleDateFormatformatter=newSimpleDateFormat("yyyy-MM-ddHH:

mms");

return"TheUTCtime:

"+formatter.format(date);

}

}

开发Webbundle

Webbundle是系统Web交互的入口。

在该bundle中需要使用时间消息接口服务bundle中的接口,所有需要在MANIFEST.MF的Import-Package加入时间消息接口服务包,另外,为了能够识别出该bundle是一个Strutsbundle,需要将该bundle设置为可被Struts2支持,即在MANIFEST.MF中加入Struts2-Enabled:

true,这样该bundle中的struts.xml就会被加载。

最终的MANIFEST.MF的配置如清单6。

清单6.WebBundle的MANIFEST.MF配置

Manifest-Version:

1.0

Bundle-ManifestVersion:

2

Bundle-Name:

com-example-time-web

Bundle-SymbolicName:

com.example.time.web

Bundle-Version:

1.0.0.qualifier

Bundle-Vendor:

keki

Bundle-RequiredExecutionEnvironment:

JavaSE-1.6

Struts2-Enabled:

true

Import-Package:

com.example.time.service,

com.opensymphony.xwork2,

org.apache.struts2.osgi.interceptor,

org.osgi.framework;version="1.3.0"

为了实现用户交互,还需要创建一个获取时间消息响应的action。

该Action的execute()方法代码如清单7所示。

清单7.Action实现方法

publicStringexecute(){

ServiceReferenceref=bundleContext.getServiceReference(

TimeService.class.getName());

TimeServicetimeService=(TimeService)bundleContext.getService(ref);

timeMessage=timeService.getTime();

returnSUCCESS;

}

这个Webbundle中独立的建立一个struts.xml,这个struts.xml将会为单独加载,需要注意的是Struts的pacakge继承osgi-default这个包,osgi-default已在struts2-osgi-plugin这个jar包里面定义。

清单8.WebBundlestruts.xml的action定义

time.ftl

打包部署

将开发好的四个bundle导出成plugin的包,并将它们放在WebApp工程中,bundles的目录结构如图4所示。

图4.WebApplication中的bundles目录结构

运行演示

启动Tomcat,在浏览器地址栏输入http:

//localhost:

8080/webapp/osgi/admin/bundles.do,可以看到所系统中所有的bundle的列表。

图5.部署的bundles列表

在浏览器地址栏输入http:

//localhost:

8080/webapp/time/time.do,可以获得时间信息,此时的时间信息为本地时间信息,当前TimeService这个服务有localtimeservice和UTCtimeservice两个实现,调用的是localtimeservice这个实现。

图6.获取本地时间页面显示

此时,在浏览器地址栏输入http:

//localhost:

8080/webapp/osgi/admin/shell.do,然后输入命令stop1,将Localtimeservice这个bundle停止掉,输入命令ps,可以看到localtimeservice这个bundle的state已经变为Resolved.

图7.OSGiShell管理页面

在浏览器地址栏再次输入http:

//localhost:

8080/webapp/time/time.do得到的结果如图7所示。

图8.获取UTC时间显示页面

通过上面的演示,我们可以看到OSGibundle的动态部署能力。

回页首

bundle的管理

通过Felix可以方便的管理项目中的bundle,并且实现bundle的热部署,即插即用,即删即无的特性,特别适用于可持续运行的系统。

添加bundle

输入命令install,然后输入start即可。

如$installfile:

/k:

/plugins/com.example.time.local_1.0.0.qualifier.jar,$start7

更新bundle

输入命令update即可。

$update1file:

/k:

/plugins/com.example.time.local_1.0.0.qualifier.jar

启动和停止bundle

输入命令start启动bundle;输入命令stop停止bundle。

$start2,$stop1

卸载bundle

若bundle处于Installed或Resolve状态,则直接输入命令uninstall

若bundle处于Actived状态,则先输入命令stop停止bundle,再输入命令uninstall

如$uninstall1

回页首

常见问题

如何修改bundle的最大启动级别

在上面的示例中,bundle中最大的启动级别只能为3。

如果在bundles下面增加一个目录4,即bundles/4,则目录4中的bundle是无法启动的,而在很多时候,特别是在大型的项目中,最大启动级别为3是不能满足要求,此时可以web.xml中添加启动级别的参数。

如下面把最大启动级别设置为5。

清单9.启动级别配置

struts.osgi.runLevel

5

解决Bundle中的struts.xml的StrutsConfigurationDTD无法定位的问题

Struts.xml的头部有StrutsConfigurationDTD的引用定义,一般DTD文档的URL为http:

//struts.apache.org/dtds/XXX.dtd,示例如下所示:

清单10.struts.xml头部dtd

DOCTYPEstrutsPUBLIC"-//ApacheSoftwareFoundation//DTDStruts

Configuration2.0//EN"

"http:

//struts.apache.org/dtds/struts-2.0.dtd">

如果无法连接上http:

//struts.apache.org/,那么在加载Struts的bundle时也将会出错,因为bundle与WebApplication的lib的加载路径不一致,无法从WebApplication的lib下面找到XXX.dtd文件。

此时可以通过修改dtd文件的URL来解决,可以改成一个本地文件系统的URI,如file:

/c:

/webapp/dtds/struts-2.0.dtd,也可以改为本地的Web服务器或一个可以连接上的服务器的URL,如http:

//localhost/dtds/struts-2.0.dtd。

如何使用Spring进行对象管理

SpringDM使得Spring和OSGi成为可能,在本文的开发环境中,也可以加入SpringDM来管理系统中的对象。

首先加入SpringDM必要的jar包,如

清单11.Sp

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1