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.apache.log4j.Logger;
00034 import org.objectweb.proactive.Body;
00035 import org.objectweb.proactive.ProActive;
00036 import org.objectweb.proactive.core.UniqueID;
00037 import org.objectweb.proactive.core.body.LocalBodyStore;
00038 import org.objectweb.proactive.core.body.UniversalBody;
00039 import org.objectweb.proactive.core.body.ft.protocols.FTManager;
00040 import org.objectweb.proactive.core.body.future.FutureProxy;
00041 import org.objectweb.proactive.core.body.reply.Reply;
00042 import org.objectweb.proactive.core.body.request.RequestImpl;
00043 import org.objectweb.proactive.core.body.request.ServeException;
00044 import org.objectweb.proactive.core.mop.MethodCall;
00045 import org.objectweb.proactive.core.mop.StubObject;
00046 import org.objectweb.proactive.core.util.log.Loggers;
00047 import org.objectweb.proactive.core.util.log.ProActiveLogger;
00048
00049
00050 public class RequestWithLocationServer extends RequestImpl
00051 implements java.io.Serializable {
00052 private static final int MAX_TRIES = 30;
00053 static Logger logger = ProActiveLogger.getLogger(Loggers.MIGRATION);
00054
00058 private int tries;
00059 private transient LocationServer server;
00060
00061 public RequestWithLocationServer(MethodCall methodCall,
00062 UniversalBody sender, boolean isOneWay, long nextSequenceID,
00063 LocationServer server) {
00064 super(methodCall, sender, isOneWay, nextSequenceID);
00065 this.server = server;
00066 }
00067
00068 public Reply serve(Body targetBody) throws ServeException {
00069 Reply r = super.serve(targetBody);
00070 return r;
00071 }
00072
00073 protected int sendRequest(UniversalBody destinationBody)
00074 throws java.io.IOException {
00075 int ftres = FTManager.NON_FT;
00076 try {
00077
00078 ftres = destinationBody.receiveRequest(this);
00079
00080
00081 } catch (Exception e) {
00082 this.backupSolution(destinationBody);
00083 }
00084 return ftres;
00085 }
00086
00090 protected void backupSolution(UniversalBody destinationBody)
00091 throws java.io.IOException {
00092 boolean ok = false;
00093 tries = 0;
00094
00095 UniqueID bodyID = destinationBody.getID();
00096 while (!ok && (tries < MAX_TRIES)) {
00097 UniversalBody remoteBody = null;
00098 UniversalBody mobile = queryServer(bodyID);
00099
00100
00101 remoteBody = (UniversalBody) ((FutureProxy) ((StubObject) mobile).getProxy()).getResult();
00102 try {
00103 remoteBody.receiveRequest(this);
00104
00105
00106
00107 if (sender != null) {
00108 sender.updateLocation(bodyID, remoteBody);
00109 } else {
00110 LocalBodyStore.getInstance().getLocalBody(getSourceBodyID())
00111 .updateLocation(bodyID, remoteBody);
00112 }
00113 ok = true;
00114 } catch (Exception e) {
00115 logger.debug(
00116 "RequestWithLocationServer: .............. FAILED = " +
00117 " for method " + methodName);
00118 tries++;
00119 }
00120 }
00121 }
00122
00123 protected UniversalBody queryServer(UniqueID bodyID) {
00124 if (server == null) {
00125 server = LocationServerFactory.getLocationServer();
00126 }
00127 UniversalBody mobile = (UniversalBody) server.searchObject(bodyID);
00128
00129 logger.debug(
00130 "RequestWithLocationServer: backupSolution() server has sent an answer");
00131
00132 ProActive.waitFor(mobile);
00133 return mobile;
00134 }
00135 }