ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:130.83KB ,
资源ID:17297898      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/17297898.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(精品人人都会OSGI实例讲解OSGI开发文档格式.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

精品人人都会OSGI实例讲解OSGI开发文档格式.docx

1、从企业应用开发者的角度看,OSGI容器侵入性非常小,你可以方便地将其嵌入一个企业应用。举个例子来说,假设你在开发一个复杂的web应用。你希 望将这个应用分解成多个功能模块。一个View层模块,一个Model层模块,一个DAO模块。使用嵌入式OSGI容器来跨依赖地管理这些模块可以让你随 时更新你的DAO模块却不需要重启你的服务器。只要你的应用完全符合OSGI规范,它就可以在所有符合OSGI规范的容器内运行。现在,有三种流行的开源OSGI容器:1.Equinox是OSGI Service Platform Release 4的一个实现。是Eclipse 模块化运行时的核心。2.Knopflerfi

2、sh另一个选择。3.Apache Felix是Apache软件基金会赞助的一个OSGI容器在这篇文章里我们使用Equinox作为我们的OSGI容器。尝试开发一个Hello World bundle 在OSGI的领域,发布的软件是以bundle的形式出现。bundle由java class类和资源文件组成,向设备所有者提供功能,同时可以为其他的bundles提供服务。Eclipse对开发bundles提供了强大的支持。 Eclipse不仅仅提供创建bundles的功能,它还集成了Equinox这个OSGI容器,你可以在其上开发和调试OSGI组件。其实所有的 Eclipse插件都是使用Eclips

3、e规范代码写的OSGI bundle。接下来,你将可以学到如何使用Eclipse IDE开发一个Hello world osgi bundle。开始开发bundle 我们一步步的开始:1.启动Eclipse,依次点 File - New - Project。2.选择Plug-in Project,next。3.输入Project Name项目名称,比如com.howard.sample.HelloWorld,Target Platform(目标平台)里的an OSGI framework,选择standard。4.剩下的保持默认,next。5.下个对话框也默认,next。6.然后选择Hello

4、 OSGI Bundle作为模版。Finish。Eclipse会飞快的为你创建Hello world bundle的模版代码。主要包含两个文件:Activator.java和MANIFEST.MF。Activator.java的代码如下所示:Java代码 1.importorg.osgi.framework.BundleActivator;2.importorg.osgi.framework.BundleContext;3.publicclassActivatorimplementsBundleActivator4.publicvoidstart(BundleContextcontext)th

5、rowsException5.System.out.println(Helloworld);6.7.stop(BundleContext8.GoodbyeWorld9.10. 如果你的bundle在启动和关闭的时候需要被通知,你可以考虑实现BundleActivator接口。以下是定义Activator的一些注意点:1.你的Activator类需要一个公有的无参数构造函数。OSGI框架会通过类反射的方式来实例化一个Activator类。2.容器启动bundle过程中负责调用你的Activator类的start方法。bundle可以在此初始化资源比如说初始化数据库连接。 start方法需要一个参

6、数,BundleContext对象。这个对象允许bundles以取得OSGI容器相关信息的方式和框架交互。如果某一个 bundle有异常抛出,容器将对该bundle标记为stopped并不将其纳入service列表。3.容器关闭的时候会调用你的Activator类方法stop(),你可以利用这个机会做一些清理的操作。MANIFEST.MF 这个文件是你的bundle的部署描述文件。格式和Jar里的MANIFEST.MF是一样的。包含的不少名值对,就像如下:Xml代码 1.Manifest-Version:1.02.Bundle-ManifestVersion:23.Bundle-Name:He

7、lloWorldPlug-in4.Bundle-SymbolicName:com.howard.sample.HelloWorld5.Bundle-Version:1.0.06.Bundle-Activator:com.howard.sample.helloworld.Activator7.Bundle-Vendor:HOWARD8.Bundle-RequiredExecutionEnvironment:JavaSE-1.69.Import-Package:org.osgi.framework;version=1.3.0分别来看下:Bundle-ManifestVersion 数值为2意味着本

8、bundle支持OSGI规范第四版;如果是1那就是支持OSGI规范第三版。Bundle-Name 给bundle定义一个短名,方便人员阅读Bundle-SymbolicName 给bundle定义一个唯一的非局部名。方便分辨。Bundle-Activator 声明在start和stop事件发生时会被通知的监听类的名字。Import-Package 定义bundle的导入包。Hello World bundle完成了,接下来我们运行一下。执行bundle 1.点击Run - Run Configuration2.在左边的OSGI Framework选项里右键 new ,创建一个新的OSGI Ru

9、n Configuration3.名字随便取好了,我们取个OSGi hello world。4.你会注意到中间的窗口里Workspace项目里有一子项 com.howard.sample.HelloWorld,将其勾选上,其他的不用管。这时的状态应该如下图。5.点击Run按钮。在控制台你应该可以看见点东西了。那是叫做OSGI控制台的东东。与子相伴,还有一个Hello world。OSGI控制台 OSGI控制台是一个OSGI容器的命令行界面。你可以利用它做些诸如启动,关闭,安装bundles,更新和删除bundles等操作。现在,点击OSGI控制台所在的位置,回车,你就会发现可以输入命令了。这时

10、的OSGI控制台应该如下图:下面列出一些常用的OSGI命令,你可以试着和OSGI容器交互。ss 显示已安装的bundles的状态信息,信息包括bundle ID,短名,状态等等。start 启动一个bundlestop 关闭一个bundleupdate 载入一个新的JAR文件更新一个bundleinstall 安装一个新的bundle到容器中uninstall 卸载一个已在容器中的bundle依赖管理 OSGI规范允许你把你的应用分解成多个模块然后管理各个模块间的依赖关系。这需要通过bundle scope来完成。默认情况下,一个bundle内的class对其他bundle来说是不可见的。那么

11、,如果要让一个bundle访问另一个 bundle里的class要怎么做?解决的方案就是从源bundle导出包,然后在目标bundle里导入。接下来我们对此做一个例子。首先,我们需要先创建一个com.howard.sample.HelloService bundle,我们将通过它导出一个包。然后,我们在com.howard.sample.HelloWorld 这个bundle里导入包。导出包 1、创建名为com.howard.sample.HelloService的bundle,创建步骤和前面一样。2、在这个bundle内,添加一个com.howard.sample.service.Hello

12、Service.java 接口,代码如下:1.publicinterfaceHelloService2.StringsayHello();3.3、创建一个com.howard.sample.service.impl.HelloServiceImpl.java类实现刚才的接口:HelloServiceImplHelloServicesayHello()3.InsideHelloServiceImple.sayHello()returnSayHello;6.4、打开MANIFEST.MF,选择Runtime标签项,在Exported Packages选项栏,点击Add并且选择com.howard.

13、sample.service这个包。然后MANIFEST.MF的代码应该如下:com.howard.sample.HelloServicecom.howard.sample.helloservice.Activator10.Export-Package:com.howard.sample.service你可以看到,MANIFEST.MF文件和刚才的HelloWorld的那份很类似。唯一的区别就是这个多了Export-Package这个标记,对应的值就是我们刚才选择的com.howard.sample.service。Export-Package标记告诉OSGI容器在com.howard.sam

14、ple.service包内的classes可以被外部访问。注意,我们仅仅暴露了HelloService接口,而不是直接暴露HelloServiceImpl实现。导入包 接下来我们要更新原来的HelloWorld bundle以导入com.howard.sample.service包。步骤如下:1、进入HelloWorld bundle,打开MANIFEST.MF,进入Dependencies标签页,在Imported Packages里添加com.howard.sample.service。MANIFEST.MF文件应该如下所示:com.howard.sample.service,10.没错,

15、Import-package标记的值也就是导入的包名之间是用逗号隔开的。在这里导入了两个包om.howard.sample.service和org.osgi.framework。后者是使用Activator类时必须导入的包。2、接下来,打开HelloWorld项目下的Activator.java文件,这时候你会发现可以使用HelloService这个接口了。但 还是不能使用HelloServiceImpl实现类。Eclipse会告诉你:Access restriction(立入禁止)。Class级别可见域 为什么OSGI容器可以做到让jar包中的一些classes可见而另一些又不可见呢。答案其

16、实就是OSGI容器自定义了java class loader来有选择的加载类。OSGI容器为每一个bundle都创建了不同的class loader。因此,bundle可以访问的classes包括Boot classpath:所有的java基础类。Framework classpath:OSGI框架级别的classloader加载的类Bundle classpath:Bundle本身引用的关系紧密的JAR的路径Imported packages:就是在MANIFEST.MF里声明的导入包,一旦声明,在bundle内就可见了。bundle级别的可见域允许你可以随时放心的更改HelloServic

17、eImpl实现类而不需要去担心依赖关系会被破坏。OSGI服务 OSGI框架是实现SOA的绝佳土壤。通过它可以实现bundles暴露服务接口给其他bundles消费而不需要让细节暴露。消费bundles 甚至可以完全不知道提供服务的bundles。凭着可以良好的隐藏具体实现的能力,OSGI当之无愧是SOA的一种较完美的实现方案。OSGI中,提供服务的bundle在OSGI容器上将一个POJO注册成一个service。消费者bundle请求OSGI容器中基于某个特殊 接口的注册service。一旦找到,消费者bundle就会绑定它,然后就可以调用service中的方法了。举个例子会更容易说明。导出

18、services 1、确保com.howard.sample.HelloService里的MANIFEST.MF导入org.osgi.framework包2、创建com.howard.sample.service.impl.HelloServiceActivator.java,代码如下:HelloServiceActivatorServiceRegistrationhelloServiceRegistration;OverridehelloService=newHelloServiceImpl();helloServiceRegistrationcontext.registerService(

19、HelloService.class.getName(),helloService,null);helloServiceRegistration.unregister();OK,我们就是用BundleContext的registerService方法注册service的。这个方法需要三个参数。service的接口名。如果service实现了多个接口,那样你需要传入一个包含所有接口名的String数组。在这里我们传入的是HelloService这个接口。真正的service实现。在例子中我们传了一个HelloServiceImpl实现。service属性。这个参数可以在有多个service实现同

20、一个接口的情况下,消费者用来区分真正感兴趣的service。3、最后一步就是修改HelloService的MANIFEST.MF文件,将Bundle-Activator改成com.howard.sample.service.impl.HelloServiceActivator现在HelloService bundle已经随时准备将HelloServiceImpl服务发布了。OSGI容器启动HelloServie bundle的时候会让HelloServiceActivator运作,在那个时候将HelloServiceImpl注册到容器中,接下来就是创建消 费者的问题了。导入service 我们

21、的消费者就是HelloWorld bundle,主要修改的就是其中的Activator.java,修改代码如下:ServiceReferencehelloServiceReference;World!helloServiceReference=context.getServiceReference(HelloService.class.getName();helloService=(HelloService)context.getService(helloServiceReference);System.out.println(helloService.sayHello();context.u

22、ngetService(helloServiceReference);代码很简单,就不多说了。在运行之前我们在Run-Run Configurations对话框里,把HelloWorld和HelloService这两个bundle前面的钩都打上。然后运行时你会发现HelloServiceImpl.sayHello()方法已经被调用了。在OSGI控制台输入ss并回车,所有容器内的bundle状态一目了然。其中id为0的bundle是OSGI框架基础bundle,另两个就是 HelloService和HelloWorld了,它俩的id是随机的,状态是ACTIVE也就是已启动状态。假设HelloService的id为 7,HelloWorld为8。输入stop 8就可以暂停bundl

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

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