云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > osgi初学者

osgi初学者

  • 62 次阅读
  • 3 次下载
  • 2026/4/26 20:01:28

******************************************************************************** osgi初学者:LiuZijun *

* 网上的资料不是很多,也都千篇一律,有的都有,没有的则都没有,并没有系统的一个学习过程。 *

* 以下为本人学习OSGI、Spring DM Server、Equinox以及Felix的过程描述及心得体会,希望能给其他OSGI初学者们提供有限的帮助,少走一些弯路。* * 欢迎大家指正。 *

*******************************************************************************

1、在eclipse中开发plug-in project插件工程,配置插件工程运行的osgi环境:在run configuration中新建osgi framework,并且配置工程运行所需要的bundles

2、创建自定义的service服务,并且尝试以factory模式来完成服务的单例化,并且将service的接口export成其他bundle能访问的接口,再尝试在不同的bundle间通过ServiceTracker的方式跟踪访问已经export的service接口,试验结果都ok。

3、尝试将一个插件工程中的service封装成一个bean,交由spring的beanfactory管理,并且将此bean对外发布成一个在osgi容器中能被其他bundle使用的bean。(在meta-inf目录下需要一个spring目录,并且需要xxx.xml和一个xxx-osgi.xml文件,分别将service声明成bean并且将其发布;其他bundle工程通过配置文件注入的方式引用这些bean),结果ok,发布成功,并且其他bundle对其引用也成功。

4、在bundle工程中,初始化配置文件中的各个bean,需要使用FileLocator.toFileURL(context.getBundle().getResource(\的方式来获得插件中的资源文件,通过XmlBeanFactory来构建该资源文件的bean工厂,这其中需要注意的是,插件正常运行需要eclipse的插件包(org.eclipse.equinox.common、org.eclipse.equinox.registry、org.eclipse.equinox.app、org.eclipse.equinox.preferences、org.eclipse.core.contenttype、org.eclipse.core.jobs、org.eclipse.core.runtime),在eclipse的run configuration中的target platform将该7个插件包勾选上。

5、通过配置文件的注入其他bundle发布的beanA,在本bundle的beanB中能成功的将其引入并注入并能正常访问beanA中的属性和方法,但是如果通过beanfactory的方式来获得beanA,则不成功,beanfactory中显示exist该beanA,但通过getBean的方式获取时,却会出现异常,导致插件工程启动的失败,原因未查明。 6、尝试将一个插件工程改造成一个web工程,需要手动在工程中新建web-inf目录、web.xml文件,还有html页面,编写的servlet未能访问成功,其中侦听的bean也未初始化成功,但未报错,osgi容器显示该web工程active成功。osgi容器内置的web容器是tomcat5.5.3。

7、需要注意的是,在eclipse中如果要将工程改造成web工程,除了需要spring的基础包外,还需要引入slf4j.api、slf4j.log4j、slf4j.org.apache.commons.logging与org.apache.log4j这四个包,然后新建一个fragment project,并且在Host Plug-in的plug-in ID中选择com.springsource.org.apache.log4j,而后在工程创建后,需要在该工程src目录下添加log4j.properties文件,将此插件工程启动成功后,才能正常启动web工程

8、下载安装Spring DM Server 9、启动成功,但是未发现其中的tomcat-config配置有何用(除了改变管理界面访问的端口),或者说未明白在其中怎么像在纯tomcat中一样部署web应用 10、可以将一个最简单的web应用打成war包,放进pickup目录,server可以进行热启动,但未明白启动后的web应用如何访问。

11、在eclipse上开发所需要的bundle,并且编写所需要的service服务,而后从eclipse中打包出一个jar文件,供spring DM Server服务器中使用。其中需要设置bundle工程runtime中的classpath,以及build中的binary build,然后export成deployable plug-in and fragments,最后会产生一个xxxx.1.0.0.jar文件。

12、在已经启动成功的spring DM Server中,我们有两种热加载插件的方式:(1)、通过admin console的界面将jar包upload上去;(2)、找到服务器中的pickup目录,将jar包直接拷贝进去,DM Server服务器会自动扫描该目录并且进行热启动。

13、在Spring DM Server上测试成功运行自开发的bundle并且bundle之间能互相调用。如果其中服务是以bean方式声明管理,并且bean的获取是以beanfactory方式,则需要将前面第4点中所提到的7个eclipse插件包按照上述的顺序一个个加载到服务器中,(将一些要依赖的基础插件包直接放入服务器的lib和repository目录中无效,按照理论理解应该会有效的),然后再加载相应的bundle。

14、经查资料和不断地实验,发现,某个bundle将某个service发布成osgi容器中识别的bean,除了可以通过注入的方式引入到其他bundle的bean中,还能在其它的bundle中直接通过bundleContext来获取服务,就和获取其他通过factory注册的服务一样,而不再需要初始化一个beanfactory并且通过getBean来获得,从而解决了上述第5点的问题。

15、总结一下将某个bundle中的service发布成osgi容器中能被其他bundle访问的service

有三种方式: (1)、直接通过bundleContext进行注册 例如: ServiceRegistrationhelloServiceRegistration; HelloServicehelloService = new HelloServiceImpl(); helloServiceRegistration = context.registerService(HelloService.class.getName(), helloService, null); (2)、可以通过factory registe的方式进行注册,首先创建一个xxxxFactory的类实现ServiceFactory接口,并且在类中复写getService和ungetService的方法,然后通过这个xxxxFactory对服务进行注册。 例如: HelloServiceFactoryhelloServiceFactory = new HelloServiceFactory(); helloServiceRegistration = context.registerService(HelloService.class.getName(), helloServiceFactory, null);

(3)、可以通过配置文件来声明,在meta-inf目录中新建spring目录,在spring目录中新建xxxx.xml和xxxx-osgi.xml文件,在文件中进行配置 例如: myService.xml文件:

myService-osgi.xml文件:

ref=\

16、为避免DM Server的启动过分的依赖bundle的加载顺序问题,我们在开发bundle时,如果插件有启动器(BundleActivator),那么应该避免在start方法中做过多的处理.

17、之前开发编写的bundle都是接口和实现糅合在同一个bundle中的,这不符合osgi的开发原则,osgi的开发原则是接口和实现的分离,有一个或多个bundle专门编写提供服务的接口interface,而由另外的bundle分别来实现这些接口,并且实现的bundle要遵循松耦合、高内聚的原则,也就是说每一个实现bundle中最好只有一个接口实现。 (1)先开发一个接口bundle,与开发其它bundle类似,只是该bundle不需要启动器BundleActivator,而只需要编写我们所需要的接口以及接口中的方法,将该bundle中的接口包设置成export-package,供其它实现bundle以及服务的消费者引用。 (2)开发多个实现bundle,来实现上面第一步中的interface,在imported-packages中引入上述interface包,编写具体的实现类,然后在spring配置文件中将实现类发布成osgi容器中的bean xxxxImplement.xml文件:

interface=\

(3)除了上述的发布实现类的方法,还可以脱离spring的配置文件,以直接注册的方式来发布,在实现类的bundle中添加一个启动器BundleActivator,在启动器的start方法中直接编写如下代码: ServiceRegistrationxxxxImplementRegistration; XXXXInterfacexxxxInterface = new XXXXImplement(); xxxxImplementRegistration = context.registerService(XXXXInterface.class.getName(), xxxxInterface, null);

(4)服务消费者bundle面向接口编程,不需要关注接口的具体实现,例如在bundle的启动器BundleActivator的start方法中: myInterfaceReference = context.getServiceReference(MyInterface.class.getName()); MyInterfacemyInterface = (MyInterface) context.getService(myInterfaceReference); myInterface.doService(); //通过下面的代码获取实现该interface的所有的实现类服务,而后能自定义决定该消费哪个具体的实现服务 ServiceReference[] refs = context.getAllServiceReferences(MyInterface.class.getName(), null);

18、试验bundle的热插拔,为了验证被引用的实现类bundle进行了修改,在热插拔后,引用该bundle的其它bundle能否使用新的实例继续运行。在消费者bundle中实现一个timerTasker,循环调用实现类bundle中服务的某个方法,而后启动osgi容器,查看消费者bundle这个timer任务的执行情况;然后对实现类bundle中的服务进行修改,并且将实现类bundle进行热插拔重新install,再查看消费者的timer任务是否按新的服务在执行,经过试验得出结论: (1)、若在timerTasker中直接获得是实现类bundle中service实例的引用,则即使实现类进行修改并且重新install后,timerTasker任务也不会按照新的service实例中的服务运行。 (2)、若在timerTasker中通过服务接口的跟踪器myInterfaceTracker来获得该接口中具体的实现,从而再对获得的实现bundle进行使用的话,热插拔有正确效果。

19、试验在bundle中引入第三方的jar包,并且将jar包中的各个package发布,export后其它bundle能调用该第三方包中的类。 (1)、新建一个bundle,专门用来发布第三方的jar包,在bundle工程中新建一个lib目录,存放这些jar包 (2)、在bundle的runtime配置中的Classpath中引入第三方的jar包 (3)、在build中的binary build中将lib目录选上 (4)、在runtime中的exported-packages中添加jar包中需要发布的package (5)、在消费者bundle中的dependencies中imported-package配置中添加需要的第三方jar包中的package,这样在消费者bundle中就能使用jar中的类库了。

20、一般各个bundle之间会有一定的依赖关系,而实施人员并不清楚其中具体的关系,从而给实施工作带来困难和麻烦,所以我们在开发bundle的时候,一般将bundle的启动设置

搜索更多关于: osgi初学者 的文档
  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

******************************************************************************** osgi初学者:LiuZijun * * 网上的资料不是很多,也都千篇一律,有的都有,没有的则都没有,并没有系统的一个学习过程。 * * 以下为本人学习OSGI、Spring DM Server、Equinox以及Felix的过程描述及心得体会,希望能给其他OSGI初学者们提供有限的帮助,少走一些弯路。* * 欢迎大家指正。 * ******************************************************************************* 1、在

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com