`
luhongjun
  • 浏览: 13771 次
  • 性别: Icon_minigender_1
  • 来自: 十堰
社区版块
存档分类
最新评论

基于Eclipse开发OSGI的简单实例

    博客分类:
  • osgi
 
阅读更多

 

基于Eclipse开发OSGI的简单实例 


一.        概述

OSGI SERVICE PLATFORM是一个基于JAVA的,开放并且提供统一接口标准的体系框架,

OSGI中所有模块的部署都必须以Bundle 的方式来进行部署。基于这个体系框架,服务提供商,程序开发人员,软件提供商,服务网管运营商,设备提供商能够 协调地联合起来开发,部署以及管理向用户提供的各种服务。

(a)     OSGI的优势:

1.  插件可热插拔    可以实现软件的动态升级

2. 代码维护               不同Bundle间依赖仅存在于接口的层面上, 有利于代码的维护。

3. 稳定、高效的系统

基于OSGI的系统采用的是微核机制,微核机制保证了系统的稳定性,微核机制的系统只要微核是稳定运行的,那么系统就不会崩溃,也就是说基于OSGI的系统不会受到运行在其中的Bundle的影响,不会因为Bundle的崩溃而导致整个系统的崩溃。

4. 规范的、可积累的模块

大部分软件公司都形成不了规范的模块开发方式,因为没有统一的规范的基础架构体系的定义,往往每个项目、每个产品都会因为架构师的偏好、技术的发展而导致模块的开发方式完全不同,这就使得软件公司在人员技能要求、培养上很难形成统一,而OSGI为这个问题提供了解决方案,基于OSGI的系统采用规范的模块开发、部署方式构建系统。

 

(b)Bundle划分规则

 

采用OSGi技术实现应用系统时,最终展现在我们面前的将是一个个的Bundle组件,那么一个应用系统应被划分为几个bundle合适呢?这就涉及到了bundle划分的实现粒度问题。我比较倾向于按层次划分的方式,下面的实例开发都将采用该种结构划分。

根据层次进行划分:

<1>Services Bundle:在OSGi中,服务是通过Java的接口来定义的,可以把定义服务的Java接口组成一个Services Bundle,并由这个Bundle向其它Bundle提供接口。

<2>服务提供者Bundle:实现Services Bundle提供的接口,并向OSGi框架注册服务。

<3>服务使用者Bundle:引用Services Bundle提供的接口,并向OSGi框架请求相应的服务。

 

二.   使用SpringDM的开发实例

a)         环境搭建

                         i.              添加Spring环境

 

下载spring dynamic module,当前版本是1.0-rc2。将以下jar放到eclipse/plugins目录下。

spring-osgi-core-1.0-rc2.jar

spring-osgi-io-1.0-rc2.jar

spring-osgi-extender-1.0-rc2.jar

 

                       ii.              添加Spring-OSGI环境(SpringDM

 

下载spring,当前版本2.5.1,将以下jar放到eclipse/plugins目录下。

spring-beans-2.5.1.jar

spring-aop-2.5.1.jar(依赖aopalliance.osgi-1.0-SNAPSHOT.jar

spring-core-2.5.1.jar

spring-context-2.5.1.jar

重启eclipse,并在运行选项中钩选新添加的这些bundle

 

b)        创建插件项目

                         i.              步骤:

1.         创建一个插件工程

 

2.         选择an OSGI framework,并选择standard方式,我建议使用standard方式方式,因为这样我们可以不局限于equinox,可以把它部署到其他标准的OSGI容器中了。

 

3.我们在这里不生成Activator,因为采用了SpringDM方式,这个工作都交给Spring来完成。

 

c)         以上三个步骤在建立每个Bundle时基本是相同的,我们在来逐个分析这三个Bundle的建立过程。

                         i.              建立Service Bundle定义类

1.         定义接口

public interface MySercice {

public String getHello();

}

 

2.         打开MANIFEST.MF文件的runtime节点,把这个接口export出去,供其他Bundle Import使用。

 

 

 

                       ii.              建立 ServiceImpl Bundle 实现类

1.         打开MANIFEST.MF文件的Dependencies节点,把刚才定义的那个接口import进来。

 

2.         定义接口实现类

public class MyServiceImpl implements MySercice {

@Override

    public String getHello() {

      return "My name is Benson!";

   }

}

 

3.         定义Spring-OSGI配置文件

 

 

 

Spring_service.xml文件

 

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:aop="http://www.springframework.org/schema/aop"

xmlns:tx="http://www.springframework.org/schema/tx"

xmlns:osgi="http://www.springframework.org/schema/osgi"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/osgi

http://www.springframework.org/schema/osgi/spring-osgi.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop-2.0.xsd

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx.xsd">

<!--发布OSGI服务 -->

<bean id="myService" class="com.zhouwei.service.imp.MyServiceImp"/>

<osgi:service interface="com.zhouwei.service.MyService" ref="myService"/>

</beans>

 

代码中蓝色code部分是我们需要注意的地方,其中“xmlns:osgi=http://www.springframework.org/schema/osgi”这句引用,是我们的Bundle支持向OSGI环境中的发布与调用。

<!--发布OSGI服务 -->部分的意义是:

<1>首先把实现类以Spring Bean的方式注入

<2><osgi:service interface=“发布出去的服务的接口” ref=“需要发布为osgi服务的spring bean”/>

因为OSGIBundle之间的依赖都是在接口层面上的,所以我们interface中引用的是我们要发布的接口,而ref中才是我们真正要发布出去的服务,通常为接口的实现类。

 

4.         配置文件的加载

打开MANIFEST.MF文件的地MANIFEST.MF节点

Manifest-Version: 1.0

Bundle-ManifestVersion: 2

Bundle-Name: Serviceimp Plug-in

Bundle-SymbolicName: serviceimp

Bundle-Version: 1.0.0

Import-Package: com.zhouwei.service

Spring-Context: META-INF/spring_service.xml

 

   注意最后一句是我们需要添加的,是SpringDM的标识,这样Bundle启动后就知道自己将以SpringDM的方式启动了。

 

                      iii.              建立Service调用类

1.         Import提供服务的接口,具体方法见ServiceImpl Bundle中的过程。

 

2.         建立服务调用测试类

下面代码中的start,stopSpringDM管理,会自动调用。

public class MyTest {

 private MyService myService;

   public void setMyService(MyService myService) {

         this.myService = myService;

         }

    void start() {

       System.out.println("start.......");

       System.out.println(myService.getHello());

     }

    void stop() {

       System.out.println("stop.....");

     }

}

 

 

3.         编写SpringDM配置文件

a)         调用服务

             <osgi:reference interface=“引用服务的接口” id=”一般使用Spring Bean的名字” />

( 理論上id可以起任何名字)

<!--調用OSGI服務-->

<osgi:reference id="myService"

interface="com.benson.service.MyService">

//=================================================

<bean name="test" class="com.benson.test.MyTest"

init-method="start" destroy-method="stop">

<property name="myService" ref="myService" />

</bean>

</beans>

 

b)         上面Java代码中的startstop 方法由Spring Bean维护。

c)         发布与调用服务的区别

发布服务是先定义Spring Bean,发布服务时引用该Bean。调用服务时,先使用<osgi:reference>调用该服务,而后再定义Spring BeanBeanproperty 中引用该服务。

 

4.         配置文件加载

具体方法见ServiceImpl Bundle中对应部分的过程

d)        运行插件项目

                         i.              打开run对话框

 

                       ii.              创建新配置以启动osgi framework

 

 

                      iii.              钩选必需的bundle,

1.         Eclipse自带

org.apache.commons.logging

javax.servlet

org.eclipse.equinox.http.jetty

org.eclipse.equinox.http.servlet

org.eclipse.osgi

org.eclipse.osgi.services
org.mortbay.jetty

 

2.         SpringSpringDM支持

spring-beans-2.5.1.jar

spring-aop-2.5.1.jar

spring-core-2.5.1.jar

spring-context-2.5.1.jar

aopalliance.osgi-1.0-SNAPSHOT.jar

spring-osgi-core-1.0-rc2.jar
spring-osgi-io-1.0-rc2.jar
spring-osgi-extender-1.0-rc2.jar

 

3.         当然还有上面创建的三个BUndle

 

选择完毕后,点击 Validate Bundles来验证bundles间的依赖关系是否满足,若不满足,会报缺少包的提示信息;若满足,则可点击run,来启动osgi framework

 

                      iv.              OSGi控制台

如果osgi控制台中显示osgi>,而且没有任何错误信息,并且打印出我们期望的语句,则表明osgi 框架配置已成功。

 

osgi>后输入ss命令,回车,会显示所有已经安装的bundle的名称,id以及状态。

输入s命令,会显示osgi服务注册表中所有已经注册的服务

 

三.   在纯OSGI环境中开发实例

a)  环境搭建

基本与SpringDM方式需要的环境相同,只是不用添加SpringDM那三个依赖的插件了。

b)  创建过程

         i.      创建三个Bundle,与前文中SpringDM方式基本相同。需要注意的是下图中步骤一定选择生成Activator激活器,它是用来管理这个Bundle的生命周期的,在SpringDM中我们没有生成它适应为Bundle的生命周期已经由SpringDM代为管理了。

 

     ii.     注册OSGi服务

在我们的接口实现Bundle中的Activator类的start方法中,把实现的这个服务注册到OSGI环境中去,具体方法如下:

 

public void start(BundleContext context) throws Exception {

// 注冊服務

registration = context.registerService(MyService.class.getName(),

              new MyServiceImpl(), null);

}

 

   

    iii.     使用OSGI服务

在调用服务的bundleActivatorstart方法中,我们首先实例化一个服务跟踪类ServiceTracker,它可以跟踪OSGI Service的变化状况我么可以从这类中获取具体的服务内容。

 

public void start(BundleContext context) throws Exception {

//獲取tracker

tracker = new ServiceTracker(context, MyService.class.getName(), null);

tracker.open();

// TestOsgi是具体的业务实现类,在它里面调用服务。

new TestOsgi().startTest(tracker);

 }

   

          //业务实现类         

public class TestOsgi {

    public void startTest(ServiceTracker st) {

       MyService service = (MyService) st.getService();

       if (service != null) {

           System.out.println("~~~~~~~~~~~~~~~~~~~~~~");

           System.out.println(service.getHello());

       } else {

           System.out.println("服務獲取失敗!");

       }

    }

}

 

c)  运行

运行时配置与第一种方式也基本相同,只是不用启动与SpringDM相关的bundle了。下图为运行结果。

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    org.eclipse.osgi_3.7.0.v20110613及源码

    本文将深入探讨OSGi的核心组件——org.eclipse.osgi,并以其3.7.0.v20110613版本及源码为实例,解析其工作原理和关键特性。 一、OSGi概述 OSGi的核心理念是将Java应用程序分解为独立的模块,这些模块称为服务单元或...

    OSGI 实例eclipse插件开发

    在本实例中,我们将探讨如何利用OSGI技术来开发Eclipse插件。 首先,Eclipse是一个开放源代码的集成开发环境(IDE),它支持多种编程语言的开发,而OSGI则为Eclipse提供了一个强大的插件系统。通过OSGI,开发者可以...

    OSGI.rar_OSGI eclipse_eclipse osgi_java OSGI_osgi

    3. **Eclipse与OSGI**:Eclipse是如何基于OSGI构建的,每个插件如何作为OSGI Bundle运行,以及如何通过Eclipse插件系统利用OSGI的灵活性。 4. **模块化开发**:如何将应用程序分解为可独立升级的模块,降低耦合度,...

    基于Eclipse的工具开发

    本教程针对那些希望通过Eclipse进行插件开发的朋友们,提供了丰富的实践指导和实例。 首先,"打开方式.htm"可能是一个网页文档,通常用于介绍如何在Eclipse环境中启动和配置插件开发环境。这可能包括安装Eclipse ...

    基于Equinox开发OSGi应用(一)

    总结来说,基于Equinox的OSGi应用开发是一种强大的模块化开发方式,它提供了高度的灵活性和可扩展性。通过学习和实践,我们可以创建更加健壮、易于维护的Java应用程序。"helloworld"项目是一个很好的起点,它能帮助...

    基于osgi构建小例子

    通过这个基于Eclipse 3.5和JDK 1.6的OSGi示例,你可以深入了解OSGi的模块化概念、服务模型以及动态管理特性,这对于理解现代Java应用的架构和开发流程至关重要。实践这个例子将有助于你成为更熟练的OSGi开发者。

    基于EQUINOX的 OSGI BUNDLE 运行例子

    描述中提到,这个例子包括了ECLIPSE下的OSGi平台包,这意味着我们可以利用Eclipse IDE来辅助开发和测试OSGi应用。设置`JAVA_HOME`和`BIN`环境变量是为了确保Java编译器`javac`的可用性,这是任何Java项目的基础。 ...

    开发一个简单的 OSGi Web 应用实例

    ### 开发一个简单的 OSGi Web 应用实例 #### 一、项目概述 本教程旨在通过一个具体的示例来介绍如何使用OSGi框架开发一个简单的Web应用。这个示例应用能够计算两个数字的和或乘积,并展示了OSGi bundle的动态部署...

    基于VirgoServer进行Spring Osgi Web开发

    在本文中,我们将深入探讨如何基于VirgoServer进行Spring Osgi Web开发,这是一个涉及OSGi容器、Spring框架和Web应用程序的集成技术。首先,我们需要确保拥有正确的开发环境和工具,包括Spring Tool Suite (STS),...

    Eclipse插件开发学习笔记全篇+源码.rar

    2. OSGi框架:Eclipse基于OSGi运行,了解OSGi的概念和它在插件中的作用。 3. PDE(Plugin Development Environment):Eclipse内置的插件开发工具,用于创建、编辑和调试插件项目。 4. Manifest.MF:每个插件的核心...

    eclipse插件开发---简单例子

    Eclipse插件基于OSGi框架,它允许开发者创建可复用的模块化组件,这些组件可以与其他Eclipse插件交互,以提供定制化的开发体验。 描述中的"入门级简单例子 明了清晰"提示我们,这些例子将特别适合初学者,旨在清晰...

    基于OSGi和Spring开发Web应用教程

    在基于OSGi和Spring开发Web应用中,OSGi(Open Services Gateway Initiative)是一个开放标准,用于创建模块化Java应用程序。它允许开发者将应用程序分解为独立的模块,称为bundle,每个bundle都包含自己的类路径、...

    基于OSGI的Web开发例子

    本示例以“基于OSGI的Web开发例子”为主题,主要介绍了如何利用Equinox框架在OSGi环境中进行Web应用的开发,通过一个简单的“Hello World”项目来展示其工作原理。 首先,我们需要理解Equinox。Equinox是Eclipse...

    两个osgi的例子程序

    标题中的“两个OSGi的例子程序”表明我们将探讨的是与OSGi(Open Service Gateway Initiative)相关的编程实例。OSGi是一种Java模块化系统,它允许开发者创建、部署和管理可互操作的模块化应用程序。这个系统的核心...

    在Eclipse RCP中应用Spring OSGI 管理bean(一)

    4. **创建Spring Extension Factory**:在Eclipse RCP中,你需要创建一个SpringExtensionFactory,这是一个特殊的工厂类,负责从OSGi服务中获取Spring配置并实例化Bean。 5. **注册OSGi服务**:将...

    Eclipse插件开发 第1篇到第4篇 开发基础 核心技术 高级进阶 综合实例 eclipse 插件安装方法

    1. **理解OSGi框架**:Eclipse基于OSGi模块化系统构建,理解其动态性、模块化特性和服务注册机制是开发插件的前提。 2. **Plug-in工程结构**:包括Plugin.xml配置文件、源代码目录结构和依赖管理。学习创建新的...

    Eclipse插件开发文档

    Eclipse基于OSGi(Open Service Gateway Initiative)框架构建,它将整个IDE分解为可互换的模块,即插件。每个插件都有自己的生命周期、依赖关系,并通过API与其他插件通信。核心插件提供基础功能,如编辑器、运行时...

Global site tag (gtag.js) - Google Analytics