Java 版 (精华区)

发信人: zhangyan (电梯吃人啊), 信区: Java
标  题: Jini实战——简介、范例讲解、常见问题讨论
发信站: 哈工大紫丁香 (2001年05月15日12:45:06 星期二), 站内信件


JINI实战-简介、范例讲解、常见问题探讨 作者:陆绍飞 发布时间:2001/05/14
文章摘要:
  1999年1月25日,Sun公司推出了具有革命性的新技术Jini,将Java技术所建立起来
的基于开放性标准的以网络为中心的计算模式向前推进。Jini技术摧毁了传统的网络壁
垒,它能使用户从任何地点将任何消费类电子产品和企业设备简单地与网络相连。Jini
技术的重要特性就是简单。
----------------------------------------------------------------------------
----
正文:
JINI实战-简介、范例讲解、常见问题探讨
  1999年1月25日,Sun公司推出了具有革命性的新技术Jini,将Java技术所建立起来
的基于开放性标准的以网络为中心的计算模式向前推进。Jini技术摧毁了传统的网络壁
垒,它能使用户从任何地点将任何消费类电子产品和企业设备简单地与网络相连。Jini
技术的重要特性就是简单。有了这个"简单性",就完全不必考虑过去那些兼容性、可靠
性或是管理性能等诸多问题,而正是这些传统的壁垒限制了人们在网络之间实现成功的
配置。
  Jini技术是在美国加州旧金山市举行的Sun全球分析家大会上发布的,它一发布就得
到业界30多个主要合作伙伴的大力支持。目前,这些合作伙伴正在将Jini技术纳入他们
下一代的家用或商用器件之中,所有这些新型器件都能与网络实现互操作。围绕Jini技
术所形成的社团已呈现这样的迹象:即将出现的新型器件将覆盖极其广泛的应用范围,
从磁盘驱动器到洗衣机,因为这些正在应用Jini技术源代码的厂商们已拥有了创造多种
多样的新颖产品的全新的途径和方法。"Jini技术与我们今天看到的这个过度复杂的无情
的网络根本不同,"Sun公司Jini技术部总经理Mike Clary说,"通过将五彩缤纷的各种器
件连入网络,Jini技术将基于网络的信息带给了广大用户,也带给了供应商们。它将使
Internet的潜在利益实实在在地呈现出来,并促进商业与个人计算间的融合。Jini是一
种创新技术。它使用简单,并能将无限的灵活性和一种所谓'防弹'的从不受损的恢复性
相结合,让任何人都能一道工作。"
  Jini连接技术,已得到从消费类电子产品制造商、软件开发商,到服务提供商等业
界主要合作伙伴的广泛支持。Jini技术创造了一套崭新、完整的网络访问方法,从而为
信息、服务和产品的新提供方式打开了大门。在Jini技术的试用性工作中,许多业界颇
有声望的公司一直与Sun公司积极合作,他们为此创新技术的推出贡献了力量。预计,基
于Jini技术的产品将在今年晚些时候开始推出。
  什么是Jini
  长久以来许多工程师们,都一直期盼著一个超大型的计算系统,这系统是由网路上
许多机器,从超大型主机乃至嵌入在某些设备上的微小晶片,彼此相互合作而成。所有
的工作,都可以在任何时间被分散到网路上的任何地方、任何种类的机器上去处理。这
样的系统有很好的弹性,并且可以藉由不断地更新设备,来解决更多问题。
  然而,我们 要一致的语言,以及更强的通讯协定( superprotocols)等,让网路
上众多繁杂的成员,能彼此顺利地沟通。但是就目前的情况,要达到这样的目的很难,
因此我们可以考虑把一种特殊的程式码(genetic code)嵌入到许多软硬体之服务中,
使得网路上的成员可以轻易的相互分享彼此资源,这就是 Jini 所要达成的目标。
  Jini 是由 SUN 公司 R&D 的Bill Joy 所提出的一项技术。我们可以藉著使用Jini
,创造出一个富有弹性、容易管理、且可随时随地使用各种服务的网路计算环境。为了
让使用者知道网路上有哪些服务可被使用,我们必须建立一个联盟( federation ),让
网路上的服务主动加入。当有某个服务加入联盟时,也等於同时向整个网路告知:「我
可以被使用,有谁 要我的服务?使用者透过联盟,可以得知有哪些服务可以使用。然
而,我们要如何才能很简单、很轻易地使用这些服务关於这个问题,也就是 Jini 的工
作重点之一。
  让我们来看看Jini 是怎堋做的。网路上的服务要能够成为联盟的一份子,不管是硬
体服务也好、软体服务也好,都必须嵌入Jini 的程式码。此外,网路上还必须提供 JV
M的环境,才能执行Jini程式以获得这些服务。Jini的程式码是利用 SUN 公司所提供的
 Jini package 撰写而成。Jini package使用的语言是Java,并且包含了许多处理网路
上资源的相关功能。例如:如何帮助网路服务寻找(discovery)、以及加入(join)联
盟;或者帮助网路服务处理分散式的承租(leasing)、交易( transactions)等的问题
。而这些网路服务彼此沟通时,所应用的技术是 RMI(Java Remote Method Invocatio
n )。简言之,网路上的服务藉由 Jini 所提供的介面,得以相互沟通、合作,来完成
使用者的请求。
  Java技术独立于平台所能做的事情,正是Jini技术让器件相互操作所能做的事情。
Jini技术呈现为一种没有制约的标准,这一标准能使任何传统的和非传统的联网器件相
互对话。它还作为一种效果性的平台,使这些器件之间共享服务,这都是过去从没有过
的事。因为它是建立在Java技术的基础之上的独立于平台的、基于语言的技术,所以,
Jini不需要任何特殊的操作系统、处理器或应用环境。
开发平台
  目前开发Jini系统的平台之最新版本为1.0,其中包括 JiniTM System Software S
tarter Kit(Jini Starter Kit)、JiniTM Technology Core Platform Compatibilit
y Kit (TCK)(测试环境)、JavaSpacesTM Technology Kit ( JSTK)(利用Jini 实
作出来的服务)三个套件[3] 。
  Jini Starter Kit 涵盖所有开发Jini 系统所 之套件,有JiniTM Technology Co
re Platform(JCP)、 JiniTM Technology Extended Platform (JXP)、与JiniTM S
oftware Kit(JSK )。其中JCP为Jini 的核心技术,包括 discovery、lookup 、leas
e等几个 packages,放在 net.jini.core目录里。JXP提供比JCP 更扩充之功能,包括d
iscovery、 lookup、space等几个packages,放在 net.jini目录里。而JSK为用JCP实做
出的lookup、 transaction服务与一些实用的类别, mahout、reggie等几个packages,
放在com.sun.jini目录里。其中SUN公司将已经实作出的 JiniTM Transaction 称做 "m
ahout",而实作出的JiniTM Lookup service称做 "reggie"。
  Jini技术在系统中的位置
  Jini使原来互不相容的系统具备兼容性,因此,它可使用户将任何器件,从个人数
字助理(PDA)到数字立体声设备(DVD),无缝地、即刻奏效地、"即插即连"地接入到
一个真正开放的无处不在的网络之中。有了这样的即刻连接性,Jini技术就使用户获得
了一种与我们这个数字世界互操作的新颖的简便方法,在任何时间、任何地点,从任何
器件上都能将家庭与办公室、与街道相连。与代表电话持续接入的拨号音相似,Jini技
术在网络上也提供一个无缝的Web音。Jini技术与那种由操作系统控制的网络有本质不同
,因为它完全不需要庞大复杂的操作系统,取而代之的是采用各种智能接口的对网络的
直接插入。Jini技术可用于现有的网络基础设施,随着网络的进展,Jini保证了各种传
统器件的持续发展。
  Jini技术包括了四大方面的功能,这些功能使得它的连接性真正得以简化:
  立即上网:将一个器件插入一个应用了Jini技术的网络中,该器件即刻便可工作。
该器件一方面保留了它原来的所有应用,另一方面它又成为了一位"很好的网络居民"。

  独特的提供功能:所有通过Jini技术连入网络的器件都能对整个网络提供它们的服
务,因此,用户可以根据需求充分享受该器件所提供的服务。
  即刻"共同体":Jini技术可使用户创建自己个人的由联网器件组成的"共同体",这
些器件可移动使用。该共同体还能与其他共同体简单、快速地互操作,而无需进行系统
管理。
  恢复性:Jini技术是一个完全分布式的系统,它独立于任何中心服务器。如果一个
器件出了故障,将不会波及其他任何器件。因此,Jini技术环境是具有极其灵活和适用
性的环境。全新的信息利用方式因为采用Jini技术的环境是完全动态的,具有快速相应
性。因此,连在一起工作的器件便对一个基于网络的信息服务的全新领域提供了连续可
靠的接入。例如,用Jini技术连接的器件之间可以自动地互操作,以最低的巡回速率持
续寻找利用地点,或者可以"剪裁"和分出几个同时需要的家庭式的"抵押"小应用。
  Sun与业界37家领先公司一道积极支持这一突破性的使能技术并使之能开发更多新品
牌的产品与服务。
  Jini技术可以用于任何连入网络的器件,而不论该器件运行什么软件或运行在哪种
硬件设备之上。Jini技术是以网络器件的一个构件的面貌出现的。它为器件如何连入网
络、共享信息和与网络进行互操作建立了一套规则,而同时又保持了对用户的完全透明
。因为Jini技术与平台无关,采用它的器件不再受到所用软件、处理器、设备驱动器,
或传统网络协议的制约。
  让我们看看采用Jini技术的产品实例。用于办公室外设:如采用Jini技术可以将膝
上型电脑、打印机、磁盘驱动器,以及其他器件连到公司网络的任何地方,并能提供相
应的用途;用于消费类电子器件:用户可以采用Jini技术将任何消费类电子器件与任何
网络服务相连。例如,用户可以从网络下载一部电影到电视机顶盒中,然后用网络提供
的存储服务将它存储起来,等到用户方便的时候再观看。
  Jini也为软件开发商和服务供应商提供了新的商业机会:Jini技术可以为这些新的
市场创造并配置新的产品和服务。例如,媒体可以在它的某个读者的家用打印机上提供
一份完全满足该读者需求的报纸。
  为器件制造商提供了新的商业机会:因为Jini技术使许多扩展能力成为可能,这使
器件制造商能够创造出更多新品牌的产品。例如,一台联入网络的洗衣机,在无需用户
干预的情况下便可自动发现有衣服要洗并能迅速将衣服清洗干净。
  六个月以前,开发商们就已开始享用Jini技术。今天,Jini技术已经成为了从Web网
站(http://www.sun.com/jini)上即可获得的产品。积极支持Jini技术的开发商们越来
越多地加入到Jini技术许可者社团中来。这个Jini技术许可者社团是推动Jini技术开发
应用的核心计划,消费类电子产品和计算机业界的著名公司几乎都在这个社团之中。所
谓社团,就是其中的每一个成员都要积极参与、做出贡献,并共享成果。Sun公司向社团
源代码许可者(CSL)免费提供Jini技术源代码。这一授权模式使开发商们不断推出创新
产品,由市场去判断和决定哪些产品是真正的创新,什么样的兼容性标准是必须给予支
持的,而无需为那些毫无商业用途的产品下功夫。
  Jini技术架构
  首先,让我们看一下Jini中涉及的一些概念。
  对象:在Jini网络中,每一个器件和命令都是作为对象来识别的。其结果就形成了
一个明了一系列分布式服务的完全分布式系统。
  发现与加入:Jini背后的最重要的机制就是这种插入,并沿着网络寻找和确定在"共
同体"中有什么其他的器件和服务,从而将它们连接起来的能力。这种查寻服务允许用户
在任何给定的时间内浏览和查看网络上提供些什么东西。
  自动识别:连入网络的各个器件都自己识别自己,并将自身纳入这个"共同体"。这
个即刻"共同体"无需任何别的驱动器件。
  远程方法调用:Jini技术由很小的Java技术编码组成,因此,就形成了一种可移动
性编码,允许数据和编码在网络中以一种黏着性的方式在对象间移动。这是创建器件和
服务的即时性动态"共同体"的关键。
  租用:提供一种在网络环境中管理、共享和更新资源的方法。
  同步处理:能使各个分布式实体以一种非竞争性方式协同工作,共享网络资源,如
存储设备、文件、打印能力和带宽等。
  通告:利用网络环境中的信息特性帮助自愈过程。
  分布式安全性:考虑重要的访问控制目录,对一个服务的访问取决于与该服务相关
的服务控制目录。
  Jini是一种新的系统架构。Jini技术并不是包含于某一独立的计算机中,或将其理
解为一系列计算机所组成的网络系统。这不仅因为它接受其它设备的机制不同于我们通
常情况下向网络中添加一台新电脑,更主要的是,整个系统中的成员,不再是一台台计
算机,而是一组能得到的服务(硬件或软件)。呈现给用户的界面是能得到服务的内容
,用户不必知道服务(service)从何处提供以及是如何实现的。
  我们之所以用服务这一术语是因为在Jini中我们感兴趣的是这个系统能干什么,我
们能得到什么,而不再将兴趣放在个人电脑、服务器之类的计算机系统上。
  Jini技术会涉及以下几个方面:
  *以动态分布系统为基础的体系架构。
  *一种通用语言(如Java),用来实现分布对象间的通讯。
  *查找服务(lookupservice),用以识别提供服务的对象。
  *设备间的协议,我们称之为发现/加入(discovery/join)协议。
  *去除机制,称之为租用(leasing)。使设备能简单地从Jini中取下来。
  下面,我们看看Jini是如何工作的,以发现/加入(discovery/join)为例。
  发现/加入这一过程发生于当要向Jini中加入一新的服务时。服务提供者,比如一
个设备或软件,首先向网络上发送请求,使任何的查找服务(lookupservice)能识别它
。一旦查找服务发现这一服务后,此服务会上载一个服务对象,登记到查找服务中。服
务对象饮食Java程序界面,此界面中有实现服务所需的方法及有关属性。
  服务提供者需有能力发现查找服务。服务提供者可交第三方代理查找。现在,服务
提供者已准备就绪,可供使用。
  客户端发出服务请求,查找服务返回Java程序界面显示的所有服务,客户端选择所
需服务,将服务对象载入客户端。
  最后,客户端直接与服务提供者联系,获得服务。
  需要强调的是,客户端无需事先知道服务提供者的情况,因为服务对象及实现服务
都是在客户端发出服务请求的精髓所在。Jini技术能使任何器件连入网络,而不论该器
件的基础软件和硬件是什么。因为Jini技术的基础是Java,所以Jini技术独立于平台,
可连入的器件就不受软件、处理器、器件驱动器或传统网络协议的限制。Jini技术为如
何连入网络、如何共享信息和如何互操作且同时又保持对用户的透明,确立了一套基本
规则。  
程序范例讲解
  接著就来介绍如何在Windows系统中实作一个简单的Jini 应用程式(底层使用RMI机
制)。此范例将显示出如何启动lookup locator 、如何将services 向lookup lcoator
 注册、如何收寻到特定的service、与如何使用远端的 service。其步骤分述如下:
  在service provider端设计一个服务程式与其介面(interface):请参考程式一 
及程式二 。
设计一个client的程式:请参考程式三 。
  启动service locator:首先启动 HTTP daemon与rmid ,而lookup service则使用
Jini Starter Kit 1.0中,由JSK所提供现成的(已包装在 reggie.jar与 reggie-dl.j
ar)。
echo 启动 HTTP daemon
start java -jar -classpath %JINI_CLASSPATH% JINIHOME%\lib\tools.jar
-port 8080 -dir %JINIHOME%\lib
echo 清掉前一次的 RMID log 与 Reggie's log echo directory.
deltree log
deltree reggie_log
echo 启动 RMI daemon
start rmid
echo 启动 lookup service,并且指定其所属的 group
echo为 "public".
java -jar -classpath %JINI_CLASSPATH% -Djava.security.policy=
%JINIHOME_FORWARDSLASH%/example/lookup/policy.all
%JINIHOME_FORWARDSLASH%/lib/reggie.jar http://localhost:8080/reggie-dl.jar
%JINIHOME%/example/lookup/policy.all %SERVICEHOME%\reggie_log public
执行service provider之service :若此service接到请求时,将会传回一个字串物件到
 client端。
java -classpath %JINI_CLASSPATH% -Djava.security.policy=%SERVICEHOME%/policy
.all
-Djava.rmi.server.codebase=http://localhost:8080/ MyServer
执行client程式。
java -classpath %JINI_CLASSPATH% -Djava.security.policy=%SERVICEHOME%/policy
.all
-Djava.rmi.server.codebase=http://localhost:8080/ MyClient
程式一、 TestSvrInterface. java
import java.rmi.*;
public interface TestSvrInterface extends Remote{
public String sayHello() throws RemoteException;
}
程式二、 TestSvr.java
import net.jini.core.discovery.LookupLocator;
import net.jini.core.entry.*;
import net.jini.core.lease.Lease;
import net.jini.core.lookup.*;
import net.jini.lookup.entry.Name;
import com.sun.jini.lease.LeaseRenewalManager;
import com.sun.jini.lookup.JoinManager;
import java.rmi.*;
import java.rmi.server.*;
public class TestSvr extends UnicastRemoteObject implements
TestSvrInterface{
public TestSvr() throws RemoteException{
super();
}
public String sayHello() throws RemoteException{
System.out.println("I'm called");
return ("TestSvr said... Greeting!");
}
public static void main(String args[]) throws Throwable{
// 设定自己的 attributes.
Entry[] eAttrib = new Entry[1];
eAttrib[0] = new Name("TestSvr");
TestSvr ts = new TestSvr();
// 建立一个LookupLocator物件,以寻找特定的 lookup service.
LookupLocator ll = new LookupLocator("jini://specific-host:4160");
// 找到 lookup service之後,建立一个与其沟通的介面。
ServiceRegistrar sreg = ll.getRegistrar();
// 透过此介面,向 lookup service 注册其服务资讯。
sreg.register (new ServiceItem(null,ts,eAttrib), Lease.FOREVER);
System.out.println("Waiting request......");
}
}
程式三、 TestClnt.java
import net.jini.core.discovery.LookupLocator;
import net.jini.core.lookup.*;
import net.jini.core.entry.*;
import net.jini.lookup.entry.Name;
class TestClnt{
public static void main(String args[]) throws Throwable{
// 建立一个LookupLocator物件,以寻找特定的 lookup service.
LookupLocator ll = new LookupLocator("jini://specific-host:4160");
// 找到 lookup service之後,建立一个与其沟通的介面。
ServiceRegistrar sreg = ll.getRegistrar();
// 设定要寻找的服务之 attributes,并做成样版。
Entry[] eAttrib = new Entry[1];
eAttrib[0] = new Name("TestSvr");
ServiceTemplate tmplt = new ServiceTemplate (null, null, eAttrib);
// 将样版送至 lookup service,并要求其找出符合样版的服务。
TestSvrInterface tsi = (TestSvrInterface)( sreg.lookup(tmplt) );
// 找到服务之後,呼叫此服务之 method.
System.out.println("--- "+tsi.sayHello()+" ---");
}
}
JINI开发中的常见问题探讨
一、Class Not Found(特别是一个stub类)
  这是一个在开发Jini和RMI应用程序中经常碰到的问题。当你的应用程序从收到另一
个程序的序列化对象,但是相应 的类文件却找不到时,就会碰到这种例外ClassNotFou
ndException。
一般来说这可能有三种原因:
  1、Codebase的问题:出现这种例外大部分是因为codebase的问题。提供给你序列化
对象的服务器必须设置正确的 codebase,来告诉你到什么地方找到相应的类文件。如果
这个服务程序是你做的,你要保证自己是否已经设置了正确 的codebase。关于codebas
e的详细论述,请看Jini和RMI开发中的codebase问题。
  2、没有安装安全管理器:如果你没有安装安全管理器,即使你的codebase设置正确
了,Java程序也不会装入如何远程 类,因为没有安全管理器,所有的类文件只能从本地
载入。所有,你要确定自己已经安装了安全管理器,如果你没有安装, 你会看到一个例
外,java.rmi.RMISecurityManager。
  3、HTTP服务器路径不对:最后,当你发现发送方设置了codebase,接受方安装了安
全管理器,还是找不到类文件, 那么可能就是没有正确的配置HTTP服务器。例如:如果
你要载入类myself.myclass,那么这个类文件应该在 httproot/myself/myclass.class
,这里httproot就是web服务器的根目录。这时codebase应该设置为 http://host:port
/ ,注意一定要有"/"。相反,如果你的类文件在一个jar文件中,那么你的codebase应该
是 http://host:port/your_class.jar。
二、AccessControlException
  这个一般是由policy文件引起的。如果你的policy文件写错了或者没有policy文件
,那么就会发生这样的错误。 如果你安装了一个安全管理器,那么却省情况下,你的程
序所能干的工作是很少的。安全管理器控制的不只是你下 载的代码,还会控制你本地的
代码。
  要控制你什么代码可以访问,你就要写一个policy文件。确定你的policy文件允许
你找到的组可以 DiscoveryPermission,或者用AllPermission关闭所有的安全保护(这
并不是一个好注意,不过我为了方便,在 调Jini程序时,一直用这个policy.all文件。
关于policy的问题,我会在别的文件中详细说的。)
三、No lookup services found
  1、lookup service不是你组的成员:如果你查找的是一个特定的组,那么你要确定
自己要查找的lookup service 是在这个组内。大部分情况下,我都是用"public"组来查
找服务。关于组的问题,请看Jini入门的相关部分。
  2、lookup proxy not properly exported:Jini的客户和服务都是通过lookup se
rvice的代理来访问lookup service等。所有lookup service的代理必须可以远程访问的
,这就是说lookup service必须设置正确的codebase, 而且proxy必须在web服务器的正
确位置下。(这个代理就在reggie-dl.jar文件中,关于代理codebase的设置请 参看Ji
ni入门中关于运行环境设置的部分)
  3、lookup service不能开始,是因为rmid没有运行:lookup service的运行是在R
MI的基础上。所以rmid必须先 运行,这可能要等几秒,然后在运行lookup service。
  4、缺少安全管理器:如果没有安全管理器,Java程序是不会下载任何代码的,这也
包括lookup service的代理。所以 必须保证安装安全管理器和使用正确的policy文件。

四、使用LeaseRenewalManager时Leases不能刷新
  发生这种错误的原因可能是你用renewFor方法代替了renewUntil。大部分时间,客
户方是利用安装的 LeaseRenewalManager调用带有参数Lease.ANY的方法renewUntil来实
现刷新的。这就可以使用持续刷新。 有时用户可能混淆了renewUntil()和renewFor(
)。而renewFor()方法是没有持续刷新行为的,使用 Lease.ANY也是没有用的。
五、不能收到任何RemoteEvents
  监听器没有被正确的输出:如果你正确的创建了RemoteEventListener(UnicastRe
moteObject的子类), 但是却接受不到任何远程事件,那么可能就是你没有正确地输出
你的listener类。
  看看你的程序是否已经正确的设置了codebase、把listener类和其他支持类放到了
可访问的地方。
六、lookup service引起的RemoteException
  原因是你没有调用方法discard:当你从lookup service上检索到服务代理后,你并
不会与服务有持续的通信。 如果你要使用服务,你就要直接调用服务的方法。所以如果
lookup service不能用了,并不会有人告诉你,也 不会自动清除。
  所以当你检查到一个lookup service过时了(当你尝试和它通信会遇到RemoteExce
ption例外),你应该在 自己的代码中完成清楚工作。方法就是调用LookupDiscovery对
象的discard()方法。
七、服务的性能问题
  有许多地方可能引起服务的性能问题,这里是一个比较普遍的。
  在一个单独线程中调用远程方法:如果你的服务调用了远程方法,那么该方法就会
等待直到客户方返回为止。 如果客户方down掉了,或者要长时间处理,那么服务也就停
滞了。解决这个问题的方法就是在一个单独的线程内 运行远程方法调用。
  缺少安全管理器:如果没有安全管理器,Java程序是不会下载任何代码的,这也包
括lookup service的代理。所以 必须保证安装安全管理器和使用正确的policy文件。
八、服务重新激活后不能正确处理lease。
  主要是由于lease的序列化格式:即使在lease必须被转化成相对时间格式,当存储
到disk上时还是要用绝对 时间格式来存储。可能使用Lease接口的setSerialForm()方
法来控制。

--
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.170.172]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:207.879毫秒