Web服务、Jini与普适计算技术解析
1. 电子业务XML(ebXML)
电子业务XML(ebXML)倡议由联合国贸易便利化和电子业务机构(UN/CEFACT)与结构化信息标准促进组织(OASIS)共同定义,他们还发起了一个项目来标准化XML业务规范。
ebXML架构中最重要的组件是注册表(Registry)和存储库(Repository),具体信息如下表:
|组件|功能|
| ---- | ---- |
|注册表|提供访问服务、信息模型和参考实现信息|
|存储库|提供物理后端信息存储,包含用于使用ebXML进行电子商务交易的文档类型定义(DTD)和模式|
ebXML消息服务支持贸易伙伴之间通过各种传输方式(如SMTP、HTTP/S和FTP)交换ebXML消息。更多信息可访问www.ebxml.org 。
Web服务和ebXML都认识到为B2B系统集成提供结构和流程的重要性。它们都需要在知名位置实现知名接口,并通过注册表或代理解决以下问题:
- 有哪些可用的服务?
- 谁能提供这些服务?
- 服务位于何处?
- 如何调用服务?
- 技术要求是什么?
两者都使用XML来定义和指定这些问题的答案。不过,目前存在定义重叠和不同解决方案的情况,其差异程度和影响还有待进一步了解。预计会出现软件桥接,以实现UDDI服务注册表和ebXML服务存储库等关键组件的集成或共存。整体架构仍在变化中,这对早期采用者构成了挑战。
2. B2B环境中的Jini
Jini和UDDI、ebXML一样,支持服务发现的概念。概念上,查找服务可以包含任意数量的服务项,每个服务项都可以关联属性,如行业代码、实现细节、访问协议和地理位置等。这些属性可用于细化对特定服务的搜索。
此外,还有一个查找服务的代理,它知道如何与查找服务进行交互,代码可下载到请求服务的客户端。可下载的服务代理是Jini与其他类似“黄页”服务的关键区别之一,也是它依赖特定编程语言的主要原因之一。
Jini的发现和查找功能为寻找和与B2B服务提供商交互提供了动态的替代方案,甚至可以用于引导查找UDDI和ebXML注册表的过程。
3. SOAP与Jini的集成
以下是一个SOAP客户端访问Web服务的示例,该Web服务实际上是一个访问Jini查找服务的代理,SOAP客户端会列出Jini查找服务中注册的服务。
package chapter13;
import java.io.*;
import java.rmi.*;
import java.util.*;
import net.jini.core.entry.Entry;
import net.jini.core.lookup.ServiceID;
import net.jini.core.lookup.ServiceItem;
import net.jini.core.lookup.ServiceMatches;
import net.jini.core.lookup.ServiceRegistrar;
import net.jini.core.lookup.ServiceTemplate;
import net.jini.discovery.DiscoveryEvent;
import net.jini.discovery.DiscoveryListener;
import net.jini.discovery.LookupDiscoveryManager;
import net.jini.space.JavaSpace;
public class LookupProxy implements DiscoveryListener {
private String[] groups = new String[] { "" } ;
private Vector services = new Vector();
private StringBuffer buffer = new StringBuffer();
private LookupDiscoveryManager ldm;
private ServiceTemplate template;
private JavaSpace space;
private ServiceID serviceID;
private ServiceItem si;
public LookupProxy() {
System.setSecurityManager(new RMISecurityManager());
}
// DiscoveryListener Implementation
// Simply build a list of services that match
// a supplied template
public synchronized void discovered(DiscoveryEvent de) {
emit("Discovered LUS: ");
ServiceRegistrar[] registrars = de.getRegistrars();
for(int i=0; i < registrars.length; i++) {
try {
emit("URL: " + registrars[i].getLocator().toString());
emit("ID: " + registrars[i].getServiceID());
String groups[] = registrars[i].getGroups();
emit("GROUPS: " + groups[0]);
ServiceMatches sm = registrars[i].lookup(template,
Integer.MAX_VALUE);
emit("Matching services found ------: " +
sm.totalMatches);
emit("");
for(int j=0; j < sm.items.length; j++) {
// Process each ServiceItem
if(sm.items[j].service != null) {
emit("Service --------------: " +
sm.items[j].service);
emit("ServiceID ------------: " +
sm.items[j].serviceID);
Entry[] entries = sm.items[j].attributeSets;
emit("Service attributes ---:");
for(int k=0; k<entries.length; k++) {
emit(entries[k]);
}
services.addElement(sm.items[j]);
emit("");
}
}
notifyAll();
} catch(Exception e) { e.printStackTrace(); }
}
}
public void discarded(DiscoveryEvent de) { }
public synchronized Object getService() {
while(services.size() == 0) {
try {
wait();
} catch (InterruptedException ex) { }
}
return ((ServiceItem)services.elementAt(0)).service;
}
// this is the method that we will expose to the SOAP client
public String getService(String service) {
ServiceTemplate template;
try {
// if no class name is provided match on all services
if(service == null) {
template = new ServiceTemplate(null, null, null);
} else {
// build a template to match on the given class name
Class[] types = { Class.forName(service) } ;
template = new ServiceTemplate(null, types, null);
}
// set the template
this.template = template;
// start discovery
ldm = new LookupDiscoveryManager(groups,null,this);
// wait for discovery to find services
getService();
} catch (Exception e) { e.printStackTrace(); }
// return the list
return new String(buffer);
}
// build the list display
private void emit(Object str) {
buffer.append(str + System.getProperty("line.separator"));
}
}
LookupProxy类实现了DiscoveryListener接口,其中getService方法会被SOAP客户端调用。
4. Web服务部署
要将这个Java类部署为Web服务,需要编译它并确保它在Java Web服务器的类路径中(假设已经安装并配置了Apache SOAP 2.x)。以下是部署服务并从SOAP调用它的步骤:
1. 如果没有Apache SOAP,可以从www.apache.org网站获取,安装说明和所需软件会随分发版本提供。
2. 创建一个Apache部署描述符,如以下示例:
<isd:service xmlns:isd="http://xml.apache.org/xml-soap/deployment"
id="urn:jini-service-lookup">
<isd:provider type="java"
scope="Application"
methods="getService">
<isd:java class="chapter13.LookupProxy" static="false" />
</isd:provider>
<isd:faultListener>org.apache.soap.server.DOMFaultListener
</isd:faultListener>
</isd:service>
其中,
id
是Web服务的URI,
methods
是要向Web服务客户端公开的公共方法列表,
class
是要调用的Java类的名称,必须在Servlet引擎的类路径中。
- 使用以下命令文件来部署和激活Web服务:
@echo off
echo This test assumes a server URL of http://localhost:8081
/soap/servlet/rpcrouter
echo Deploying the lookup service...
java org.apache.soap.server.ServiceManagerClient
http://localhost:8081 /soap/servlet/
rpcrouter deploy
xml/LookupDD.xml
echo .
echo Verify that it's there
java org.apache.soap.server.ServiceManagerClient
http://localhost:8081 /soap/servlet/
rpcrouter list
echo .
echo Running the lookup test to find the EventMailbox service
java chapter13.SOAPClient
http://localhost:8081/soap/servlet/rpcrouter
net.jini.event.EventMailbox
echo .
echo Undeploy it now
java org.apache.soap.server.ServiceManagerClient
http://localhost:8081 /soap/servlet/
rpcrouter undeploy
urn:jini-service-lookup
echo .
echo Verify that it's gone
java org.apache.soap.server.ServiceManagerClient
http://localhost:8081 /soap/servlet/
rpcrouter list
这个脚本使用
org.apache.soap.server.ServiceManagerClient
来部署、列出和取消部署Web服务。
5. SOAP客户端类示例
以下是一个SOAP客户端类的示例,它构建一个SOAP - RPC并调用getService方法,调用结果会显示在控制台:
package chapter13;
import java.io.*;
import java.net.*;
import java.util.*;
import org.apache.soap.*;
import org.apache.soap.rpc.*;
public class SOAPClient {
public static void main(String[] args) throws Exception {
// has a SOAP url been entered
if (args.length < 1) {
System.err.println ("Usage: java " + SOAPClient.class.getName
() +
" SOAP-router-URL service");
System.exit (1);
}
// set encoding style
String encodingStyleURI = Constants.NS_URI_SOAP_ENC;
// set the SOAP router url
URL url = new URL (args[0]);
String service = null;
// check if a specific interface has been requested
if(args.length == 2)
service = args[1];
// Build the RPC call.
Call call = new Call ();
// note the target URI was set in the deployment descriptor
call.setTargetObjectURI ("urn:jini-service-lookup");
// the method that was defined in the deployment descriptor
call.setMethodName ("getService");
// we are not doing any special encoding,
// for instance user defined object handling
call.setEncodingStyleURI(encodingStyleURI);
// set the parameters for the call
Vector params = new Vector ();
params.addElement (new Parameter("service", String.class, service,
null));
call.setParams (params);
// invoke the url and get the response
Response resp = call.invoke (url, "" );
// Check the response.
if (resp.generatedFault ()) {
Fault fault = resp.getFault ();
System.out.println ("The call failed: ");
System.out.println (" Fault Code = " + fault.getFaultCode
());
System.out.println (" Fault String = " + fault.getFaultString
());
} else {
// no error display the result to the console
Parameter result = resp.getReturnValue ();
System.out.println (result.getValue ());
}
}
}
运行test.cmd脚本时,控制台会显示多播半径内查找服务中注册的服务列表。
6. 集成之路的思考
Web服务试图弥合当前系统、网络和应用程序中存在的各种技术和实现。SOAP用于通过定义通用传输协议来实现不同供应商实现之间的互操作性;WSDL是一种XML语言规范,用于将Web服务描述为一组网络地址和操作;UDDI提供了发布和查找服务描述的方法;ebXML倡议也在努力标准化XML业务规范。
未来的成功系统应构建在更统一的结构之上,关键在于支持“更智能”的系统。Jini定义了一个支持更智能系统的环境,它在平衡多样性、加速信息访问和支持普适计算设备方面提供了灵活性。
7. Jini环境与假设
要加入Jini网络,硬件或软件组件必须满足以下关键要求:
- 能够参与Jini发现和加入协议。
- 能够下载并执行用Java编程语言编写的类。
- 可能需要具备导出用Java编程语言编写的类的能力。
Jini环境假设所有参与成员都能满足这些要求,假设服务的对象或代理可以在网络上移动并被客户端下载,客户端能够下载jar文件中的必要代码。然而,资源受限的设备(如内存和处理能力有限的设备)对这些假设构成了挑战,许多商业Jini项目几乎忽略了不支持Java 2标准版(J2SE)的设备。
8. Jini能否缩小规模
在这方面面临的挑战包括:
- 大小:最小化JVM占用空间。
- 性能:低电池电量、内存有限的设备。
- 开发驱动程序:提供JVM沙箱之外的功能。
- 工具缺乏:缺乏与嵌入式Java开发相关的有用工具。
Sun公司意识到需要不同的开发平台,目前有三种不同的Java开发环境,针对不同的处理需求:
- Java 2企业版(J2EE):用于支持B2B和电子商务中的可扩展解决方案。
- Java 2标准版(J2SE):适用于传统PC和工作组环境的客户端开发。
- Java 2微型版(J2ME):针对资源受限的设备市场。
9. Java 2微型版(J2ME)
J2ME是一个较新的Java应用环境,是后PC时代Java技术部署和使用的框架,其软件可配置用于各种市场细分。
J2ME架构采用模块化设计,由配置(Configurations)和配置文件(Profiles)两个基本元素组成。配置是虚拟机和一组基本类库及API的最小集合,为消费电子和嵌入式设备指定通用的运行时环境;配置文件是行业定义的Java API规范,用于满足特定类型设备的需求,基于底层配置构建,为特定类型的设备提供完整的运行时环境。
当前J2ME技术包含两种配置:
|配置|适用设备|特点|
| ---- | ---- | ---- |
|Connected Limited Device Configuration (CLDC)|内存较小的设备,如手机|由K虚拟机(KVM)和基本类库组成,KVM是为小内存、有限资源、联网设备设计的便携式虚拟机|
|Connected Device Configuration (CDC)|内存较大的设备,如住宅网关、智能手机等|需要Java虚拟机的完整功能,支持网络连接,通常是无线、间歇性连接,带宽有限。目前有一个基础配置文件(Foundation Profile),CDC是CLDC的超集|
CDC类库包含以下内容:
- java.lang:VM系统类
- java.util:基础Java实用工具
- java.net:UDP数据报和文件I/O
- java.io:Java文件I/O
- java.text:对国际化(I18n)的最低限度支持
- java.security:对象序列化的最低限度安全和加密
基础配置文件与CDC一起,为消费电子和嵌入式设备提供完整的J2ME应用运行时环境。CDC中的C虚拟机(CVM)是基础配置文件库的引擎,它是一个全功能的虚拟机,专为需要Java 2虚拟机功能集但占用空间较小的设备设计。
随着J2ME + CDC + 基础配置文件和J2ME RMI配置文件的发布,支持全功能的Jini设备成为可能。
综上所述,Web服务、Jini和普适计算技术在不断发展和演变,它们相互补充,共同推动着信息技术的进步。未来,这些技术有望在更多领域得到应用,为人们带来更加便捷和智能的生活体验。
Web服务、Jini与普适计算技术解析
10. 普适计算与移动设备
Jini最初的愿景是一个非PC设备(如PDA、手机、生活辅助电器等)在全球网络中广泛分布的世界,互联设备将实现新一代的通信设备、信息交换和普适计算。如今,网络连接设备的市场持续增长,各种设备在网络上的互联程度越来越高。
然而,实现这一愿景的道路并非一帆风顺。就像Java和Java Applets最初被引入时,桌面机器是首选的部署目标,但后来Java迅速迁移到了应用架构的中间层,这是许多人由于对Java性能和可扩展性的担忧而未曾预料到的。而Java作为中间件所提供的互操作性、操作系统独立性和硬件无关性,在当时并未立即显现出来。随着处理能力的提升和软件优化的推进,Java技术成为了新一代中间件——应用服务器的基石。现在,我们正见证着可能将Java带回桌面的点对点革命。
点对点计算为Java语言提供了一个有吸引力的模型,其在任何地方运行的能力,加上定义对等体的协议,为互操作性提供了无限的潜力。在我们对Web服务、点对点计算感到兴奋并展望语义网的同时,也面临着对Jini未来角色的思考。实际上,Jini作为以网络为中心的解决方案,正不断发展和适应,以支持普适计算这一新的网络现实。
11. Jini的可扩展性探讨
11.1 Jini能否缩小规模
如前文所述,Jini在资源受限设备市场面临诸多挑战。为了应对这些挑战,Sun公司推出了不同的Java开发环境。其中,Java 2微型版(J2ME)针对资源受限设备市场,它由配置和配置文件两个基本元素构成模块化架构。
配置是虚拟机和基本类库及API的最小集合,为设备提供通用运行时环境;配置文件是行业定义的Java API规范,基于底层配置构建,为特定设备提供完整运行时环境。当前J2ME技术包含两种配置,分别适用于不同类型的设备,具体如下:
|配置|适用设备|特点|
| ---- | ---- | ---- |
|Connected Limited Device Configuration (CLDC)|内存160 - 512KB的小设备,如手机|由K虚拟机(KVM)和基本类库组成,KVM是为小内存、有限资源、联网设备设计的便携式虚拟机|
|Connected Device Configuration (CDC)|内存2MB及以上的设备,如住宅网关、智能手机等|需要Java虚拟机的完整功能,支持网络连接,通常是无线、间歇性连接,带宽有限。目前有一个基础配置文件(Foundation Profile),CDC是CLDC的超集|
通过这些配置和配置文件,J2ME为Jini在资源受限设备上的应用提供了可能。
11.2 设备能否扩大规模
随着技术的发展,设备的处理能力不断提升。未来,设备有可能具备更强的功能,从而更好地支持Jini等技术。例如,一些原本资源受限的设备,可能会通过硬件升级或软件优化,逐渐满足Jini网络的要求。这种设备能力的提升将有助于Jini在更广泛的设备上得到应用,进一步推动普适计算的发展。
12. 网络现实与普适计算
在当前的网络环境中,普适计算正逐渐成为现实。越来越多的设备通过网络连接在一起,实现信息的交换和共享。Jini在这个过程中扮演着重要的角色,它提供了一个支持智能系统的环境,能够平衡设备的多样性、加速信息访问,并支持各种普适计算设备。
例如,在一个智能家居环境中,各种家电设备(如智能冰箱、智能空调、智能灯具等)可以通过Jini网络进行连接和交互。用户可以通过手机或其他控制设备,方便地控制这些家电的运行状态。同时,这些设备也可以根据用户的使用习惯和环境条件,自动调整工作模式,实现智能化的家居控制。
以下是一个简单的mermaid流程图,展示了智能家居环境中Jini网络的工作流程:
graph LR
A[用户手机] -->|控制指令| B[Jini网络]
B -->|转发指令| C[智能冰箱]
B -->|转发指令| D[智能空调]
B -->|转发指令| E[智能灯具]
C -->|状态反馈| B
D -->|状态反馈| B
E -->|状态反馈| B
B -->|反馈信息| A
13. 总结
Web服务、Jini和普适计算技术在信息技术领域中都有着重要的地位。Web服务通过SOAP、WSDL和UDDI等技术,试图弥合不同系统和应用之间的差异,实现互操作性和集成。Jini则提供了一个支持服务发现和智能系统的环境,在普适计算领域具有独特的优势。
Jini在发展过程中面临着一些挑战,如资源受限设备的支持问题,但通过J2ME等技术的发展,这些问题正在逐步得到解决。未来,随着设备处理能力的提升和网络技术的不断发展,Jini有望在更多的设备和场景中得到应用,为普适计算的发展做出更大的贡献。
为了更好地理解这些技术之间的关系和应用场景,我们可以通过以下表格进行总结:
|技术|作用|应用场景|
| ---- | ---- | ---- |
|Web服务|通过SOAP、WSDL和UDDI实现系统和应用的互操作性和集成|企业级应用集成、电子商务等|
|Jini|支持服务发现和智能系统,平衡设备多样性和信息访问|智能家居、物联网等|
|SOAP|定义通用传输协议,实现不同供应商实现之间的互操作性|Web服务的通信|
|WSDL|将Web服务描述为一组网络地址和操作|Web服务的描述和发布|
|UDDI|提供发布和查找服务描述的方法|服务的注册和发现|
|ebXML|标准化XML业务规范|电子业务的标准化|
|J2ME|针对资源受限设备的Java开发环境|手机、嵌入式设备等|
总之,这些技术相互补充,共同推动着信息技术向更加智能、便捷和高效的方向发展。我们可以期待在未来的生活和工作中,这些技术将发挥更大的作用,为我们带来更多的便利和创新。
超级会员免费看
69

被折叠的 条评论
为什么被折叠?



