/** * Title: Data Transfer/Routing Simulation

* Description:

* Copyright: Copyright (c) Aaron Morris

* Company: CS522

* @author Aaron Morris * @version 1.0 */ //package datasend; public class Director extends DataHandler { private ClientQueue clients; private ServerQueue servers; private int [] serverLoads; private int numClients; private int numServers; protected Stats stats; // Constructor public Director(String Name, int ID, ClientQueue c, ServerQueue s, RandNum r, int Delay,EventQueue eventList, Stats stats) { clients = c; servers = s; super.Name = Name; super.eventList = eventList; this.stats = stats; numClients = c.getNumClients(); numServers = s.getNumServers(); serverLoads = new int[numServers]; super.Delay = Delay; super.ID = ID; super.randGen = r; for (int i = 0; i < numServers; i++) serverLoads[i] = 0; } public void receive(int Time, Message m) { int [] LeastDelayed; int numOptimal = 0; int LeastLoad = 99999; int RandomServer; int OptimalServer; Server stemp; Client ctemp; Channel chtemp; // If sending on to a Server find least loaded one to best of Director's // Knowledge if (m.getHeaderName() == "REQUEST") { LeastDelayed = new int[numServers]; numOptimal = 0; for (int i = 0; i < numServers; i++) { if (serverLoads[i] < LeastLoad) { LeastLoad = serverLoads[i]; } } // Of all the lowest load servers, randomly pick one for (int i = 0; i < numServers; i++) { if (LeastLoad == serverLoads[i]) { LeastDelayed[numOptimal] = i; numOptimal++; } } RandomServer = randGen.getJavaInt(numOptimal); RandomServer = LeastDelayed[RandomServer]; stemp = servers.getServer(RandomServer); chtemp = stemp.getDestChannel(); TransferEvent te = new TransferEvent("TO",Time+this.getDelay(),m,this, chtemp); eventList.enQueue(te); serverLoads[RandomServer]++; //String output = new String(" Server Loads: "); //for (int i = 0; i < numServers; i++) // output = output + "[" + i + "," + serverLoads[i] + "] "; //stats.report.write(output); //stats.report.write(" Director is sending Message #" + m.getMsgID() + // " to " + // stemp.getName() + ", current Load = " + // stemp.getCurrentLoad()); } // If sending back to a Client else { // Get Clients' Channel chtemp = m.getOrigObj().getDestChannel(); serverLoads[m.getSource().getID()]--; // Generate Transfer Event from Director to Client TransferEvent te = new TransferEvent("TO",Time+this.getDelay(),m, this,chtemp); eventList.enQueue(te); //stats.report.write("Director is sending Message #" + m.getMsgID() + // " back to " + m.getOrigObj().getName() + // " through Channel #" + // chtemp.getID()); } } }