`
wyuxiao729
  • 浏览: 34724 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

osgi实战项目(osmp)一步一步玩转osgi之服务发布和引用(4)

    博客分类:
  • osgi
阅读更多

 

今天主要讲一下在osgi环境下的服务注册、和服务引用。

 

其实osgi只是一个java动态化、模块化的一系列规范,根据不同厂商制定了不同的规范,如Felix和Equinox则分别是Apache和Eclipse开源社区给出的标准规范的实现!而osgi的魅力也在于动态化和模块化,我个人认为要实现动态化最简单的就是通过classload动态加载。我个人理解而已,osgi只是在传统开发的基础上抽象了一个bundle组件的概念,每一个bundle组件都有自己的生命周期,bundle实现动态化是基于bundle classloader实现的。理论性的东西我不想讲太多,大家可以去看一下osgi基础方面的东西,如bundle生命周期,bundle classloader等内容。而服务的注册,服务的引用等内容恰恰是bundle生命周期最好的诠释!

 

先说一下osgi环境下的服务注册,其实这部分内容在第二讲的时候已经大概说过一点儿,这次我们讲解一下传统的osgi服务注册和使用框架的方式来注册等。

 

 一个bundle被部署到osgi容器里有几个最要的阶段也可以称之为bundle的生命周期,主要包括 INSTALLED(调用BundleContext.installBundle()后,会创建一个INSTALLED状态的bundle)、RESOLVED(如果其所依赖的所有bundle都存在,即解析成功,转到RESOLVED状态)、STARTING(当开始执行BundleActivator.start(),则处于STARTING状态)、ACTIVE(当执行BundleActivator.start()成功,则转到ACTIVE状态)、STOPPING(当开始执行BundleActivator.stop(),则处于STOPPING状态)、UNINSTALLED(INSTALLED状态的bundle可以被卸载,转到UNINSTALLED状态)。

可以看到一个bundle的整个生命周期都离不开BundleActivatorBundleContext 这两个类。

 

BundleContext:Bundle上下文,主要功能是与OSGI容器交互,包括服务的注册,监听器的注册,获取osgi下所有发布的服务,服务的引用等功能。建议大家好好的看一下这个类。

BundleActivator:BundleActivator是osgi提供的一个获取BundleContext的接口,同时提供bundle启动和停止的处理方法。

 

知道这两个类我们就可以实现BundleActivator 在bundle启动的时候通过BundleContext注册服务到osgi容器里以供其它bundle调用了


实现一个自定义的BundleActivator :

 

 public class HelloServiceActivator implements BundleActivator {
	ServiceRegistration serviceRegistration;
	@Override
	public void start(BundleContext context) throws Exception {
		HelloService helloService = new HelloServiceImpl();
		serviceRegistration = context.registerService(HelloService.class.getName(), helloService, null);
	}

	@Override
	public void stop(BundleContext context) throws Exception {
		serviceRegistration.unregister();
	}

}

 

在这个bundle启动的时候我们通过实现BundleActivator里的start方法 实例化一个服务类并通过BundleContext的registerService注册到osgi容器里,分别传入服务名称,服务实例,服务别名(可以理解为这个的tag标签),通过stop方法注销到这个服务。

 

完成这一步后我们还在MANIFEST.MF(Bundle元数据描述文件,定义此Bundle依赖的jar包,导入和导出的包等基础元数据)定义Bundle-Activator为我们自己的Activator

Bundle-Activator:com.osmp.demo.HelloServiceActivator

 

 这样我们在将此bundle部署到osgi容器的时候在bundle启动的时候就会将HelloService注册到osgi容器里供别的bundle服务调用。再简单的说一下bundle服务的引用。与发布基本相同,在启动的时候通过start方法获取到bundle上下文,通过BundleContext获取ServiceReference 服务引用,再通过此类获取我们需要的服务引用,代码如下:

 

public class Activator implements BundleActivator {
ServiceReference helloServiceReference;
	public void start(BundleContext context) throws Exception {
		System.out.println("Hello World!!");
		helloServiceReference=context.getServiceReference(HelloService.class.getName());
		HelloService helloService=(HelloService)context.getService(helloServiceReference);
		System.out.println(helloService.sayHello());
	}
	public void stop(BundleContext context) throws Exception {
		System.out.println("Goodbye World!!");
		context.ungetService(helloServiceReference);
	}
}

 

 以上部分写到一大半的时候,想找两个例子,结果发现 http://longdick.iteye.com/blog/457310 这篇文章讲的很好,大家可以看一下,我也就不再专门讲解了。

 

我就说一下在osmp里是怎么实现服务的注册和服务的发现和服务路由的。

 

osmp里服务的发布我们是通过spring-dm来发布的,代码很简单,

 spring配置文件里引入spring-osgi的schema,通过 <osgi:service>标签来将服务发布到osgi容器里,配置文件如下:

 

 

<?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:context="http://www.springframework.org/schema/context"
	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/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
		http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi-1.2.xsd">

	<context:component-scan base-package="com.osmp.demo.service">
	</context:component-scan>
	
	
	<bean id="jdbcDao" class="com.osmp.jdbc.support.JdbcDao"></bean>
	
	<bean id="osmp.demo.service" class="com.osmp.demo.service.TestServiceImpl" />
	<osgi:service interface="com.osmp.intf.define.service.BaseDataService"
		ref="osmp.demo.service">
		<osgi:service-properties>
			<entry key="name" value="osmp-demo" />
			<entry key="mark" value="测试DEMO" />
		</osgi:service-properties>
	</osgi:service>

</beans>

 

pom.xml 里依赖

 

<dependency>
            <groupId>org.springframework.osgi</groupId>
            <artifactId>spring-osgi-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.core</artifactId>
 </dependency>

 

pom.xml将工程打包为bundle,需要使用到 maven-bundle-plugin 这个插件:

 

	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.felix</groupId>
				<artifactId>maven-bundle-plugin</artifactId>
				<extensions>true</extensions>
				<configuration>
					<instructions>
						<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
						<Export-Package></Export-Package>
						<Import-Package>
							org.springframework.aop,
							org.springframework.aop.framework,
							org.springframework.cglib,
							org.springframework.cglib.proxy,
							org.springframework.cglib.core,
							org.springframework.cglib.reflect,
							org.aopalliance.aop,
							org.aopalliance.intercept,
							*;resolution:=optional
						</Import-Package>
					</instructions>
				</configuration>
			</plugin>
		</plugins>
	</build>

 

 

 PS:

1、配置文件引入spring-osgi  xmlns:osgi="http://www.springframework.org/schema/osgi" http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi-1.2.xsd

2、osgi:service-properties 标签对应 上面讲到的context.registerService()方法的第三个参数。我的理解是给这个服务打上tag标签,以k/v键值对的形式。

3、maven-bundle-plugin打bundle时,我这里使用的servicemix作为osgi容器,已经集成了spring,此时需要将spring的包显示的引入进来。这里比较坑的是我原本以为通过*;resolution:=optional能自动的将需要依赖的包给import进来,但是试过多次发现,只有在代码里显示的import的包才会被自动的引进去,如配置文件里依赖的包是不会自动的import进来的,而且只能一级一级的import进来。

4、spring-dm 服务引用通过<osgi:reference>这里不作详讲。

 

上面的例子可以查看osmp-demo源码!!!!

相对来说通过spring-dm的方式来发布服务比上面通过BundleContext的方式前进了一大步,此外还可以通过blueprint的方式来发布服务,感兴趣的自己百度。
 

 

 

分享到:
评论

相关推荐

    osgi服务发布和获取方式

    OSGi 服务发布和获取方式 OSGi(Open Service Gateway Initiative)是一种动态模块化的服务平台,能够动态地管理和部署服务。OSGi 服务发布和获取方式是 OSGi 框架中的一种核心机制,用于发布和获取服务。下面将...

    OSGi常用服务发布和获取方式总结

    在OSGi环境中,服务是模块间通信的主要手段,而服务的发布和获取是OSGi核心概念之一。本文将深入探讨OSGi常用的服务发布和获取方式。 一、服务发布 1. **ServiceRegistration**: 当一个模块想要提供服务时,它会...

    OSGi 入门+进阶+实战

    4. **felix或equinox**:Felix和Equinox是两个常用的OSGi运行时实现,它们提供了API和框架,用于构建和运行OSGi应用。 5. **Blueprint或Declarative Services**:这两种是OSGi中的服务配置方式,Blueprint更接近XML...

    OSGI实战.docx

    4. 开发、发布和使用Service:介绍OSGI服务的概念,如何定义、注册服务,以及服务消费者如何查找和使用服务。 5. 测试和调试:提供测试Bundle的方法,以及如何利用OSGI提供的调试工具进行问题定位。 通过这个实战...

    基于osgi框架实战源码

    4. **事件处理**:购物车操作(添加商品、结算等)可能通过发布和订阅事件的方式进行通信。 5. **动态更新**:在源码中可能会演示如何在运行时更新bundle,以实现功能的动态扩展或修复。 **学习与实践** 通过研究...

    OSGI合集 OSGi原理与最佳实践

    网上收集的OSGI资料. 包括: OSGi原理与最佳实践(精选版).pdf OSGI实战和源码.rar osgi进阶.pdf Introduce.OSGi.ppt OSGi.in.action.ppt r4.cmpn.pdf r4.core.pdf r4.enterprise.pdf

    OSGI 实战教程

    **OSGI实战教程** ...通过阅读《OSGI实战》这份教程,你将掌握OSGI的基本原理和实践技巧,能够熟练运用OSGI来构建高效、可维护的Java应用。无论你是初学者还是经验丰富的开发者,这都将是一份宝贵的参考资料。

    osgi服务(加法和乘法)

    综上所述,这个压缩包文件可能包含两个Java项目或bundle,分别实现了加法和乘法的运算逻辑,并封装为OSGi服务。使用者可以通过启动对应的bundle来选择执行加法还是乘法运算,展示了OSGi框架在动态服务发现和交互方面...

    OSGi原理与最佳实践(完整版)&OSGi_in_action

    1. **OSGi基础**:介绍OSGi的核心概念,如模块系统(称为"bundle"),服务注册和发现机制,以及如何将Java应用程序划分为独立的模块。 2. **模块化开发**:讲解如何使用OSGi模块化你的代码,减少依赖冲突,提高代码...

    OSGI 开发文档中文的

    9. **实战应用**:"OSGI实战.pdf"可能包含实际项目案例,演示如何在真实场景中应用OSGI解决特定问题。 通过阅读这份文档和解压后的"dist.rar"和"code.rar"文件,你不仅可以深入了解OSGI技术,还能获得实践经验,...

    OSGi R4规范,中文版

    OSGi(Open Service Gateway Initiative)是一种模块化系统和服务组件模型,它为Java平台提供了一种动态部署、管理和执行组件的方式。OSGi最初是为了实现家庭网关设备而设计的,但随着时间的发展,它已经成为构建可...

    osgi实例(服务注册、引用、跟踪)

    本资源提供了一些关于OSGi服务注册、引用、服务工厂和服务跟踪的基础实例,对于已经对OSGi有一定了解的开发者来说,这些实例将有助于深入理解其工作原理。 **服务注册** 在OSGi中,服务是组件之间通信的接口。一个...

    osgi重要文档--osgi核心规范文档,osgi服务文档,osgi-最佳原理与实践(王昊编著,共79页)

    OSGI(Open Services Gateway Initiative)是一种开放的中间件标准,旨在提供模块化系统,使得Java应用程序可以在组件之间灵活地依赖和交互。这个压缩包包含了关于OSGI的重要文档,分别是“OSGi R4核心规范文档”、...

    OSGI进阶实战教程

    OSGi学习不错的材料 OSGi学习不错的材料 OSGi学习不错的材料 OSGi学习不错的材料

    OSGi 入门 学习 实战 进阶

    《OSGi实战》这本书可能涵盖了如何在实际项目中应用OSGi技术,包括Bundle的创建、服务的注册和发现、依赖管理等方面。通过这本书,读者可以了解到如何将复杂的程序分解为小型、可重用的模块,以及如何利用OSGi的生命...

    OSGI入门和例子

    OSGI(Open Services Gateway Initiative)是一种开放标准的Java模块化系统,它允许开发人员将应用程序分解为一组可独立更新和管理的小型服务组件。OSGI的核心是其模块系统,称为"bundle",每个bundle都是一个独立的...

    OSGi原理与最佳实践 例子和pdf

    3. 服务注册与发现:OSGi提供了一种服务注册表,允许模块发布和查找服务,实现松耦合的服务间通信。服务的生命周期可以被管理和监控,增强了系统的可维护性。 二、OSGi最佳实践 1. 模块设计:遵循模块化原则,每个...

    OSGI原理及实战

    - **事件管理服务**: 提供事件发布和订阅机制。 - **OSGI的关键部分**: - **类加载机制**: 解决不同bundle之间类路径冲突问题。 - **bundle生命周期**: 定义了bundle的各种状态及其转换。 - **bundle间通讯**: ...

Global site tag (gtag.js) - Google Analytics