package es.tid.pce.computingEngine.algorithms; import java.io.DataOutputStream; import java.net.Inet4Address; import java.util.Hashtable; import java.util.LinkedList; import java.util.concurrent.FutureTask; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import es.tid.pce.computingEngine.ComputingRequest; import es.tid.pce.computingEngine.ComputingResponse; import es.tid.pce.pcep.constructs.Request; import es.tid.pce.pcep.messages.PCEPInitiate; import es.tid.pce.pcep.messages.PCEPRequest; import es.tid.tedb.TEDB; /** * Manages the requests to the Child PCEs * Child PCE Session must register using the registerDomainSession method * The Parent PCE when asking a PCE must call the method newRequest * @author ogondio * */ public class LocalChildRequestManager { /** * Relates Child PCEs with its domain with */ //private Hashtable<String,ClientRequestManager> domain_pce; /** * Relates domain_id with the output stream of the Child PCEs */ private Hashtable<Inet4Address,DataOutputStream> domainIdOutputStream; private Hashtable<Inet4Address,Inet4Address> domainIdpceId; public Hashtable<Long,Object> locks; private Hashtable<Long,ComputingResponse> responses; private ThreadPoolExecutor executor; private LinkedBlockingQueue<Runnable> workQueue; //private BlockingQueue<ChildPCERequest> workQueue; private Logger log; private Logger logGUI; public LocalChildRequestManager(){ locks = new Hashtable<Long, Object>(); responses=new Hashtable<Long, ComputingResponse>(); domainIdOutputStream=new Hashtable<Inet4Address,DataOutputStream>(); domainIdpceId=new Hashtable<Inet4Address,Inet4Address>(); int corePoolSize=5; int maximumPoolSize=10; long keepAliveTime=120; workQueue=new LinkedBlockingQueue<Runnable>(); executor= new ThreadPoolExecutor(corePoolSize, maximumPoolSize,keepAliveTime, TimeUnit.SECONDS,workQueue); log = LoggerFactory.getLogger("PCEServer"); logGUI=LoggerFactory.getLogger("GUILogger"); } public LinkedList<ComputingResponse> executeRequests(LinkedList<PCEPRequest> requestList, LinkedList<Inet4Address> domainList, ComputingAlgorithmManagerSSON cam_sson, TEDB ted){ LinkedList<ComputingResponse> response= new LinkedList<ComputingResponse>(); int mf=0; LinkedList<FutureTask<ComputingResponse>> ftList=new LinkedList<FutureTask<ComputingResponse>>(); FutureTask<ComputingResponse> ft; for (int i=0;i<requestList.size();++i){ ComputingRequest compRquest = new ComputingRequest(); LinkedList<Request> requestList2=new LinkedList<Request>(); compRquest.setRequestList(requestList2); compRquest.getRequestList().add(requestList.get(i).getRequestList().get(0)); ComputingAlgorithm cpr=cam_sson.getComputingAlgorithm(compRquest,ted,mf); ft=new FutureTask<ComputingResponse>(cpr); ftList.add(ft); executor.execute(ft); } long time=120000; System.out.println("The time is "+time+" miliseconds"); long timeIni=System.currentTimeMillis(); long time2; ComputingResponse resp; for (int i=0;i<requestList.size();++i){ try { System.out.println("Waiting "+time+" miliseconds for domain "+domainList.get(i)); resp=ftList.get(i).get(time, TimeUnit.MILLISECONDS); System.out.println("Response: "+resp.getResponse(0).toString()); time2=System.currentTimeMillis(); long timePassed=time2-timeIni; if (timePassed>=120000){ time=0; } else { time=time-timePassed; } response.add(resp); // } catch (InterruptedException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } catch (ExecutionException e) { // // TODO Auto-generated catch block // e.printStackTrace(); } catch (TimeoutException e) { //System.out. resp=null; time2=System.currentTimeMillis(); time=time-time2-timeIni; // TODO Auto-generated catch block e.printStackTrace(); // } } catch (Exception e){ return null; //FIXME: REPARAR PARA MANDAR MAS!!!! } } return response; } // public LinkedList<ComputingResponse> executeInitiates(LinkedList<PCEPInitiate> iniList, LinkedList<Inet4Address> domainList, ComputingAlgorithmManagerSSON cam_sson, TEDB ted){ // LinkedList<ComputingResponse> response= new LinkedList<ComputingResponse>(); // int mf=0; // LinkedList<FutureTask<ComputingResponse>> ftList=new LinkedList<FutureTask<ComputingResponse>>(); // FutureTask<ComputingResponse> ft; // for (int i=0;i<iniList.size();++i){ // ComputingRequest compRquest = new ComputingRequest(); // LinkedList<Request> requestList2=new LinkedList<Request>(); // compRquest.setRequestList(requestList2); // compRquest.getRequestList().add(iniList.get(i).getRequestList().get(0)); // ComputingAlgorithm cpr=cam_sson.getComputingAlgorithm(compRquest,ted,mf); // ft=new FutureTask<ComputingResponse>(cpr); // ftList.add(ft); // executor.execute(ft); // } // long time=120000; // System.out.println("The time is "+time+" miliseconds"); // long timeIni=System.currentTimeMillis(); // long time2; // ComputingResponse resp; // for (int i=0;i<requestList.size();++i){ // // try { // System.out.println("Waiting "+time+" miliseconds for domain "+domainList.get(i)); // resp=ftList.get(i).get(time, TimeUnit.MILLISECONDS); // System.out.println("Response: "+resp.getResponse(0).toString()); // time2=System.currentTimeMillis(); // long timePassed=time2-timeIni; // if (timePassed>=120000){ // time=0; // } // else { // time=time-timePassed; // } // response.add(resp); //// } catch (InterruptedException e) { //// // TODO Auto-generated catch block //// e.printStackTrace(); //// } catch (ExecutionException e) { //// // TODO Auto-generated catch block //// e.printStackTrace(); // } catch (TimeoutException e) { // //System.out. // resp=null; // time2=System.currentTimeMillis(); // time=time-time2-timeIni; // // TODO Auto-generated catch block // e.printStackTrace(); //// } // } catch (Exception e){ // return null; //FIXME: REPARAR PARA MANDAR MAS!!!! // // } // // } // // return response; // } }