`

Tomcat集成OSGI,并通过JNDI开放Web调用

    博客分类:
  • JDK
 
阅读更多
Tomcat集成OSGi,首先要选择OSGI服务器,我这里采用的是equinox.jar.

第一步开发OSGI的bundle,这里就不说明了.
第二步构建OSGi在Tomcat下的目录结构如图${Tomcat_Home}/lib


第三步配置OSGI启动项,配置文件[config.ini]内容如下:
osgi.noShutdown=true
osgi.bundles=reference\:file\:bundles/org.apache.commons.logging_1.0.4.v201101211617.jar@start,reference\:file\:bundles/org.eclipse.osgi.services_3.3.0.v20110513.jar@start,reference\:file\:bundles/DictQuery_1.0.0.jar@start,reference\:file\:bundles/RomoteDictQuery_1.0.0.jar@start,reference\:file\:bundles/LocalDictQuery_1.0.0.jar@start
osgi.bundles.defaultStartLevel=4

第四步关键了,我们把OSGI的生命周期集成到Tomcat容器来管理.
package standard.osgi.jndi;

import java.lang.reflect.Method;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.apache.catalina.Lifecycle;
import org.apache.catalina.LifecycleEvent;
import org.apache.catalina.LifecycleListener;
import org.eclipse.core.runtime.adaptor.EclipseStarter;
import org.osgi.dictquery.query.QueryService;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;

public class OsgiListener implements LifecycleListener {
	
	private static Logger log = Logger.getLogger(OsgiListener.class.getName());
	 
    private String osgiType = "Equinox";
    
    private BundleContext bundleContext; 
    
    private static OsgiListener listener = null;
    
    public static OsgiListener getInstance(){
    	return listener;
    }

	public BundleContext getBundleContext() {
		return bundleContext;
	}

	public void setBundleContext(BundleContext bundleContext) {
		this.bundleContext = bundleContext;
	}

	@Override
	public void lifecycleEvent(LifecycleEvent event) {
		if (Lifecycle.AFTER_INIT_EVENT.equals(event.getType())) { 
	           log.info("The osgi content is initialized. Using osgi content:"+ osgiType); 
	           try { 
	             // initContent();
	           } catch (Exception e) {
	        	   log.log(Level.SEVERE, "初始化osgi失败"+e.getCause());
	           }

	       } else if (Lifecycle.START_EVENT.equals(event.getType())) {

	           try {

	              log.info("Starting osgi service.");

	              EclipseStarter.run(new String[] { "-console" }, null);
	              initContent();
	              log.info("Starting osgi service invoke.");
	            //获取服务
	            //this interface is not the osgi's interface.
	          //	QueryService queryService = null;
	              Object queryService = null; 
	              ServiceReference serviceRef = bundleContext.getServiceReference(QueryService.class.getName());
	              if(null != serviceRef){
	          		queryService = bundleContext.getService(serviceRef);
	          	}
	             Method method =  queryService.getClass().getDeclaredMethod("queryWorld", String.class);
	             Object result = method.invoke(queryService, "sky");
	             System.out.println("11Result is " +new String(result.toString().getBytes(),"GB2312"));

	           } catch (Exception e) {

	              e.printStackTrace();

	              log.info("Starting the osgi content occured error. "

	                     + e.getMessage());

	           }

	       } else if (Lifecycle.STOP_EVENT.equals(event.getType())) {

	           try {

	              log.info("Stopping osgi service.");

	              EclipseStarter.shutdown();

	           } catch (Exception e) { 
	              log.info("Stopping the osgi content occured error. "

	                     + e.getMessage());

	           }

	       }

	}

	/**
	 * 初始化osgi
	 */
	private void initContent() { 
		bundleContext = EclipseStarter.getSystemBundleContext(); 
		listener = this;
	}

}


在web容器启动的时候,启动osgi容量,这里提供了一个简单的调用,通过bundleContext可以获取服务,通过反映可以调用osgi方法,并返回结果.[osgi classLoader is not the web classloader].
启动Tomcat,你会发现启动成功,并成功启动osgi容器,调用成功osgi容量的方法.
当然,这里的bundleContext是可以通过JNDI开放到Tomcat容器下的其他web应用使用的.
那么如何把OSGI包装成JNDI开放出去呢

第一步,开发InitialContext
package standard.osgi.jndi;

import java.util.HashMap;
import java.util.Hashtable;

import javax.naming.InitialContext;
import javax.naming.NamingException;

public class MyInitialContext extends InitialContext {
	
	private static HashMap<String, Object> map = new HashMap<String, Object>();  

	public MyInitialContext() throws NamingException {
		super(); 
	}
	
	public MyInitialContext(Hashtable<?,?> environment) throws NamingException {
		super(environment);
	}

	@Override
	public void bind(String name, Object obj) throws NamingException { 
		map.put(name, obj);
	}

	@Override
	public void unbind(String name) throws NamingException {
		map.remove(name);
	}

	@Override
	public Object lookup(String name) throws NamingException {
		return map.get(name);
	} 
}


第二步,开发InitialContextFactory
package standard.osgi.jndi;

import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.spi.InitialContextFactory;

public class MyInitialContextFactory implements InitialContextFactory{

	@Override
	public Context getInitialContext(Hashtable<?, ?> environment)
			throws NamingException { 
		return new MyInitialContext();
	}

}



第三步,使用我们自定义的JNDI注册我们的OSGI服务,修改上面的initContext方法
	/**
	 * 初始化osgi
	 */
	private void initContent() { 
		bundleContext = EclipseStarter.getSystemBundleContext();  
		try {
			Hashtable env = new Hashtable(); 
			//env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");
			env.put(Context.INITIAL_CONTEXT_FACTORY, "standard.osgi.jndi.MyInitialContextFactory");  
			Context ctx = new InitialContext(env);
			ctx.bind("init/context", bundleContext);
		} catch (NamingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

第四步,这样我们的osgi的bundleContext已经注册到Jndi中了,我们要web中,只需要获取我们自定义的JNDI,获取bundleContext就可以了.
 Hashtable env = new Hashtable(); 
	  			//env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");
	  			env.put(Context.INITIAL_CONTEXT_FACTORY, "standard.osgi.jndi.MyInitialContextFactory");  
	  			Context ctx = new InitialContext(env);
	  			BundleContext bundleContextJndi = (BundleContext)ctx.lookup("init/context");
	              Object queryService = null; 
	              ServiceReference serviceRef = bundleContextJndi.getServiceReference(QueryService.class.getName());
	              if(null != serviceRef){
	          		queryService = bundleContextJndi.getService(serviceRef);
	          	}
	             Method method =  queryService.getClass().getDeclaredMethod("queryWorld", String.class);
	             Object result = method.invoke(queryService, "sky");
	             System.out.println("jndi Result is " +new String(result.toString().getBytes(),"GB2312"));


这里没作太多的封装,不过成功的把OSGI封装到Tomcat,再把OSGI通过JNDI开放到各个web应用。

  • 大小: 22.2 KB
分享到:
评论

相关推荐

    tomcat 集成 osgi服务,示例源码

    描述中的"源码,文档,配置文件,给初学osgi的朋友"进一步确认了资源的内容,包括源代码、相关文档、配置文件,这些都是学习者理解并实践Tomcat与OSGi集成的重要材料。特别是对于初学者,这些资源能够提供详尽的步骤和...

    tomcat-osgi.rar_OsgiContentFactory_osgi_osgi tomcat 集成_osgi tom

    总的来说,这个资源包旨在帮助开发者了解和实践如何在Tomcat服务器上集成和运行基于OSGi的应用程序,通过这样的集成,开发者可以享受到OSGi带来的模块化和动态性优势,同时利用Tomcat作为强大的Web服务器基础。...

    tomcat嵌入OSGI容器

    标题中的“tomcat嵌入OSGI容器”是指在Apache Tomcat服务器中集成OSGI(Open Service Gateway Initiative)框架,使得Tomcat能够支持模块化的应用程序部署和管理。OSGI是一种Java平台上的服务导向架构,它允许动态地...

    Tomcat-Osgi

    通过遵循这些步骤,开发者可以迅速了解并实践Tomcat-Osgi集成。 总的来说,Tomcat-Osgi为开发者提供了一种强大的方式,以模块化和动态的方式管理和部署Tomcat上的应用程序,极大地增强了开发效率和系统的灵活性。

    tomcat-osgi压缩包

    标题中的“tomcat-osgi”指的是将开源的Java应用服务器Apache Tomcat与OSGi(Open Service Gateway Initiative)框架集成的版本。OSGi是一种模块化系统,主要用于Java应用程序,它允许开发者将应用程序分解为一系列...

    扩展Tomcat支持OSGi应用服务 工程文件

    扩展Tomcat支持OSGi应用服务项目文件。其项目为eclipse工程。项目说明请参见我的blog《扩展Tomcat支持OSGi应用服务》:http://blog.163.com/haizai219@126/blog/static/44412555200971223629869/

    osgi 在web容器中部署

    这些工具可以将OSGi环境集成到Tomcat中,允许OSGi bundles作为Web应用的一部分运行。 Apache Felix WebConsole是一个基于Web的管理界面,可以用来管理和控制OSGi环境。你可以将其作为一个OSGi bundle部署到Tomcat中...

    osgi在web容器中部署的例子

    Tomcat本身并不直接支持OSGi,但可以通过一些开源项目如Pax Web或Apache Tomcat Mod OSGi来实现对OSGi的支持。Pax Web是一个用于在各种Java应用服务器上运行OSGi的HTTP服务,而Apache Tomcat Mod OSGi则是一个Tomcat...

    OSGi与Web容器的整合

    然而,对于轻量级的解决方案,Eclipse Gemini Web项目提供了将Tomcat或Jetty集成到OSGi环境的方法,创建了一个OSGi Web Container。 **2.3 开发环境准备** 为了在Eclipse中开发OSGi Web应用,需要安装相应的插件,...

    JVM、Tomcat、OSGI等类加载器整理文档

    JVM、OSGI(Open Service Gateway Initiative)和Tomcat等容器都涉及到了类加载器的概念,理解它们的工作原理对优化应用性能和解决依赖冲突至关重要。 1. JVM类加载器: - **父类加载器**:在Java中,类加载器之间...

    OSGI中包含web服务器配置需要的jar.zip

    6. **开发和部署**: 使用这些jar文件,开发者可以按照博客"OSGi环境下建立Web工程的Hello World"中的步骤,创建并部署OSGI兼容的Web应用。这通常涉及编写bundle的MANIFEST.MF文件来声明导出和导入的包,以及如何配置...

    基于OSGi和Spring开发Web应用.doc

    "基于OSGi和Spring开发Web应用" OSGi(Open Service Gateway ...本文通过一个简单实例,介绍了如何利用 Spring-DM 开发基于 OSGi 和 Spring 架构的 Web 应用,并对 OSGi 和 Spring 的相关知识点进行了详细的解释。

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

    2. **Web容器集成**:将OSGi容器集成到Web服务器中,例如通过Servlet容器的插件机制,如Tomcat的ContextListener或Jetty的ServerHandler。这样,OSGi容器可以作为一个服务提供者,为Web应用提供服务。 3. **服务...

    基于OSGi和Spring开发Web应用

    在基于OSGi和Spring开发Web应用的过程中,首先需要指定Target Platform到所有需要用到的bundle包目录中,这是为了确保开发环境能够识别并正确加载所有必要的组件。接下来,创建一个服务接口bundle,定义接口类及其...

    OSGi Web示例工程

    OSGi(Open Services Gateway Initiative)是一种开放标准,用于创建模块化Java应用程序,它允许开发者将应用程序分解为独立的、可管理的组件,称为服务。Web示例工程是使用OSGi技术构建的一个具体应用,通常包括了...

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

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

    基于VirgoServer进行Spring Osgi Web开发

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

    基于OSGi和Spring开发Web应用的Demo

    本篇将详细探讨如何基于OSGi和Spring来开发Web应用,并通过提供的代码示例进行解析。 首先,OSGi是一种模块化系统,它允许Java应用程序以组件的形式进行组织和管理。这种模块化特性使得开发者可以独立地更新、替换...

    OSGI + Webservice 例子

    3. **Web服务集成**:OSGI可以通过使用如CXF或Apache Felix Web Service等库来创建和消费Web服务。这些库可以帮助你将OSGI服务暴露为Web服务,或者将Web服务的调用封装到OSGI模块中。 4. **SOAP与WSDL**:在例子中...

Global site tag (gtag.js) - Google Analytics