`
liugang594
  • 浏览: 987583 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

在HTTP容器中内嵌OSGI容器Equinox

 
阅读更多

上一篇中讲了怎么在Equinox中嵌入Http容器和添加Http服务。

 

这一篇讲另半部分:怎么在HTTP容器(如Tomcat)中嵌入Equinox。

 

一、入门

Equinox工程里已经提供了一个专门用于连接Servlet容器和Equinox容器的war包,可以从以下位置下载:

http://eclipse.org/equinox/server/downloads/bridge.war

 

把它放在Tomcat的webapp下,启动Tomcat,解开后得到的目录结构为:

 

 structure

可以看到这其中已经有一个eclipse的目录结构,和平时添加插件一样,只要把我们新建的bundle放到plugins目录下,即可。

 

安装完这个war后,启动tomcat,待tomcat启动后,在console上按几下回车,就可以得到osgi控制台了,如下:

console

 

测试一下:把上一篇文章中得到的bundle放到plugins目录下,然后重启tomcat,再试式ss命令,看看是否已经安装成功。

 

可以看到,要在Http容器里嵌入Equinox非常简单。

 

不过有一个比较重大的问题:插件不会自动更新,例如一旦tomcat启动后,再有新的插件扔进plugins目录下,它不会被自动加载和启动,必须把tomcat重启,才能生效。

二、自动加载

我也不知道怎么配置就可以自动加载,然后我又想要这个功能,没办法就只能自己写了。

假设在eclipse下定义一个新的目录deploy,每隔一段时间就去扫描这个deploy目录,如果有文件或文件夹,就试图把它(它们)作为一个bundle去安装、启动,然后它bundle从deploy目录下移到plugins目录下。

 

所以,我们需要有一个新的插件,用来扫描deploy目录并且安装和启动找着的bundle;然后我们把这个插件让到plugins里,让它随着tomcat启动而启动。

 

剩下的事情就是怎么实现这个bundle了。

 

1.定期扫描

		new Thread() {
			@Override
			public void run() {
				File deployFolder = getDeployFolder();
				File pluginsFolder = getPluginsFolder();
				while (Activator.context != null) {
					try {
						sleep(50000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					deployAllUnder(deployFolder, pluginsFolder);
				}
			}

		}.start();

 2.安装和启动

	private void deployAllUnder(File deployFolder, File pluginsFolder) {
		File[] listFiles = deployFolder.listFiles();
		for (File f : listFiles) {
			try {
				System.out.println("installing bundle" + f.getName() + " ...");
				Bundle installBundle = context.installBundle("file:"
						+ f.getAbsolutePath());
				System.out.println("Installed Bundle " + f.getName()
						+ " successful");
				moveInstalled2Plugins(f, pluginsFolder);
				removeInstalledFile(f);
				System.out.println("Starting bundle " + f.getName() + " ...");
				installBundle.start();
				System.out.println("Started bundle " + f.getName());
			} catch (BundleException e) {
				System.out.println("Failed to install " + f.getName());
				e.printStackTrace();
			}
		}
	}

 

3.移动和删除

	private boolean moveInstalled2Plugins(File f, File pluginsFolder) {
		return f.renameTo(new File(pluginsFolder, f.getName()));
	}

	private boolean removeInstalledFile(File f) {
		if (f.isFile()) {
			return f.delete();
		} else if (f.isDirectory()) {
			File[] listFiles = f.listFiles();
			for (File sub : listFiles) {
				boolean removeFile = removeInstalledFile(sub);
				if (!removeFile) {
					return false;
				}
			}
			return f.delete();
		}
		return true;
	}

 

4.得到deploy和plugins目录

	private File getDeployFolder() {
		String location = context.getBundle().getLocation();
		URI uri = URI.create(location.replace("\\", "/"));
		File file = new File(uri.getSchemeSpecificPart());
		File eclipseFolder = file.getParentFile().getParentFile();
		File deployFolder = new File(eclipseFolder, DEPLOY_FOLDER_NAME);
		if (!deployFolder.exists() || !deployFolder.isDirectory()) {
			deployFolder.mkdir();
		}
		return deployFolder;
	}

	private File getPluginsFolder() {
		String location = context.getBundle().getLocation();
		URI uri = URI.create(location.replace("\\", "/"));
		File file = new File(uri.getSchemeSpecificPart());
		return file.getParentFile();
	}

 

完了以后,以后每次有新的bundle,只需要放到deploy目录下即可,过一会就会被扫描到并且被自己安装和启动。

  • 大小: 3.3 KB
  • 大小: 9.1 KB
分享到:
评论

相关推荐

    Equinox OSGI ServletBridge 原理与实践.rar

    OSGI 在 J2EE 环境下的应用越来越广泛,目前在 Servlet 应用中使用 OSGI 有两种方式:Servlet Container in OSGI 和 OSGI in Servlet Container. 前一种:和普通的 OSGI bundle 开发差不多,而后一种:Equinox 提供...

    OSGi and Equinox

    标题“OSGi and Equinox”和描述“OSGi and Equinox, Creating Highly Modular Java Systems”表明本文旨在介绍OSGi框架以及它在Eclipse环境下的具体实现Equinox。OSGi是一个Java模块化平台,它允许多个独立的模块...

    osgi 在web容器中部署

    在Web容器中部署OSGi应用,特别是像Tomcat这样的流行Servlet容器,可以提高应用的灵活性、可维护性和可扩展性。本文将详细介绍如何使用桥接技术(如Apache Felix的WebConsole或Pax Web)在Tomcat中部署OSGi程序。 ...

    WEB容器托管OSGi容器(轻量级集成方式)

    标题中的“WEB容器托管OSGi容器(轻量级集成方式)”是指在Web应用程序服务器(如Tomcat、Jetty等)中嵌入OSGi(Open Service Gateway Initiative)框架,实现服务组件的轻量化管理和部署。OSGi是一种动态模块化系统...

    osgi Equinox bridge and spring dm最新jar包

    在实际应用中,开发者需要了解如何配置Equinox容器,创建符合OSGi规范的bundle,编写服务和消费者,以及如何使用Spring DM来管理这些服务的生命周期。这涉及到理解OSGi元数据(如MANIFEST.MF文件),以及如何在XML...

    深入理解OSGi:Equinox原理、应用与最佳实践.pdf

    在OSGi中,每个Bundle都运行在自己的类加载器中,它由Equinox的Bundle加载机制来管理。此外,OSGi还定义了生命周期管理,包括Bundle的安装、启动、停止和更新等。一个Bundle的生命周期可以被划分为以下状态:...

    osgi在web容器中部署的例子

    5. 配置依赖关系:确保所有的bundle都正确声明了它们的依赖,并且在容器中可用。OSGi容器会自动解决这些依赖关系。 6. 测试和调试:启动Tomcat,通过Web应用或直接与OSGi容器交互,测试bundle的功能是否正常。 ...

    Equinox OSGi应用嵌入Jersey框架搭建REST服务

    在本文中,我们将讨论如何在Equinox OSGi环境中嵌入Jersey框架来构建RESTful Web服务。Jersey是JAX-RS(Java API for RESTful Web Services)规范的参考实现,它提供了一种创建高效、高质量REST服务的方法。 首先,...

    OSGi与Equinox 创建高度模块化的Java系统 第4章完整源码

    在"OSGi与Equinox 创建高度模块化的Java系统 第4章完整源码"中,我们可以学习到以下关键知识点: 1. **OSGi模块系统**:理解OSGi的核心概念,如bundle(模块)、服务、生命周期管理(启动、停止、更新、卸载)以及...

    OSGi与Web容器的整合

    这是通过像Equinox的Servlet Bridge这样的技术实现的,它充当了一个桥梁,让OSGi Bundle可以在传统的Web容器中运行。但是,这种方法并不理想,因为它通常较为复杂,而且Web项目本身并没有模块化为OSGi Bundle,因此...

    使用Equinox开发OSGi应用程序

    7. **部署与运行**:一旦bundle开发完成,可以将其打包成jar文件,并在OSGi容器(如Equinox)中运行。部署时,需要考虑bundle间的依赖关系和启动顺序。 【OSGi应用架构】 OSGi应用通常采用模块化和分层架构,每个...

    Geting started with Equinox and OSGi

    2. **创建第一个Bundle**:在OSGi中,模块被称为Bundle。本教程将指导你如何创建并运行一个Bundle。首先,在Eclipse中创建一个新的插件项目作为Bundle。选择“File” > “New” > “Project…”;在弹出的对话框中,...

    基于EQUINOX的 OSGI BUNDLE 运行例子

    标题"基于EQUINOX的OSGI BUNDLE运行例子"指的是一个实际操作示例,展示了如何在EQUINOX OSGi环境中运行OSGi Bundle。EQUINOX提供了一个完整的运行时环境,使得开发者可以方便地管理和执行这些模块化的Bundle。 描述...

    深入理解OSGi:Equinox原理、应用与最佳实践源代码+equinox-SDK-3.8源代码

    8. **案例研究**:通过实际示例,学习如何将Equinox应用于实际项目,如创建插件式应用、实现热更新、以及在企业级应用中集成OSGi。 9. **调试与工具**:了解如何使用Eclipse内置的OSGi工具进行调试,以及如何利用第...

    使用Equinox开发OSGI应用程序工程及源码

    3. **创建OSGi Bundle**:在Eclipse中,创建一个新的Plug-in Project,通过配置MANIFEST.MF文件声明Bundle的元数据,包括 Bundle-SymbolicName、Bundle-Version等。同时,编写Bundle的入口类,实现BundleActivator...

    OSGi与Equinox 创建高度模块化的Java系统 中文扫描版

    OSGi与Equinox 创建高度模块化的Java系统 This first part of the book introduces OSGi and Equinox, Eclipse’s implementation of the OSGi standard. Chapter 1outlines the history and context of OSGi. Its ...

    OSGi与Equinox 创建高度模块化的Java系统 第5章 源码

    在"OSGi与Equinox 创建高度模块化的Java系统 第5章 源码"中,我们可以深入学习如何利用OSGi和Equinox构建模块化系统。这一章节可能涵盖了以下几个核心知识点: 1. **模块系统**:OSGi的核心是模块系统,它定义了...

    Equinox开发OSGi应用程序

    通过OSGi,开发者可以轻松地管理和控制应用程序中的各个模块(即bundles),并能够在运行时动态安装、启动、停止和卸载这些模块。 ##### OSGi框架 为了开发基于OSGi的应用程序,需要使用实现了OSGi标准的框架。...

Global site tag (gtag.js) - Google Analytics