快速业务通道

模块化Java:动态模块化 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
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命令:

package com.infoq.shorten.command; import java.io.IOException; import org.osgi.framework.BundleContext; import org.osgi.util.tracker.ServiceTracker; import com.infoq.shorten.IShorten; public class ShortenCommand {   protected ServiceTracker tracker;   public ShortenCommand(BundleContext context) {   this.tracker = new ServiceTracker(context,    IShorten.class.getName(),null);   this.tracker.open();   }   protected String shorten(String url) throws  IllegalArgumentException,    IOException {   try {    IShorten shorten = (IShorten)    tracker.waitForService(1000);    if (shorten == null)    return null;    return shorten.shorten(url);   } catch (InterruptedException e) {    return null;   }   } }

使用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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号