23、Web服务、Jini与普适计算技术解析

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引擎的类路径中。

  1. 使用以下命令文件来部署和激活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开发环境|手机、嵌入式设备等|

总之,这些技术相互补充,共同推动着信息技术向更加智能、便捷和高效的方向发展。我们可以期待在未来的生活和工作中,这些技术将发挥更大的作用,为我们带来更多的便利和创新。

根据原作 https://pan.quark.cn/s/459657bcfd45 的源码改编 Classic-ML-Methods-Algo 引言 建立这个项目,是为了梳理和总结传统机器学习(Machine Learning)方法(methods)或者算法(algo),和各位同仁相互学习交流. 现在的深度学习本质上来自于传统的神经网络模型,很大程度上是传统机器学习的延续,同时也在不少时候需要结合传统方法来实现. 任何机器学习方法基本的流程结构都是通用的;使用的评价方法也基本通用;使用的一些数学知识也是通用的. 本文在梳理传统机器学习方法算法的同时也会顺便补充这些流程,数学上的知识以供参考. 机器学习 机器学习是人工智能(Artificial Intelligence)的一个分支,也是实现人工智能最重要的手段.区别于传统的基于规则(rule-based)的算法,机器学习可以从数据中获取知识,从而实现规定的任务[Ian Goodfellow and Yoshua Bengio and Aaron Courville的Deep Learning].这些知识可以分为四种: 总结(summarization) 预测(prediction) 估计(estimation) 假想验证(hypothesis testing) 机器学习主要关心的是预测[Varian在Big Data : New Tricks for Econometrics],预测的可以是连续性的输出变量,分类,聚类或者物品之间的有趣关联. 机器学习分类 根据数据配置(setting,是否有标签,可以是连续的也可以是离散的)和任务目标,我们可以将机器学习方法分为四种: 无监督(unsupervised) 训练数据没有给定...
本系统采用微信小程序作为前端交互界面,结合Spring BootVue.js框架实现后端服务及管理后台的构建,形成一套完整的电子商务解决方案。该系统架构支持单一商户独立运营,亦兼容多商户入驻的平台模式,具备高度的灵活性扩展性。 在技术实现上,后端以Java语言为核心,依托Spring Boot框架提供稳定的业务逻辑处理数据接口服务;管理后台采用Vue.js进行开发,实现了直观高效的操作界面;前端微信小程序则为用户提供了便捷的移动端购物体验。整套系统各模块间紧密协作,功能链路完整闭环,已通过严格测试优化,符合商业应用的标准要求。 系统设计注重业务场景的全面覆盖,不仅包含商品展示、交易流程、订单处理等核心电商功能,还集成了会员管理、营销工具、数据统计等辅助模块,能够满足不同规模商户的日常运营需求。其多店铺支持机制允许平台方对入驻商户进行统一管理,同时保障各店铺在品牌展示、商品销售及客户服务方面的独立运作空间。 该解决方案强调代码结构的规范性可维护性,遵循企业级开发标准,确保了系统的长期稳定运行后续功能迭代的可行性。整体而言,这是一套技术选型成熟、架构清晰、功能完备且可直接投入商用的电商平台系统。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值