前几日,有网友提了一个问题:用blueprint注册了 一个servlet服务,并将另一个osgi服务注入这个 servlet服务bean里,以便在处理用户的http请求 时调用。但是部署运行后,发现servlet那里注入 的osgi服务一直为null。
表面上,以上的应用似乎设计简单合理。为什么 会出现这样的问题呢? 原因很简单:此servlet非彼 servlet。
当blueprint容器建立起模型时,上例提到的 servlet bean已实例化并注入了所需的osgi服务。 但是,当用户发起http请求时,一个新的servlet 实例在HttpService那里被创建,这个servlet实例 不是blueprint容器创建的那个,而且因为这个 servlet不是由blueprint容器托管的,所以不会被 注入所需的那个osgi服务,自然那个服务引用就 一直为null了。
问题原因找到了,那么怎么样在这个非blueprint 托管的servlet实例里引用osgi服务呢?
blueprint在发布一个osgi服务时,还会将它同时 注册到jndi上,所以,你可以用这个服务的jndi名 来查找到这个服务并引用它。
Blueprint的OSGI服务JNDI名是这样定义的:
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0";
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 ;http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd"
default-timeout="0">
< reference id="CoderService" interface="com.ponder.ICodeService"/>
</blueprint>
那么,blueprint就会注册一个jndi名为 blueprint.comp/CoderService的jndi entry。
在serlvet里就可以这样引用这个服务:
import javax.naming.InitialContext;
import javax.naming.NamingException;
... ...
try {
InitialContext ic = new InitialContext();
com.ponder.ICodeService ref= (com.ponder.ICodeService) ic.lookup("blueprint:comp/CoderService");
if(null!=ref){
... ...
}
} catch (NamingException e) {
... ...
}
由于OSGI的服务是动态的,可能以上代码在运行 时,CoderService服务未必存在,所以,以上代 码需判断服务引用ref是否为null。
以上解决方案可以解决我们的问题,但并不完 美,是否还是可以象最初想的那样,直接通过 blueprint注入osgi服务,而不需要借助JNDI呢? 容我想想看先... ...。
分享到:
相关推荐
OSGi的入门资料,网上找的,初探OSGi 的全文
OSGi的入门教程,帮助初学者快速了解OSGi的定义、用途及组成。
强大的OSGI框架入门和例子,看看eclipse就知道OSGI有多强大了。希望对大家有用!
OSGI 入门资料PDF,包括OSGI实战、OSGI进阶、OSGI 入门和整合Spring、OSGI原理与最佳实践
osgi-blueprint-helloworld 概述 一个使用OSGI蓝图容器规范的非常简单的HelloWorld示例。 想要查询更多的信息: osgi-blueprint-helloworld-api 应用程序API osgi-blueprint-helloworld-server 发布服务以供...
Spring OSGI 快速入门中文教程
NULL 博文链接:https://conkeyn.iteye.com/blog/2113824
OSGI简单入门.doc
osgi webservice入门
OSGI入门和整合Spring OSGI入门和整合Spring
spring-osgi 入门手册和代码 spring-osgi 入门手册和代码 spring-osgi 入门手册和代码 spring-osgi 入门手册和代码
总结了osgi服务发布和获取的多种方式。
Equinox这个工程,对Equinox进行了试用,不出意料,尽管Equinox还没有正式的发布版本,甚至连里程碑版本都还没有,但Equinox作为OSGI R4 RI,表现非常出色,特别是借助Eclipse提供的IDE,更是令它在OSGI框架的竞争中...
Spring OSGi 入门.pdf Spring OSGi 入门.pdf
OSGI入门和整合Spring + OSGI进阶 + OSGI实战
OSGi 入门级教程OSGi 入门级教程OSGi 入门级教程OSGi 入门级教程中文版
blueprint-osgi-bundle
关于SOA中热门技术OSGI的入门样例的经典版本,供对需要进行ERP设计和学习的入门读者使用的经典
资源名称:OSGI原理与最佳实践内容简介:国内第一本OSGi图书OSGi国内推广者林昊多年经验的结晶涵盖OSGi从入门到深入的知识体系引领OSGi国内研究和普及本书基于作者多年使用OSGi的经验而编写,涵盖了OSGi从入门到深入...