00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 package org.objectweb.proactive.ext.locationserver;
00032
00033 import org.objectweb.proactive.Body;
00034 import org.objectweb.proactive.ProActive;
00035 import org.objectweb.proactive.core.UniqueID;
00036 import org.objectweb.proactive.core.body.LocalBodyStore;
00037 import org.objectweb.proactive.core.body.UniversalBody;
00038 import org.objectweb.proactive.core.body.ft.protocols.FTManager;
00039 import org.objectweb.proactive.core.body.future.FutureProxy;
00040 import org.objectweb.proactive.core.body.reply.Reply;
00041 import org.objectweb.proactive.core.body.request.RequestImpl;
00042 import org.objectweb.proactive.core.body.request.ServeException;
00043 import org.objectweb.proactive.core.mop.MethodCall;
00044 import org.objectweb.proactive.core.mop.StubObject;
00045 import org.objectweb.proactive.core.util.timer.MicroTimer;
00046 import org.objectweb.proactive.ext.locationserver.LocationServer;
00047 import org.objectweb.proactive.ext.locationserver.LocationServerFactory;
00048
00049
00050 public class TimedRequestWithLocationServer extends RequestImpl
00051 implements java.io.Serializable {
00052 private static final int MAX_TRIES = 30;
00053
00058
00059
00060 protected long startTime;
00061 private int tries;
00062 private transient LocationServer server;
00063
00064 public TimedRequestWithLocationServer(MethodCall methodCall,
00065 UniversalBody sender, boolean isOneWay, long nextSequenceID,
00066 LocationServer server) {
00067 super(methodCall, sender, isOneWay, nextSequenceID);
00068 this.server = server;
00069 }
00070
00071 public Reply serve(Body targetBody) throws ServeException {
00072 MicroTimer timer = new MicroTimer();
00073 timer.start();
00074
00075 Reply r = super.serve(targetBody);
00076 timer.stop();
00077 System.out.println("TimedRequestWithLocationServer: " +
00078 timer.getCumulatedTime() + " for method " + methodName);
00079 return r;
00080 }
00081
00082 protected int sendRequest(UniversalBody destinationBody)
00083 throws java.io.IOException {
00084 System.out.println("TimedRequestWithLocationServer: sending to remote " +
00085 methodName);
00086 int ftres = FTManager.NON_FT;
00087 try {
00088 startTime = System.currentTimeMillis();
00089 ftres = destinationBody.receiveRequest(this);
00090
00091 long endTime = System.currentTimeMillis();
00092 System.out.println(
00093 "TimedRequestWithLocationServer: .............. 1/gamma = " +
00094 (endTime - startTime) + " for method " + methodName);
00095 System.out.println(
00096 "TimedRequestWithLocationServer: .............. done = " +
00097 (endTime - startTime) + " for method " + methodName);
00098 } catch (Exception e) {
00099
00100
00101 System.out.println(
00102 "TimedRequestWithLocationServer: .............. FAILED = " +
00103 (System.currentTimeMillis() - startTime) + " for method " +
00104 methodName);
00105
00106 System.out.println(">>>>>>>>>>>> Exception " + e);
00107 this.backupSolution(destinationBody);
00108 }
00109 return ftres;
00110 }
00111
00115 protected void backupSolution(UniversalBody destinationBody)
00116 throws java.io.IOException {
00117
00118
00119 boolean ok = false;
00120 tries = 0;
00121
00122
00123
00124 UniqueID bodyID = destinationBody.getID();
00125 while (!ok && (tries < MAX_TRIES)) {
00126 UniversalBody remoteBody = null;
00127 System.out.println(" ==== Query server ==== time " +
00128 System.currentTimeMillis());
00129
00130 UniversalBody mobile = queryServer(bodyID);
00131 System.out.println("=========================== time " +
00132 System.currentTimeMillis());
00133
00134 remoteBody = (UniversalBody) ((FutureProxy) ((StubObject) mobile).getProxy()).getResult();
00135
00136 long startTimeGamma = System.currentTimeMillis();
00137 try {
00138 remoteBody.receiveRequest(this);
00139
00140 long endTime = System.currentTimeMillis();
00141 System.out.println(
00142 "TimedRequestWithLocationServer: .............. 1/gamma = " +
00143 (endTime - startTimeGamma) + " for method " + methodName);
00144 System.out.println(
00145 "TimedRequestWithLocationServer: .............. done = " +
00146 (endTime - startTime) + " for method " + methodName);
00147
00148
00149 if (sender != null) {
00150 sender.updateLocation(bodyID, remoteBody);
00151 } else {
00152 LocalBodyStore.getInstance().getLocalBody(getSourceBodyID())
00153 .updateLocation(bodyID, remoteBody);
00154 }
00155 ok = true;
00156 } catch (Exception e) {
00157 System.out.println(
00158 "TimedRequestWithLocationServer: .............. FAILED = " +
00159 (System.currentTimeMillis() - startTimeGamma) +
00160 " for method " + methodName);
00161 tries++;
00162 }
00163 }
00164 }
00165
00166 protected UniversalBody queryServer(UniqueID bodyID) {
00167 long startTimeBackupSolution = System.currentTimeMillis();
00168 if (server == null) {
00169 server = LocationServerFactory.getLocationServer();
00170 }
00171
00172 UniversalBody mobile = (UniversalBody) server.searchObject(bodyID);
00173 long endTimeBackupSolution = System.currentTimeMillis();
00174 System.out.println(
00175 "TimedRequestWithLocationServer: backupSolution() server has sent an answer after " +
00176 (endTimeBackupSolution - startTimeBackupSolution));
00177 ProActive.waitFor(mobile);
00178 return mobile;
00179 }
00180 }