osgi 参考文档
体验osgi
/*****************************************************************************/
/************authorname:Javier*******************************************/
/********* walk into the osgi **************************************************/
/*************08-09-05**********************************************************/
本文档主要包含以下内容:
1. osgi的基本概念,提出背景,所带来的基本效果。
2. 基于osgi框架(equinox)的实战
3. 开发和发布使用service,
4. bundle的状态,初探equinox console.(控制台命令)
5. Ds bundle开发 和一些其他问题
6. 开发OSGI 的JSP应用
1 osgi的基本概念, 提出背景,所带来的基本效果。
1999年3月,OSGi联盟(非盈利性质)成立,目标 是建立家庭网关,并通过互联网向家庭网络提供各种服务,例如通过web页面控制咖啡机等
2000年发布OSGi Service Platform V 1.0,2001年发布V 2.0,2003年发布V 3.0,2005年发布V 4.0,2007年发布V 4.1;
Eclipse V3.0采用OSGi,使得OSGi成功进入Java企业应用领域,并成为其中重要一员;
同时Eclipse推出了OSGi R4 RI:Equinox
Dynamic Module System For Java
F 这是OSGi最开始的定义;
F 意味着基于OSGi就可以模块化的开发Java应用;
F 意味着基于OSGi就可以模块化的部署Java应用;
F 还可以动态的管理模块。
Universal Middleware
这是OSGi近年来新取的名词,目标是让OSGi脱离语言限制,成为所有语言的统一模型。
作为一个Module System For Java,OSGi提供了这些:
F 明确的定义了什么是模块;
F 明确的定义了模块之间的交互方式;
F 支持模块化的部署。
明确定义模块
F 在OSGi中这不是一个虚拟的概念,而是一个实体:Bundle;
F Bundle是一个普通的jar,只是其META-INF中的manifest.mf中描述了一些标准的模块的信息。
明确定义模块的交互方式
F 以package方式交互:
通过Export-Package对外提供packages;
通过Import-Package使用其他模块的packages;
Package支持版本机制;
F 以service方式进行交互:
符合面向接口原则;
支持IoC方式注入;
面向服务的组件模型,
支持模块化的部署
F Bundle可通过多种方式部署到OSGi框架中,例如命令行、web界面、目录等等;
Dynamic
F 支持模块生命周期的动态管理;
v 意味着可以动态的安装、启动、停止、更新和删除模块;
F 支持模块中Service生命周期的自动管理;
– 意味着自动动态的发现所需的服务并注入;
– 意味着当所注入的服务不可用时将自动删除;
F 支持动态的进行配置管理(类似JMX)
– 意味着可以在运行期动态的调整配置;
– 配置动态调整时自动通知相应感兴趣的组件。
谁在用OSGi
v IBM
F Websphere
F RSA
v BEA
F microServices,所有BEA的产品都基于microServices上;
v JBoss AS 5.0
v Sun Glassfish V3
v Eclipse
v Apache
F Struts 2
v Spring
F Spring-DM、Spring Application Platform
v Simens,Nokia,BMW,Cisco,SAP,Oracle,IONA等等
v 最近推出的很多新产品都会写上based on OSGi or run on OSGi
2 基于osgi框架(equinox)的实战
1. 先准备工具基于equinox 先下载自己工程需要的包,然后检查工具有没有准备好,在运行中的RUN中建立一个 Equinox OSGI Framework 选上你需要的包点运行.
在控制台上看有没有错误,如果出现 Address already in use:jvm_Bind则说明
本机的80端口已被占用,在arguments—VM arguments:输入-Dorg.osgi.service.http.port=8080 ,8080是自己可设置的,点RUN.出现OSGI>
在后面输入SS回车看到启动包的状态,全是ACTIVE就是配置正确.
2. 开发BUNDLE
1. 建立PLUG-IN PROJECT *在AN OSGI FRAMEWORK:选上STANDARD这里是标准OSGI
2. PLUG—IN ID指的是BUNDLE的唯一标识.
CLASSPATH指BUNDLE运行时的类路径和前面的OUTPUT FOLDER设置BIN相同
3. 建立一个对外提供接口的包,在META-INF/MANIFEST.MF中的RUNTIME标签中,在EXPORT PACKAGE中ADD就添加完成
4. 然后在MANIFEST.MF中能看见提供出去的包,在下个BUNDLE中的IMPORTED PACKAGES 中接收;
5. 完成后点运行看是不是启动成功.
3 开发和发布使用service
ACTIVATOR文件中START 和STOP 两方法管理BUNDLE生命周期,
CONTEXT.REGISTERSERVICE(服务标识名,服务实例,实例属性);
用这个方法通过OSGI的 BUNDLECONTEXT 来注册SERVICE.
返回SERVICEREGISTRATION 对象;
在STOP方法中通过这样的方法卸载注册,
SERVICEREGISTRATION.UNREGISTER();
用这个方法得到服务;
ServiceReference ref = context.getServiceReference(HttpService.class.getName());
用这个段代码注册SERVLET;
HttpService http = (HttpService) context.getService(ref);
Servlet servlet=new Servlet(context);
http.registerServlet("/demo/login", servlet, null, null)
发布:
1建立一个EQUINOX运行环境:
在硬盘上建立一个DEMO的目录,从ECLIPSE/PLUGINS目录下复制 org.eclipse.osgi.jar到本目录下,该名equinox.jar.编写一个RUN.DAT;
内容为:
Java -Dorg.osgi.service.http.port=8080 –jar equinox.jar –console
如果不需要指定端口的话;
Java –jar equinox.jar –console
双击 run.bat 如果看到osgi> 就是启动成功,这时候SS里面就一个SYSTEM BUNDLE,导出各BUNDLE工程为JAR,把他们复制到目录下,将需要的包也复制过来到 DEMO目录,这时运行RUN.DAT 然后 install reference:file:bundles/要安装的bundle这样把他们都装上 然后用start ID号这样就启动好了,用SS检查状态,都是ACTIVE表示发布成功.
4. bundle的状态,初探equinox console.(控制台命令)
安装、启动、停止、更新和删除模块
状态:INSTALLED 成功安装(但有错误)
RESOLVED 暂停 (BUNDLE 中所需要的类都已经可以使用)
ACTIVE 已经启动,并正在运行
STARTING 正在启动中
STOPPING 正在停止中
UNINSTALLED 已经被卸载了
控制台命令:
START 开启后面+ID
STOP 停止后面+ID
UPDATE 更新
DIAG (ID) 诊断程序包
INSTALLED 安装+路径
SERVICE 正确过滤器
5. Ds bundle开发 和一些其他问题
要建DS的BUNDLE首先在工程下建OSGI-INF目录.建Component.xml
Component.xml配置:组件
<?xml version="1.0" encoding="UTF-8"?>
<component name="chen">-在着提供了一个名字为CHEN的组建
<implementation class="org.riawork.demo.service.user.impl.ConfigFileValidatorImpl"/>--实现的是着个类
<service>
<provide interface="org.riawork.demo.service.user.Validator"/>---对外提供的接口
</service>
<reference name="HttpService" interface="org.osgi.service.http.HttpService"
bind="setHttpService" unbind="unsetHttpService" policy="dynamic"/>--引用的接口
---------BIND和UNBIND是引用接口的方法
</component>
本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/javierhui111/archive/2009/01/18/3830894.aspx