模块化Java:动态模块化 - 编程入门网
gi> start 1 2 3 4
osgi> shorten http://www.infoq.com
http://tinyurl.com/yr2jrn
osgi> stop 3
osgi> shorten http://www.infoq.com
http://tr.im/Eza8
注意,在运行时TinyURL和Tr.im服务都是可用的,但是一次只能使用一种服 务。可以设置一个服务级别(service ranking),这是一个整数,取值范围在 Integer.MIN_VALUE和Integer.MAX_VALUE之间,当服务最初注册时给 Constants.SERVICE_RANKING赋予相应值。值越大表示级别越高,当需要服务时 ,会返回最高级别的服务。如果没有服务级别(默认值为 0),或者多个服务的 服务级别相同,那么就使用自动分配的Constants.SERVICE_PID,可能是任意顺 序的一个服务。 另一个需注意的问题是:当我们停止一个服务时,client会自动失败转移到 列表中的下一个服务。每当该命令执行时,它会获取(当前)服务来处理 URL压 缩需求。如果在运行期间服务提供程序发生了变化,不会影响命令的使用,只要 有此需求时有服务在就成。(如果你停止了所有服务提供程序,服务查找将返回 null,这将会打印出相应的错误信息——好的代码应该确保程序能够预防返回服 务引用为null的情况发生。) 服务跟踪 除过每次查询服务外,还可以用ServiceTracker来代替做这一工作。这就跳 过了中间获得ServiceReference的几步,但是要求你在构造之后调用open,以便 开始跟踪服务。 对于ServiceReference,可以调用getService()获得服务实例。而 waitForService()则在服务不可用时阻塞一段时间(根据指定的timeout。如果 timeout为0,则永远阻塞)。我们可以如下重新实现shorten命令:
使用Service Tracker的常见问题是在构造后忘记了调用open()。除此之外, 还必须在MANIFEST.MF内部引入org.osgi.util.tracker包。 使用ServiceTracker来管理服务依赖通常被认为是管理关系的好方法。在没 有使用服务的情况下,查找已输出的服务稍微有点复杂:比如, ServiceReference在其被解析为一个服务之前突然变得不可用了。存在一个 ServiceReference的原因是,相同实例能够在多个bundle间共享,而且它可以被 用来基于某些标准(手工)过滤服务。而且,它还可以使用过滤器来限制可用服 务的集合。 模块化Java:动态模块化(5)时间:2010-11-29 infoq 译:宋玮服务属性和过滤器 当一个服务注册时,可以将服务属性一起注册。大多情况下属性可以为null ,但是也可以提供OSGi特定或关于URL的通用属性。例如,我们想给服务分级以 便区分优先级。我们可以注册Constants.SERVICE_RANKING(代表优先级的数值 ),作为最初注册过程的一部分。我们可能还想放一些 client想知道的元数据 ,比如服务的主页在哪儿,该站点的条款链接。为达此目的,我们需要修改 acti |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |