站内搜索: 请输入搜索关键词

当前页面: 开发资料首页Java 专题全面实践JNDI技术

全面实践JNDI技术

摘要: 在本期中,将更进一步地介绍 Jini系统的相关开发环境,并辅以一个简单之实例作为说明.......
<iframe align=right marginWidth=0 marginHeight=0 src="http://www.chinabyte.com/tag/cont_flash_software.html" frameBorder=0 width=360 scrolling=no height=300></iframe>  一、简介

  在本期中,将更进一步地介绍 Jini系统的相关开发环境,并辅以一个简单之实例作为说明。

  之前提到藉由Jini 的技术,使我们可以轻易地结合任何服务(像是电子设备、应用程式等)到电脑网路上,并且很方便地使用它们。因此,在Jini 的世界中,主要有三种角色,分别是提供服务的service providers、使用服务的clients、以及作为前两个角色间之桥梁的service locators[4]。其关系如图一所示。

<table cellSpacing=0 cellPadding=0 align=center border=0> <tr> <td> </td></tr> <tr> <td>
图一、 Jini环境之示意图
</td></tr></table>

  其中service providers必须向 service locators 登记所提供的服务,而client可以向 service locators 查询所 的服务资讯,并且藉以向 service providers 请求服务。因此 service locators 必须负责记录许多可用的服务之资讯,以及帮忙clients 搜寻所 之服务。

  以下将介绍如何利用Jini的package与相关平台开发出隐含上述关系的应用系统。

  二、开发平台

  目前开发Jini系统的平台之最新版本为1.0,其中包括 JiniTM System Software Starter Kit(Jini Starter Kit)、JiniTM Technology Core Platform Compatibility Kit (TCK)(测试环境)、JavaSpacesTM Technology Kit ( JSTK)(利用Jini 实作出来的服务)三个套件 。

  Jini Starter Kit 涵盖所有开发Jini 系统所 之套件,有JiniTM Technology Core Platform(JCP)、 JiniTM Technology Extended Platform (JXP)、与JiniTM Software Kit(JSK )。其中JCP为Jini 的核心技术,包括 discovery、lookup 、lease等几个 packages,放在 net.jini.core目录里。JXP提供比JCP 更扩充之功能,包括discovery、 lookup、space等几个packages,放在 net.jini目录里。而JSK为用JCP实做出的lookup、 transaction服务与一些实用的类别, mahout、reggie等几个packages,放在com.sun.jini目录里。其中SUN公司将已经实作出的 JiniTM Transaction 称做 "mahout",而实作出的JiniTM Lookup service称做 "reggie"。

  三、基础架构

  首先要说明的是在 Jini中,呼叫远端 methods的方式,通常是采用RMI的技术 。例如,当client 找到适当的service 时,client可能会使用service端的服务,也就是远端呼叫(remote call),此时即可利用RMI 的技术来完成。(附注:当然,在 Jini中也可以选择不透过RMI,而直接写socket程式来完成远端呼叫。只是若利用RMI时,撰写程式会比较方便。)

  我们已经知道 service provides 、clients与 service locators 之间的互动关系,接著就为您说明这三者间的实№运作情形,请参考图二。

<table cellSpacing=0 cellPadding=0 align=center border=0> <tr> <td> </td></tr> <tr> <td>
图二、基础架构
</td></tr></table>

  Service locator的目的在於纪录与查询可用的服务资讯,而这种功能称做 "lookup service" ,因此其必须至少具备有lookup service的服务。此外,由於其底层网路通讯使用到了RMI 的机制,所以在 Service locator上还必须启动RMI daemon与HTTP daemon。而 HTTP daemon是用来提供做远程呼叫时,一种取得远端资料(如 Server_stub等)的途径。

  由於我们是利用RMI 的机制提供服务让远端物件使用,所以Service provider所提供的 services必须继承至Remote类别,才能使用RMI功能。另外必须建立 (instantiate)一个 LookupLocator物件与一个 ServiceRegistrar 物件,以便向 service locator注册与使用其他服务。其中 LookupLocator物件是用来寻找特定的 service locator;而 ServiceRegistrar 物件则用来向 lookup service注册本service所提供的服务[4]。详细步骤请参考图三。

<table cellSpacing=0 cellPadding=0 align=center border=0> <tr> <td> </td></tr> <tr> <td>
图三、 service 与 lookup service之关系图
</td></tr></table>

  Client同样也必须建立一个 LookupLocator物件与一个 ServiceRegistrar 物件。而 ServiceRegistrar 物件则被用来向 Service provider 取得所 之服务。其过程示意图如图四及图五。

<table cellSpacing=0 cellPadding=0 align=center border=0> <tr> <td> </td></tr> <tr> <td>
图四、 Client与lookup service之关系图
</td></tr></table>

  四、程式范例

  接著就来介绍如何在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.jar)。

<table cellSpacing=0 cellPadding=0 width=600 bgColor=#ffffff border=0> <tr> <td class=detail>echo 启动 HTTP daemon
start java -jar -classpath %JINI_CLASSPATH% JINIHOME%\lib\tools.jar
-port 8080 -dir %JINIHOME%\lib </td></tr></table>

<table cellSpacing=0 cellPadding=0 width=600 bgColor=#ffffff border=0> <tr> <td class=detail>echo 清掉前一次的 RMID log 与 Reggie's log echo directory.

deltree log
deltree reggie_log
echo 启动 RMI daemon
start rmid </td></tr></table>

<table cellSpacing=0 cellPadding=0 width=600 bgColor=#ffffff border=0> <tr> <td class=detail height=190>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

</td></tr></table>
  • 执行service provider之service :若此service接到请求时,将会传回一个字串物件到 client端。

<table height=8 cellSpacing=0 cellPadding=0 width=600 bgColor=#ffffff border=0> <tr> <td class=detail>

java -classpath %JINI_CLASSPATH% -Djava.security.policy=
%SERVICEHOME%/ policy.all

-Djava.rmi.server.codebase=http://localhost:8080/ MyServer </td></tr></table>

  • 执行client程式。

<table cellSpacing=0 cellPadding=0 width=600 bgColor=#ffffff border=0> <tr> <td class=detail height=76>java -classpath %JINI_CLASSPATH% -Djava.security.policy=
%SERVICEHOME%/policy.all

-Djava.rmi.server.codebase=http://localhost:8080/ MyClient

</td></tr></table>




↑返回目录
前一篇: 关于EJB返回值的解决方案
后一篇: J2EE概述