领略分布式编程乐趣--[5]

原创 2003年09月16日 12:16:00
                     领略分布式编程乐趣

RedStar81 9/9/200313/9/2003
                                               81_RedStar81@163.com
                                               TomHornson.student@www.sina.com.cn<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

首次修改时间:13/9/2003
                         
个人文集:http://www.csdn.net/develop/author/netauthor/RedStar81/
                          WebLog: http://www.advogato.org/person/TomHornson/

 

方法C示例:

程序片断1:

这里只需在客户端编程.但是前提时客户端和服务器端都需要启动Voyager运行时环境.

 

//

//Project : RemoteObjectComplexComputing using voyager producted by objectspace

//Filenaem : Caller.java

//Creator And Date : RedStar81 2003-8-23 0:07

//

//Statement : It is uesd to test the conditons when pass a object !

//

 

import com.objectspace.voyager.*;

 

public class Caller{

 

public static void main(String[] args){

      

try{

    Voyager.startup();

    Computing computingObject = new Computing();

   

    IComputing iC = (IComputing)Factory.create("Computing",”OtherServer:9000”);

   

    double returnValue = (iC.computing(new ComputingObject(1,100000))).doubleValue();

    System.out.println(returnValue);   

 

}catch(Exception e)

{

       System.err.println(e);

}

    Voyager.shutdown();  

}

}

这样Factory就在远程服务器OtherServer上建立了远程对象,并且在本地使用远程对象进行计算.

 

3)对象的迁移

一般来说,在下面的场合我们需要对象迁移:

a当本地对象和服务器对象交互需要大量的通信.这个代价远远大于对象迁移的代价。
b移动设备的离线计算。

c支持工作流.在一个协作的工作流系统中,对象的迁移是合乎常理而有效力的做法。

d负载平衡。

  我们想想,在你接触的分布对象计算技术中,还没有哪种技术能够实现对象迁移吧。RMI?CORBA?DCOM?是的,都不能。

对象移动的关键问题就是保证引用完整性。我们设想,如果一个对象可能处于下面的任何一种或几种状态之中。a对象引用本地对象。b对象引用远程对象 c对象被本地引用 d对象是一个远程对象,被远程引用。很多这样的本地或是服务器端对象就会构成一个很复杂的引用关系网络。很显然,一个对象迁移后,需要解决引用迁移的问题,这是一个很复杂的问题。然而,有了Voyager,一切都变得简单。Voyager通过特殊的机制转发引用,自动复制本地引用对象等手段来保证引用完整性。

为了实现对象的迁移,首先使用Mobility.of()方法从一个对象创建层面对象,然后就可以通过moveTo方法实现迁移了.这个moveTo方法是重载,下面我们只介绍其中一种,更加详细的信息请参考VoyagerManual.

  程序清单1:

情景阐述:对象不断的移动,然而通过Voyager的引用处理机制,我们仍能够正常引用.

//

//Project : MobileObject

//Filename : IBall.java

//Creator And Date : RedStar81 2003-8-22 22:51

//

//Statement :

//

 

public interface IBall{

  public void hit();

}

 

//

//Project : MobileObject

//Filename : Ball.java

//Creator And Date : RedStar81 2003-8-22 22:51

//

//Statement :

//

 

import java.io.*;

 

public class Ball implements IBall,Serializable{

 

synchronized  public void hit(){

       System.out.pringln("Ball has been hit");

}

}

 

//

//Project : MobileObject

//Filename : IBall.java

//Creator And Date : RedStar81 2003-8-22 22:51

//

//Statement :

//

 

import com.objectspace.voyager.*;

import com.objectspace.voyager.mobility.*;

 

public class Bat{

public void play(IBall ball,String _url){

       try{

       ball.hit();

       Mobility.of(ball).moveTo(_url);

}catch(MobilityException e){

       System.out.pringln(e);

}

}

 

public static void main(String[] args){

       try{

       Voyager.startup("9000");

       ClassManager.enableResourceServer();

       Bat bat = new Bat();

       IBall ball = (IBall)Proxy.of(new Ball());

       bat.play(ball,"//OS1:9000");

       bat.play(ball,"//OS2:9000");

       bat.play(ball,"//OS3:9000");

}catch(Exception Exception){

       System.err.pringln(Exception);

}

Voyager.shutdown();

}

}

 

上面的程序需要解说的:

a由于Voyager是基于Java技术的,使用序列化技术,所以移动对象需要实现Serializable接口.

事实上,如果你希望你的移动对象能够在迁移的整个过程中,譬如移动前,移动后等处理一些其它的事情,你的移动对象除了实现Serializabe接口外,还需要实现IMobile.这些过程会被顺序调用.这个很像applet的情况。

 

5)远程调用

  同步和异步的概念在Socket编程中是一个很重要的概念.同步就是顺序执行,在上一个任务(函数)调用返回之前,不可以执行下面的任务(函数),也就是任务的执行采用阻塞的方式。而异步和之相反,不必等待前任务的完成,就执行下面的任务。一般来说,在实际中,我们需要解决异步C/S式编程的方式,而这不外乎三种:
a当服务请求来临时,启动新的线程来处理任务.

b采用轮询的方式来处理任务。

c回调。
可以这样说吧,三种方式都是异步处理解决方式。

在最后,下面我们会详细分析一个使用多线程和RMI来模拟并行高性能计算的实例。

同样的,在分布式对象计算中,我们的最终目标可以说就是方法的调用,这里也存在同步和异步的问题.当然,上面提及的三种方法都可以使用,不过基于Voyager,我们不需要自己来处理这些问题了,我们只需要将任务分成多个方法调用,然后Future类的静态方法invoke(object,”method”,new Object[]{param-list…})来执行它们就可以实现异步执行了。其中,object是执行方法所在的对象,method是执行的方法,param-list是传递给调用方法的列表.

当然了,这个invoke对于本地对象和远程对象都是适用的.

  这里手头没有现成的例子。值得提醒一下的是:invoke返回一个Result类型的对象,你可以通过isAvailable()来检测是否得到结果,没有得到的话,就进行其它的工作。当得到结果的时候,你可以通过readInt()或是redByte或是readObject()等来获得结果。你也可以通过其它重载的invoke方法来设定等待时间,设置回调函数等等。

 


待续:

 

2.    DCOM

3.    CORBA

4.       WebServices

5.         Sun RMI  VS. dotNET Remoting

6.         LindaSun JavaSpace ,IBM Tspace

7.         JINI

8.         Emerald VS. Dejay

9.         Pjama

10.     IBM Mobile Computing Interface : Aglets

.综合应用分析

1.       利用多线程和分布对象计算技术模拟高性能并行计算

2.       利用Vdejay计算几何分形图

 

编程乐趣:身份证号码验证的方法

随着现在互联网的发展,越来越多的注册用户的地方都用到了身份证,那么对于输入的身份证如何验证呢?看下面的代码,其实很简单。主要注意的是,目前的身份证分为16和18位,然后分别验证校验位,省份,生日即可。...

编程乐趣:向上取N层目录

编程中总少不了和目录打交道,尤其是当运行目录下有很多子目录,比如配置文件的目录,第三方dll的目录等,截取目录总会用到。前面也使用过“..”的方式来取上一级目录(http://blog.csdn.ne...

编程乐趣:一个强制换行的小方法

前段时间做了个功能,用打印机打印内容。打印是这种格式: 项目名:内容; 由于打印的使用的那种纸宽度有限,所以要考虑到换行于是写了个给字符串换行的功能,试了一下貌似还能用,分享分享,希望能有所帮助。...

编程的乐趣

我想强调的是,写代码的时候,脑子里想的,一定是一个场景,和在场景上发生的一个动态变化。那么编程就是一个搭建场景,制造变化的过程。在实际的软件开发中,也是一个搭建体系架构的过程。总之,这是一个创作的过程...
  • CGGUANG
  • CGGUANG
  • 2016年12月16日 15:26
  • 283

使用HTML5,CSS3和jQuery来增强网站的用户体验和使用乐趣

日期:2011/11/16  来源:GBin1.com 记得几年前如果你需要添加一些互动元素到你的网站中用来改善用户体验? 是不是立刻就想到了flash实现?这彷佛年代久远的事了。使用现在最流...
  • jjfat
  • jjfat
  • 2011年11月16日 20:27
  • 734

编程乐趣:C#彻底删除文件

经常用360的文件粉碎,删除隐私文件貌似还不错的。不过C#也可以实现彻底删除文件。试了下用360文件恢复恢复不了源文件了。代码如下: public class AbsoluteFile { ...

编程乐趣:读取12306票价和余票信息(二)

简单写了一篇读取12306的票价和余票,不过没有处理最终的字符串,本文重新处理一下,并且封装成类,希望能给大家带来帮助。原文:读取票价,读取余票1、票价的字符串处理封装的类 /// /...

编程乐趣:C#实现读取12306余票信息

读取余票也是用同样的方式(读取票价信息)也就是该页面。使用IE9捕获查询时的参数:因为这个查询是GET方式所以直接能看到查询的url,如下: http://dynamic.12306.cn/otsqu...

编程的乐趣与苦恼

职业的乐趣 编程为什么有趣?作为回报,它的从业者期望得到什么样的快乐?   首先是一种创建事物的纯粹快乐。如同小孩在玩泥巴时感到愉快一样,成年人喜欢创建事物,特别是自己进行设计。我想这种快乐是上帝创...

C#语法糖,让编程更具乐趣

一、什么是语法糖 语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种...
  • Scalzdp
  • Scalzdp
  • 2014年02月25日 10:09
  • 5120
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:领略分布式编程乐趣--[5]
举报原因:
原因补充:

(最多只允许输入30个字)