- 浏览: 468371 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (146)
- Maven (3)
- Quartz (10)
- Hessian (3)
- JDK (42)
- eclipse (4)
- 设计思想 (6)
- XML (8)
- JavaMail (1)
- Spring (11)
- mina (1)
- HsqlDb (1)
- Cache (2)
- Tool (6)
- 心情 (5)
- JQuery (0)
- Hadoop (5)
- Hbase (3)
- 自动构建 (7)
- JNDI (0)
- 代码赏析 (5)
- Oracle (1)
- Excel (4)
- Effective Java (5)
- JAXB (4)
- fdafasdf (1)
- ccc (0)
- web (3)
- concurrent (1)
- CVS (1)
- eclipse plugin (2)
- Apache (10)
最新评论
-
chxiaowu:
nice!
Quartz实现固定执行次数 -
zxjlwt:
学习了。http://surenpi.com
自定义ClassLoader -
kadlly:
public static final Logger log ...
Hessian 权限认证 -
spring_springmvc:
java程序语言学习教程 地址http://www.zuida ...
Java-Final -
liushuiwuyan:
[img][/img]
设计模式-单例
Tomcat集成OSGi,首先要选择OSGI服务器,我这里采用的是equinox.jar.
第一步开发OSGI的bundle,这里就不说明了.
第二步构建OSGi在Tomcat下的目录结构如图${Tomcat_Home}/lib
第三步配置OSGI启动项,配置文件[config.ini]内容如下:
第四步关键了,我们把OSGI的生命周期集成到Tomcat容器来管理.
在web容器启动的时候,启动osgi容量,这里提供了一个简单的调用,通过bundleContext可以获取服务,通过反映可以调用osgi方法,并返回结果.[osgi classLoader is not the web classloader].
启动Tomcat,你会发现启动成功,并成功启动osgi容器,调用成功osgi容量的方法.
当然,这里的bundleContext是可以通过JNDI开放到Tomcat容器下的其他web应用使用的.
那么如何把OSGI包装成JNDI开放出去呢
第一步,开发InitialContext
第二步,开发InitialContextFactory
第三步,使用我们自定义的JNDI注册我们的OSGI服务,修改上面的initContext方法
第四步,这样我们的osgi的bundleContext已经注册到Jndi中了,我们要web中,只需要获取我们自定义的JNDI,获取bundleContext就可以了.
这里没作太多的封装,不过成功的把OSGI封装到Tomcat,再把OSGI通过JNDI开放到各个web应用。
第一步开发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应用。
发表评论
-
Java Application Cache
2016-09-27 19:25 884Application Cache is used very ... -
Java 字符串分词
2015-01-02 14:43 1749在Java的世界里有个类型 ... -
jdk 1.6 新特性,集成Groovy, 性能很差
2014-04-02 14:27 1276性能都是相对的,如果调用量不是很大的话,可以忽略,毕竟使用为主 ... -
Fake Code easy implements
2014-04-01 15:41 1026package org.miniframe.modules ... -
JDK regex 用法及用途
2014-03-31 15:48 1214查找 Boolean flag = pattern.mat ... -
生产者消费者(四)
2014-03-04 12:32 1147需求: 多个生产者不断的生产产品,多个消费者不断的消费产品,仓 ... -
生产者消费者(三)
2014-03-04 10:59 959需求: 多个生产者不断的生产产品,多个消费者不断的消费产品,仓 ... -
生产者消费者(二)
2014-03-03 15:40 694需求: 多个生产者不断的生产产品,多个消费者不断的消费产品,仓 ... -
生产者消费者模式(一)
2014-02-28 14:30 1030需求: 多个生产者不断的生产产品,多个消费者不断的消费产品,仓 ... -
查看Class文件使用的JDK版本
2013-10-30 14:17 1115由于JDK一般是向下兼容的,所以有时候本地的JDK版本比类库的 ... -
Java源代码转码
2012-12-20 17:22 1323现在中国的项目很多,编码无非是UTF-8,GBK,GB2312 ... -
JDK的Logging
2012-11-07 15:49 1683jdk自带有一个log日志,对于一般的使用,仅够了. 代码如下 ... -
java.util.*
2012-11-06 14:23 1377java.util 工具包,灰常的有用,有机会一定要研读源码。 ... -
java.util.concurrent.*
2012-11-02 10:38 17761. java.util.concurrent.ArrayBl ... -
java.util.rt.*
2012-10-31 13:51 11131. java.util.HashMap 散列表,主要是以离散 ... -
巧秒设计方法,不返回null
2016-09-27 19:32 723/** * {@inheritDoc} * ... -
java doc 代码文档
2012-07-13 13:58 1330对于代码规范不解释了,网上很多。 在编写代码的时候,有一点灰 ... -
接口与抽象类
2012-07-11 16:53 11241. 接口设计必谨慎,除非业务变更,否则打死不能动接口。[不变 ... -
JVM优化机制好诡异
2012-04-20 08:43 1466long i[] = new long[1000000]; ... -
JVM优化机制好诡异
2016-09-27 19:32 562long i[] = new long[100000 ...
相关推荐
描述中的"源码,文档,配置文件,给初学osgi的朋友"进一步确认了资源的内容,包括源代码、相关文档、配置文件,这些都是学习者理解并实践Tomcat与OSGi集成的重要材料。特别是对于初学者,这些资源能够提供详尽的步骤和...
总的来说,这个资源包旨在帮助开发者了解和实践如何在Tomcat服务器上集成和运行基于OSGi的应用程序,通过这样的集成,开发者可以享受到OSGi带来的模块化和动态性优势,同时利用Tomcat作为强大的Web服务器基础。...
标题中的“tomcat嵌入OSGI容器”是指在Apache Tomcat服务器中集成OSGI(Open Service Gateway Initiative)框架,使得Tomcat能够支持模块化的应用程序部署和管理。OSGI是一种Java平台上的服务导向架构,它允许动态地...
通过遵循这些步骤,开发者可以迅速了解并实践Tomcat-Osgi集成。 总的来说,Tomcat-Osgi为开发者提供了一种强大的方式,以模块化和动态的方式管理和部署Tomcat上的应用程序,极大地增强了开发效率和系统的灵活性。
标题中的“tomcat-osgi”指的是将开源的Java应用服务器Apache Tomcat与OSGi(Open Service Gateway Initiative)框架集成的版本。OSGi是一种模块化系统,主要用于Java应用程序,它允许开发者将应用程序分解为一系列...
扩展Tomcat支持OSGi应用服务项目文件。其项目为eclipse工程。项目说明请参见我的blog《扩展Tomcat支持OSGi应用服务》:http://blog.163.com/haizai219@126/blog/static/44412555200971223629869/
这些工具可以将OSGi环境集成到Tomcat中,允许OSGi bundles作为Web应用的一部分运行。 Apache Felix WebConsole是一个基于Web的管理界面,可以用来管理和控制OSGi环境。你可以将其作为一个OSGi bundle部署到Tomcat中...
Tomcat本身并不直接支持OSGi,但可以通过一些开源项目如Pax Web或Apache Tomcat Mod OSGi来实现对OSGi的支持。Pax Web是一个用于在各种Java应用服务器上运行OSGi的HTTP服务,而Apache Tomcat Mod OSGi则是一个Tomcat...
然而,对于轻量级的解决方案,Eclipse Gemini Web项目提供了将Tomcat或Jetty集成到OSGi环境的方法,创建了一个OSGi Web Container。 **2.3 开发环境准备** 为了在Eclipse中开发OSGi Web应用,需要安装相应的插件,...
JVM、OSGI(Open Service Gateway Initiative)和Tomcat等容器都涉及到了类加载器的概念,理解它们的工作原理对优化应用性能和解决依赖冲突至关重要。 1. JVM类加载器: - **父类加载器**:在Java中,类加载器之间...
6. **开发和部署**: 使用这些jar文件,开发者可以按照博客"OSGi环境下建立Web工程的Hello World"中的步骤,创建并部署OSGI兼容的Web应用。这通常涉及编写bundle的MANIFEST.MF文件来声明导出和导入的包,以及如何配置...
"基于OSGi和Spring开发Web应用" OSGi(Open Service Gateway ...本文通过一个简单实例,介绍了如何利用 Spring-DM 开发基于 OSGi 和 Spring 架构的 Web 应用,并对 OSGi 和 Spring 的相关知识点进行了详细的解释。
2. **Web容器集成**:将OSGi容器集成到Web服务器中,例如通过Servlet容器的插件机制,如Tomcat的ContextListener或Jetty的ServerHandler。这样,OSGi容器可以作为一个服务提供者,为Web应用提供服务。 3. **服务...
在基于OSGi和Spring开发Web应用的过程中,首先需要指定Target Platform到所有需要用到的bundle包目录中,这是为了确保开发环境能够识别并正确加载所有必要的组件。接下来,创建一个服务接口bundle,定义接口类及其...
OSGi(Open Services Gateway Initiative)是一种开放标准,用于创建模块化Java应用程序,它允许开发者将应用程序分解为独立的、可管理的组件,称为服务。Web示例工程是使用OSGi技术构建的一个具体应用,通常包括了...
在基于OSGi和Spring开发Web应用中,OSGi(Open Services Gateway Initiative)是一个开放标准,用于创建模块化Java应用程序。它允许开发者将应用程序分解为独立的模块,称为bundle,每个bundle都包含自己的类路径、...
在本文中,我们将深入探讨如何基于VirgoServer进行Spring Osgi Web开发,这是一个涉及OSGi容器、Spring框架和Web应用程序的集成技术。首先,我们需要确保拥有正确的开发环境和工具,包括Spring Tool Suite (STS),...
本篇将详细探讨如何基于OSGi和Spring来开发Web应用,并通过提供的代码示例进行解析。 首先,OSGi是一种模块化系统,它允许Java应用程序以组件的形式进行组织和管理。这种模块化特性使得开发者可以独立地更新、替换...
3. **Web服务集成**:OSGI可以通过使用如CXF或Apache Felix Web Service等库来创建和消费Web服务。这些库可以帮助你将OSGI服务暴露为Web服务,或者将Web服务的调用封装到OSGI模块中。 4. **SOAP与WSDL**:在例子中...