你们也在用osgi吗?

时间:2022-05-05
本文章向大家介绍你们也在用osgi吗?,主要内容包括模块化的规范、谁在用osgi、osgi中的Bundle、osgi中的service、osgi开发环境的搭建、实例osgi、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

模块化的规范

在Java中现在是没有一个模块化的概念的,或者说没有一个事实上的标准。就是如何组成一个模块,然后哪些模块是给内部使用,哪些模块是给外部使用的。

OSGI就可以解决上面的问题,应用程序可以像搭积木一样完成搭建,例如对于一个正在运行的系统,压根日志服务,但目前系统中没有提供日志服务的模块,那么可以直接开发出相应的日志服务模块,然后动态的加载到系统中,不需要重新启动服务,只需要动态的注册就可以,这样日志服务就可以使用了。

这是一个使用osgi的开源系统

ToyBricks(积木)(以下简称ToyBricks)是基于面向积木方法论构建的、面向Java开发(尤其是RIA应用)的开源开发平台, 旨在提供给开发者一个简单易用、高效率、高产品质量、易扩展的开源平台,“像搭积木一样开发软件”。

详细介绍的地址:

http://www.iteye.com/news/23015

谁在用osgi

其实搞过开发的大概都知道,业界中鼎鼎大名的eclipse就是基于osgi来开发的。

并且很多大的应用厂商也在使用osgi进行模块化的开发。

包括spring、ibm的websphere和oracle的weblogic都已经宣布了支持osgi,这也同样可以看出,成为业界的标准可能就是下一步的问题。

osgi中的Bundle

bundle其中有包的意思,这个是osgi中比较核心的一个概念,也就是说我们控制osgi就是通过bundle来进行控制的。

bundle可以被动态的安装、启动、停止和卸载。并且Bundle也是服务和组件的载体。

看看Bundle Jar File的结构图:

Bundle的生命周期状态图:

Bundle状态解析:

•INSTALLED — 成功安装bundle。

•RESOLVED — 所有bundle需要的Java类可用。这个状态标志着 bundle已经是启动就绪或者是已经停止。

•STARTING — 正在启动bundle。调用了bundle激活器的start方法,而且还没有从方法中返回。

•ACTIVE — bundle已经启动完毕,正在运行中。

•STOPPING — 正在停止bundle。调用了bundle激活器的stop方法,而且还没有从方法中返回。

•UNINSTALLED — bundle已经卸载完毕,不能进入其他状态。

Class Loading的概念图:

再看看服务注册

看看上边这个图是不是非常熟悉,典型的一个服务注册,发布,寻址的结构图,跟SOA的架构基本一致,也就是说osgi也是实现soa技术的方式之一。

通过上面的介绍,可以看出,其实Bundle就是我们手中的积木,通过osgi的框架把这些积木组织在一起,就形成了系统。

Bundle间的交互方式有两种:

1)通过package的Export和Import来进行。

2)另一种方式是通过Service的方式进行。

osgi中的service

定义了动态协作模型,该模型是一个发布、查找和绑定的模型。

Bundle可以注册服务、搜索服务、监听服务。通过BundleContext完成注册和获取服务,通过ServiceListener监听服务的状态。

OSGi 4推出了Declarative Services(DS) DS 提出了完整的 Service-Oriented Component Model (SOCM),面向服务的组件化模型—更好支持服务注册、获取、监听。

Component存在于Bundle中,可以相互调用。

SOCM的示意图如下:

osgi开发环境的搭建

选择eclipse3.1之后的版本的eclipse.

选择Run->Run Configuration

打开如下界面

在OSGI Framework上点击右键,新建,将显示所有的Bundles

取消所有Bundles的选择,只选择org.eclipse.osgi这个Bundle

运行,如果控制台中出现osgi>并且没有提示错误信息,说明配置成功。

然后输入ss,则可出现如下界面:

至此环境搭建完毕。

实例osgi

创建一个Plug-in project

然后点击下一步,输入工程名,要注意This plug-in is targeted to run with:这里选择的是standard

添入插件相关信息:

打开生成的Activator类,在start和stop方法中加入输出

public class Activator implements BundleActivator {

	private static BundleContext context;

	static BundleContext getContext() {
		return context;
	}

	/*
	 * (non-Javadoc)
	 * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
	 */
	public void start(BundleContext bundleContext) throws Exception {
		Activator.context = bundleContext;
		System.out.println("hello OSGI started!");
	}

	/*
	 * (non-Javadoc)
	 * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
	 */
	public void stop(BundleContext bundleContext) throws Exception {
		Activator.context = null;
		System.out.println("hello OSGI stoped!");
	}

}

 然后右键工程,选择Run Configuration,将Default Auto-Start设置为false

运行应用,分别输入start 1、ss、stop 1、ss

得到如下结果,则证明运行成功