RedStar81 于9/9/2003~13/9/2003
81_RedStar81@163.com
TomHornson.student@www.sina.com.cn
首次修改时间: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方法是重载的,下面我们只介绍其中一种,更加详细的信息请参考Voyager的Manual.
程序清单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. Linda和Sun JavaSpace ,IBM Tspace
7. JINI
8. Emerald VS. Dejay
9. Pjama
10. IBM Mobile Computing Interface : Aglets
六.综合应用分析
1. 利用多线程和分布对象计算技术模拟高性能并行计算
2. 利用Vdejay计算几何分形图