- 浏览: 1152732 次
- 性别:
- 来自: 火星郊区
博客专栏
-
OSGi
浏览量:0
文章分类
- 全部博客 (695)
- 项目管理 (48)
- OSGi (122)
- java (79)
- Vaadin (5)
- RAP (47)
- mysql (40)
- Maven (22)
- SVN (8)
- 孔雀鱼 (10)
- hibernate (9)
- spring (10)
- css (3)
- 年审 (6)
- ant (1)
- jdbc (3)
- FusionCharts (2)
- struts (4)
- 决策分析 (2)
- 生活 (10)
- 架构设计 (5)
- 破解 (2)
- 狼文化 (4)
- JVM (14)
- J2EE (1)
- 应用服务器 (1)
- 我的链接 (5)
- 数学 (2)
- 报表 (1)
- 百科 (6)
- Flex (7)
- log4j (2)
- PHP (1)
- 系统 (2)
- Web前端 (7)
- linux (6)
- Office (1)
- 安全管理 (5)
- python (2)
- dom4j (1)
- 工作流 (3)
- 养生保健 (4)
- Eclipse (8)
- 监控开发 (1)
- 设计 (3)
- CAS (1)
- ZK (41)
- BluePrint (3)
- 工具 (1)
- SWT (7)
- google (2)
- NIO (1)
- 企业文化 (2)
- Windoes (0)
- RCP (7)
- JavaScript (10)
- UML (1)
- 产品经理 (2)
- Velocity (10)
- C (1)
- 单元测试 (1)
- 设计模式 (2)
- 系统分析师 (2)
- 架构 (4)
- 面试 (2)
- 代码走查 (1)
- MongoDB (1)
- 企业流程优化 (1)
- 模式 (1)
- EJB (1)
- Jetty (1)
- Git (13)
- IPV6 (1)
- JQuery (8)
- SSH (1)
- mybatis (10)
- SiteMesh (2)
- JSTL (1)
- veloctiy (1)
- Spring MVC (1)
- struts2 (3)
- Servlet (1)
- 权限管理 (1)
- Java Mina (1)
- java 系统信息 (6)
- OSGi 基础 (3)
- html (1)
- spring--security (6)
- HTML5 (1)
- java爬虫搜索 (1)
- mvc (3)
最新评论
-
Tom.X:
http://osgia.com/
将web容器置于OSGi框架下进行web应用的开发 -
chenyuguxing:
你好, 为什么我的bundle export到felix工程中 ...
在Apache Felix中运行bundle -
string2020:
<niceManifest>true</ni ...
Bundle Plugin for Maven -
jsonmong:
OSGI,是未来的主流,目前已相当成熟。应用OSGI比较好的, ...
基于OSGi的声明式服务 -
zyhui98:
貌似是翻译过来的,有很少人在linux上做开发吧
如何成为“10倍效率”开发者
网上有很多介绍osgi概念的文章,有兴趣的同学可以去google一下.这里写一个简单的例子,记录自己的学习历程,也希望对初学osgi的同学有所帮助.
osgi强调模块化与服务化,我们可以在不重启Java虚拟机的情况下切换一个服务的实现,达到动态更新目的.与spring不同的是,osgi可 以动态绑定服务的实现,而Spring容器一旦启动就无法更改服务的实现,要想改变服务的实现,只有重新配置spring-bean文件,再重启 spring容器
下面例子就说明了这一点,我们要做的事情如下
- 我们有一个HelloService,用户需要实现sayHello方法
- 实现1,实现sayHello方法,输出HelloService1
- 实现2,实现sayHello方法,输出HelloService2
- 在运行时,将实现1切换到实现2,相当于模拟一种更新
- 卸载实现2,将实现还原为实现1,相当于模拟一种回滚
创建以下几个maven工程
- hello 为主工程
- hello.service 该工程包含HelloService接口
- hello.service.impl1 该工程包含HelloService的实现
- hello.service.impl2 该工程包含HelloService的实现
- hello.service.consumer 该工程会使用HelloService
- 以上四个工程皆为hello工程的module
hello.service工程
该工程为一个接口bundle,不包含BundleActivator
其用处是为其他几个bundle提供HelloService接口,隔离hello.service.impl与hello.service.consumer
package org.lazyman.osgi.hello.service;
public interface HelloService {
public void sayHello();
}
由于其他几个bundle需要使用到HelloService接口,该bundle需要导出HelloService接口,其MANIFEST.MF文件如下
Manifest-Version: 1.0
Created-By: Freewind
Bundle-Version: 1.0.0
Bundle-Name: Hello Service Bundle
Bundle-Vendor: Freewind
Bundle-ManifestVersion: 2
Bundle-SymbolicName: hello.service
Export-Package: org.lazyman.osgi.hello.service
hello.service.impl1 工程
该工程为HelloService的一个实现bundle,包含一个BundleActivator向osgi容器注册HelloService的实现,hello.service.consumer可以从osgi容器获取该实现,调用相关服务
//HelloService 实现1
package org.lazyman.osgi.hello.service.impl1;
import org.lazyman.osgi.hello.service.HelloService;
public class HelloServiceImpl1 implements HelloService {
@Override
public void sayHello() {
System.out .println(“HelloService1″);//实现1
}
}
//实现1的BundleActivator
package org.lazyman.osgi.hello.service.impl1;
import org.lazyman.osgi.hello.service.HelloService;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;
public class HelloServiceActivator implements BundleActivator {
private ServiceRegistration sr;
@Override
public void start(BundleContext context) throws Exception {
System.out .println(“HelloServiceActivator1.start”);
//向osgi容器注册HelloService的实现1
sr = context.registerService(HelloService.class.getName(),new HelloServiceImpl1(), null);
}
@Override
public void stop(BundleContext context) throws Exception {
sr.unregister();
}
}
由于该bundle需要使用到HelloService接口及osgi的相关接口,该bundle需要导入相关的接口类,其MANIFEST.MF文件如下
Manifest-Version: 1.0
Created-By: Freewind
Bundle-Version: 1.0.0
Bundle-Name: Hello Service Impl1
Bundle-Vendor: Freewind
Bundle-ManifestVersion: 2
Bundle-SymbolicName: hello.service.impl1
Import-Package: org.lazyman.osgi.hello.service,org.osgi.framework
Bundle-Activator: org.lazyman.osgi.hello.service.impl1.HelloServiceActivator
hello.service.impl2 工程
该bundle与hello.service.impl1类似,改变的是如下代码
public void sayHello() {
System.out .println(“HelloService2″);//实现2
}
篇幅所限,该工程其他的代码就不贴出了,有兴趣可参看下附件
hello.service.consumer 工程
该工程向osgi容器注册HelloService的服务监听器,当有HelloService服务注册时,服务监听器会取得该服务,并添加到 hello.service.consumer中,当HelloService卸载时,服务监听器会从hello.service.consumer去除 该服务,具体如下
//hello.service.consumer BundleActivator
package org.lazyman.osgi.hello.service.consumer;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import org.lazyman.osgi.hello.service.HelloService;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceEvent;
import org.osgi.framework.ServiceListener;
public class HelloServiceConsumer implements BundleActivator {
//HelloService列表,有可能存在多个HelloService实现
//但我们优先使用最后注册的,达到服务更新的目的
private List<HelloService> helloServices = new ArrayList<HelloService>();
private ExecutorService executor;
@Override
public void start(BundleContext context) throws Exception {
System.out .println(“HelloServiceConsumer.start”);
//添加服务监听器,监听HelloService的状态
context.addServiceListener(new HelloServiceListener(context));
executor = Executors.newFixedThreadPool (1);
//线程里循环调用HelloService
executor.execute(new HelloServiceVisitorThread());
}
@Override
public void stop(BundleContext context) throws Exception {
System.out .println(“HelloServiceConsumer stop”);
}
public void setHelloService(HelloService helloService) {
if (this.helloServices.isEmpty()) {// 如果列表为空,直接加入
this.helloServices.add(helloService);
} else {// 将后启动的服务插入到列表之前,优先使用后加入的服务
this.helloServices.add(0, helloService);
}
}
public void unsetHelloService(HelloService helloService) {
//当HelloService卸载时,从服务列表删除
this.helloServices.remove(helloService);
}
class HelloServiceListener implements ServiceListener {
private BundleContext context;
public HelloServiceListener(BundleContext context) {
this.context = context;
}
@Override
public void serviceChanged(ServiceEvent evt) {
HelloService hs = (HelloService) context.getService(evt.getServiceReference());
if (evt.getType() == ServiceEvent.REGISTERED ) {
setHelloService(hs);//添加服务
} else if (evt.getType() == ServiceEvent.UNREGISTERING ) {
System.out .println(“service unregistered”);
unsetHelloService(hs);//卸载服务
}
}
}
class HelloServiceVisitorThread implements Runnable {
public void run() {
while (true) {
try {
synchronized (helloServices) {
if (helloServices.size() > 0) {//判断是否有HelloService服务
helloServices.get(0).sayHello();
} else {
System.out .println(“NO HelloService”);
}
}
TimeUnit.SECONDS .sleep(20);
} catch (InterruptedException e) {
// ignore
}
}
}
}
}
其MANIFEST.MF文件如下
Manifest-Version: 1.0
Created-By: Freewind
Bundle-Version: 1.0.0
Bundle-Name: Hello Service Consumer
Bundle-Vendor: Freewind
Bundle-ManifestVersion: 2
Bundle-SymbolicName: hello.service.consumer
Import-Package: org.osgi.framework,org.lazyman.osgi.hello.service
Bundle-Activator: org.lazyman.osgi.hello.service.consumer.HelloServiceConsumer
以上各工程的MANIFEST.MF文件放置布局如下:
我们需要在打包时,将自定义的MANIFEST.MF打入jar包,只需要在主pom配置maven-jar-plugin即可
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifestFile>META-INF/MANIFEST.MF</manifestFile>
</archive>
</configuration>
</plugin>
打包各工程
命令行进入主工程目录
mvn clean package
拷出各工程target下的jar到你喜欢的地方,比如c:/lib
此处给个脚本,以方便拷出jar包—cp.bat
copy /Y hello.service\target\hello.service.jar c:\lib
copy /Y hello.service.consumer\target\hello.service.consumer.jar c:\lib
copy /Y hello.service.impl1\target\hello.service.impl1.jar c:\lib
copy /Y hello.service.impl2\target\hello.service.impl2.jar c:\lib
启动osgi容器,此处使用equinox
java -jar org.eclipse.osgi.jar –console
此时只有一个bundle,也就是容器本身
安装刚刚打包好的各个bundle
install file:///c:/lib/hello.service.jar
install file:///c:/lib/hello.service.impl1.jar
install file:///c:/lib/hello.service.impl2.jar
install file:///c:/lib/hello.service.consumer.jar
安装的顺序可以随意,稍后启动的顺序必须先启动hello.service,因为后面三个对hello.service有依赖
目前的状态如下
可以看到有四个bundle处于已安装状态
启动已安装的bundle
上面提过,必须先启动hello.service,你也可以尝试下先启动其他bundle,看会有什么情况出现
从上图可以看到,hello.service的id为2,此处的id相当于pid,我们可以用以下方式启动hello.service bundle
start 2
可以看到hello.service已经处于活动状态
再启动hello.service.consumer,看看什么情况
start 1
有NO HelloService输出,因为此时还没有注册HelloService的实现
启动实现1
start 4
更新HelloService的实现,此时只需要启动实现2即可
start 3
此后HelloService将会切换到实现2上
回滚到实现1上,只需要停止实现2即可
stop 3
此后HelloService将会回滚到实现1上
你也可以编写实现3,并动态加载到osgi容器,替换实现1或实现2,为hello.service.consumer提供不一样的服务~~~
equinox的osgi实现还有很多令人振奋的功能,比如声明式服务(ds),通过它以配置的方式注册或获取服务,可以省下很多繁琐的注册代码, 并且无需耦合osgi api,也不需要再写BundleActivator了,该功能在下篇文章会介绍到,尽请期待o(∩_∩)o
发表评论
-
关于Felix Log Service
2012-12-07 16:44 1574OSGi服务纲要规范中定义了服务于OSGi平台的通用日志服 ... -
Maven 3 Felix 4 Eclipse 的搭建与部署(部分转载自别人文章)
2012-10-18 10:24 20404.1.开发环境搭建 4.2开发工具 Maven 3 F ... -
【绝对路径】OSGi环境中获取Plugin/Bundle中文件资源的绝对路径
2012-10-08 10:53 2510摘要:在进行Eclipse RCP开发的过程中,需要使用一 ... -
OpenCore:基于OSGi开发纯插件体系结构的WEB应用程序
2012-09-21 17:46 1426随着OSGi/Equinox逐渐成为Java EE服务端的基础 ... -
OSGi技术在Java Web开发中的应用
2012-09-20 11:26 1418随着 Java SE 对模块化功能原生支持的一再推迟(据最 ... -
OSGI典型的应用案例
2012-09-20 11:26 1639OSGI典型的应用案例主要有两个:分别是Eclipse和BMW ... -
OSGi特点
2012-09-20 11:26 12561、JRE版本无关性。虽然Java一直被人们认为是“Write ... -
OSGI与JMX 的关系
2012-09-19 17:09 1064不过重点是: JMX 本来设计的用途就只为了管理,我们不 ... -
在equinox环境开发web应用的"利器" -- registerResources()方法 详解
2012-09-19 17:07 1239registerResources()方法详解 1、简介 ... -
在equinox环境开发web应用的"利器" -- 序
2012-09-19 17:05 1370在equinox环境中开发web应用必须要借助一些工具包提供的 ... -
equinox环境下web应用资源的部署
2012-09-19 17:04 1311osgi的equinox实现环境下,web服务器和web应用都 ... -
OSGi产生的背景--在繁荣的混乱之中走出困惑
2012-09-19 16:58 1172软件的复杂性正在以惊 ... -
将web容器置于OSGi框架下进行web应用的开发
2012-09-16 14:26 3546将web容器置于OSGi框架下,其实就是将web容器做成OSG ... -
在Eclipse中开发OSGi Bundle
2012-09-16 14:26 1337Eclipse为开发OSGI Bundle提供了良好的支持,它 ... -
【第一代服务注册形式】 - 将一个Bundle注册为服务
2012-09-14 10:09 11581、创建业务接口类及其实现类 Java代码 ... -
Declarative Services规范简介及应用
2012-09-14 10:08 1425Declarative Services 是一 ... -
用FileInstall管理Bundle的动态安装、启动、卸载
2012-09-14 10:07 13351、文件目录如下: F:\study_osgi ... -
服务工厂 - Bundle消费者返回不同的服务对象
2012-09-14 10:03 1210一般情况下,服务对象在注册后,任何其它的Bundle在请求 ... -
服务跟踪(ServiceTracker)
2012-09-14 09:58 1164当多个Bundle使用同一 ... -
OSGi容器中Bundle之间Synchronous Communication
2012-09-11 17:07 1566OSGi Core定义了一个服务层,提供了一个Bundl ...
相关推荐
**基于OSGi构建小例子** OSGi(Open Service Gateway Initiative)是一种Java模块化系统,它允许开发者将应用程序拆分成独立的、可管理的模块,这些模块可以动态地安装、卸载和更新,而不影响系统的其他部分。在...
OSGi(Open Services Gateway Initiative)学习笔记(一) 在IT领域,OSGi是一种模块化系统和Java服务平台,它提供了一种动态管理软件组件的能力。本文将深入探讨OSGi的基本概念、架构以及如何使用它来构建可扩展和...
OSGi(Open Services Gateway Initiative)是一种Java模块化系统,它为开发人员提供了一种动态、模块化的运行时环境。在OSGi中,应用程序被分解为称为“bundle”的独立单元,这些bundle可以相互依赖并独立地加载、...
OSGi(Open Services Gateway Initiative)是一种模块化系统和Java服务框架,它允许开发人员将应用程序分解为一组可独立更新和管理的小型服务组件。在OSGi环境中嵌入Servlet,可以实现更加灵活和动态的Web应用部署。...
OSGI(Open Services Gateway Initiative)是一种开放标准,用于创建可模块化的Java应用程序。它提供了一种灵活的框架,使得开发者可以构建、部署和管理模块化组件,这些组件被称为服务或bundle。OSGI的核心理念是将...
OSGi(Open Services Gateway Initiative)是一种模块化系统和Java服务框架,它允许开发人员将应用程序分解为一组独立的、相互依赖的模块,这些模块被称为服务。这个标题“一个关于osgi的例子”暗示我们将探讨如何...
OSGI(Open Services Gateway Initiative)是一种模块化系统和Java服务框架,它允许应用程序由一系列可独立更新和替换的模块组成,这些模块称为“bundle”。在本实例中,我们将探讨如何利用OSGI技术来开发Eclipse...
OSGi(Open Services Gateway Initiative)是一种在Java平台上进行模块化编程的规范,它为Java应用提供了动态化、服务化和模块化的运行环境。OSGi规范定义了一组核心的Java包和Java类的框架,允许一个应用程序或组件...
OSGI(Open Services Gateway Initiative)是一种模块化系统和Java服务框架,它允许应用程序以模块化的方式构建,使得组件之间可以动态地发现、依赖管理和更新。本教程将详细讲解如何将OSGI部署为一个可运行的例子,...
OSGI(Open Services Gateway Initiative)是一种开放标准,用于创建模块化和动态的Java应用程序。它为Java开发人员提供了一个框架,使他们能够构建可热插拔的组件,从而实现更灵活、可扩展和可维护的软件系统。在本...
OSGI组件编程是一种在Java平台上构建模块化应用程序的方法,它由OSGi联盟制定标准,并被广泛应用于企业级软件开发,尤其是对于需要高度可扩展性和动态性的系统。在本教程中,我们将深入探讨如何使用Eclipse和Equinox...
通过使用OSGI,开发者可以将大型复杂应用分解为更小、更易于管理的部分,这有助于代码的复用、减少耦合,并使维护和升级变得更加容易。例如,开发工具如Eclipse就广泛采用了OSGI架构,允许插件以独立的bundle形式...
OSGi(Open Services Gateway Initiative)是一种Java平台上的模块化服务框架,它定义了一种标准,使得开发者能够构建可互操作的、动态的、模块化的软件系统。OSGi的核心概念是基于Java的模块化,它的主要目标是为...
OSGI(Open Services Gateway Initiative)是一种Java模块化系统,它允许开发者将应用程序分解为一系列可独立部署、更新和交互的服务。林昊所著的《OSGI实战》与《OSGI进阶》是深入理解OSGI技术的重要参考资料,适合...
Spring OSGi是Spring框架与OSGi(Open Service Gateway Initiative)规范相结合的一种技术,它允许在OSGi容器中运行和管理Spring应用。OSGi是一种模块化系统,为Java应用程序提供了动态部署、版本控制和依赖管理的...
《企业OSGi实战》一书是OSGi企业应用的权威指南,它不仅涵盖了OSGi在企业环境中的应用,还提供了Java企业版(Java EE)与OSGi特性的融合方法。本书详细介绍了模块化编程的重要性,以及OSGi如何强化Java的模块化能力...
OSGi(Open Services Gateway initiative)是一种Java动态模块化系统规范,其核心思想是将应用分割成一系列的 bundles(模块),每个 bundle 都可以独立地安装、启动、停止、更新,而不会影响到其他 bundles。OSGi ...
OSGI(Open Services Gateway Initiative)是一种开放标准,用于创建模块化和可扩展的Java应用程序。它提供了一种灵活的框架,允许开发人员将应用程序分解为独立的模块,这些模块称为服务。OSGI的核心是它的模块系统...
资源名称:OSGI原理与最佳实践内容简介:国内第一本OSGi图书OSGi国内推广者林昊多年经验的结晶涵盖OSGi从入门到深入的知识体系引领OSGi国内研究和普及本书基于作者多年使用OSGi的经验而编写,涵盖了OSGi从入门到深入...
OSGI是一种Java平台上的服务导向架构,它允许动态地加载、卸载和更新软件组件,提高了灵活性和可维护性。 描述中提到“新版的tomcat融合OSGI容器程序,老版的不好使,自己改了下”,这暗示了在旧版本的Tomcat中,...