private static Action ServiceActionMake(HiResTimer hres, WriterClient clnt, Receiver rcvr) { Action serviceAction = () => { Message msg1 = null; while (true) { msg1 = rcvr.getMessage(); // note use of non-service method to deQ messages if (msg1.content == "done") { hres.Stop(); ulong lookUpTime = hres.ElapsedMicroseconds; Message msg2 = new Message(); msg2.fromUrl = clnt.localUrl; msg2.toUrl = clnt.wpfClientURL; msg2.content = "LookupTime;" + lookUpTime + ";" + "CntMsg;" + (ulong)clnt.total + ";"; Sender wpfSender = new Sender(clnt.localUrl); wpfSender.sendMessage(msg2); Console.WriteLine("\n----------------------Overall Performance Statistics for Write Client-----------------------------\n"); Console.WriteLine("Number of messages processed is {0}", clnt.total); Console.WriteLine("\nTotal Execution time for the messages to be processed at Client Side is {0} microsecs", clnt.WriteClientTime); Console.WriteLine("\nAverage Execution time for the messages to be processed at Client Side is {0} microsecs", clnt.WriteClientTime / (ulong)clnt.total); Console.WriteLine("\nTotal Execution time for the messages from Client-Server-Client {0} microsecs", lookUpTime); Console.WriteLine("\nAverage Execution time for the messages from Client-Server-Client is {0} microsecs", lookUpTime / (ulong)clnt.total); Console.WriteLine("\n----------------------Overall Performance Statistics for Write Client-----------------------------\n"); break; } else if (msg1.content == "connection start message") Console.WriteLine("Connection start message receieved at client side"); else { XDocument docTemp = XDocument.Load(new StringReader(msg1.content)); string mid = docTemp.Descendants("OperationMessage").Elements("MessageID").Single().Value; string op = docTemp.Descendants("OperationMessage").Elements("Operation").Single().Value; string resp = docTemp.Descendants("OperationMessage").Elements("Response").Single().Value; Console.Write("\nMessage - MessageID:{0} received at the client", mid); Console.Write("\nSender:{0}", msg1.fromUrl); Console.Write("\nOperation :{0}", op); Console.Write("\nResponse :{0}", resp); string oldDt = docTemp.Descendants("InsertTime").Select(i => i).Single().Value.ToString(); long microseconds = (DateTime.Now.Ticks - long.Parse(oldDt)) / 10; Console.Write("\nExecution time for message(MessageID:{1}) is {0} microseconds\n", microseconds, mid); } } Util.waitForUser(); }; return serviceAction; }
static void Main(string[] args) { try { HiResTimer hres = new HiResTimer(); //High Resolution Timer Console.Write("\nStarting CommService write client"); Console.Write("\n =============================\n"); Console.Title = "Write Client"; Message msg = new Message(); WriterClient clnt = new WriterClient(); clnt.processCommandLine(args); string localPort = Util.urlPort(clnt.localUrl); string localAddr = Util.urlAddress(clnt.localUrl); Receiver rcvr = new Receiver(localPort, localAddr); Action serviceAction = DefineServiceAction(hres, clnt, rcvr); if (rcvr.StartService()) rcvr.doService(serviceAction); Sender sndr = new Sender(clnt.localUrl); // Sender needs localUrl for start message msg.fromUrl = clnt.localUrl; msg.toUrl = clnt.remoteUrl; Console.Write("Sender's url is {0}", msg.fromUrl); Console.Write("Attempting to connect to {0}\n", msg.toUrl); if (!sndr.Connect(msg.toUrl)) { Console.Write("Could not connect in {0} attempts\n", sndr.MaxConnectAttempts); sndr.shutdown(); rcvr.shutDown(); return; } PerformanceTesting(hres, msg, clnt, rcvr, sndr); } catch (CustomException ex) { throw new CustomException("Error in main of writer client", ex); } }
/// <summary> /// Define service action that needs to be handled for receiver requests at the client /// </summary> /// <param name="hres"></param> /// <param name="clnt"></param> /// <param name="rcvr"></param> /// <returns></returns> private static Action DefineServiceAction(HiResTimer hres, WriterClient clnt, Receiver rcvr) { try { Action serviceAction = ServiceActionMake(hres, clnt, rcvr); return serviceAction; } catch (CustomException ex) { throw new CustomException("Error in define service action of writer client", ex); } }
/// <summary> /// UpdatePerformance for the client /// </summary> /// <param name="msg"></param> /// <param name="clnt"></param> /// <param name="sndr"></param> /// <param name="xmlStr"></param> /// <param name="docTemp"></param> /// <param name="key"></param> /// <param name="msgid"></param> /// <param name="keyUp"></param> /// <param name="l"></param> private static void UpdatePerformance(Message msg, WriterClient clnt, Sender sndr, ref string xmlStr, out XDocument docTemp, string key, ref string msgid, out string keyUp, out XElement l) { //Update performance testing docTemp = XDocument.Load("Input.xml"); keyUp = ""; l = docTemp.Descendants("OperationMessage").Where(d => d.Element("Operation").Value == "Update").Select(i => i).Single(); clnt.numMsgs = int.Parse(l.Elements("Count").Single().Value); clnt.total += clnt.numMsgs; for (int i = 0; i < clnt.numMsgs; i++) { if (key == "") keyUp = "2"; else keyUp = key; xmlStr = clnt.UpdateGenerator(docTemp, ref msgid, ref keyUp, ""); //Generate data using the xml structure msg.content = xmlStr; if (clnt.loggingCheck == true) Console.Write("Sending Message..Message is \n {0} \n", msg.content); else Console.Write("Sending Message..Message(Message ID:{0})\n", msgid); if (sndr.sendMessage(msg)) { Console.Write("\nUpdated entries in DB - Key:{0} ,MessageID: {1} successfully\n", key, msgid); Thread.Sleep(50); } } }
/// <summary> /// DeletePerformance for the client /// </summary> /// <param name="msg"></param> /// <param name="clnt"></param> /// <param name="sndr"></param> /// <param name="xmlStr"></param> /// <param name="key"></param> /// <param name="msgid"></param> /// <param name="keyUp"></param> /// <param name="l"></param> /// <returns></returns> private static XDocument DeletePerformance(Message msg, WriterClient clnt, Sender sndr, ref string xmlStr, string key, ref string msgid, ref string keyUp, XElement l) { XDocument docTemp = XDocument.Load("Input.xml"); XElement m = docTemp.Descendants("OperationMessage").Where(d => d.Element("Operation").Value == "Delete").Select(i => i).Single(); clnt.numMsgs = int.Parse(l.Elements("Count").Single().Value); clnt.total += clnt.numMsgs; for (int i = 0; i < clnt.numMsgs; i++) { if (KeyLs.Get() != null) { keyUp = KeyLs.LastElement().ToString(); //keyUp = KeyLs.Get()[0].ToString(); KeyLs.Remove(int.Parse(keyUp)); } else keyUp = 2.ToString(); //Construct DB Delete xmlStr = clnt.WriteDataForDelete(docTemp, ref msgid, ref keyUp); //Generate data using the xml structure msg.content = xmlStr; if (clnt.loggingCheck == true) Console.Write("Sending Message..Message is \n {0} \n", msg.content); else Console.Write("Sending Message..Message(Message ID:{0})\n", msgid); if (sndr.sendMessage(msg)) { Console.Write("Message(MessageID {1},Key {0}) sent for deletion successfully\n", key, msgid); Thread.Sleep(50); } } return docTemp; }
/// <summary> /// Insert performance results writer client /// </summary> /// <param name="hres"></param> /// <param name="msg"></param> /// <param name="clnt"></param> /// <param name="sndr"></param> /// <param name="xmlStr"></param> /// <param name="docTemp"></param> /// <param name="key"></param> /// <param name="msgid"></param> /// <returns></returns> private static string InsertPerformance(HiResTimer hres, Message msg, WriterClient clnt, Sender sndr, string xmlStr, out XDocument docTemp, out string key, out string msgid) { docTemp = XDocument.Load("Input.xml"); XElement k = docTemp.Descendants("OperationMessage").Where(d => d.Element("Operation").Value == "Insert").Select(i => i).Single(); if (k.Elements("Count").Single().Value != "") clnt.numMsgs = int.Parse(k.Elements("Count").Single().Value); clnt.total += clnt.numMsgs; hres.Start(); //High resolution timer started key = ""; msgid = ""; for (int i = 0; i < clnt.numMsgs; i++) { docTemp = XDocument.Load("Input.xml"); xmlStr = clnt.InsertGenerator(docTemp, ref msgid, ref key, "int"); //Generate data using the xml structure msg.content = xmlStr; msg.fromUrl = clnt.localUrl; msg.toUrl = clnt.remoteUrl; if (sndr.sendMessage(msg)) { Console.Write("Sent message(Message ID {0}) to insert into DB successfully\n", msgid); Thread.Sleep(50); } } return xmlStr; }
/// <summary> /// Performance testing by inserting items /// </summary> /// <param name="hres"></param> /// <param name="msg"></param> /// <param name="clnt"></param> /// <param name="rcvr"></param> /// <param name="sndr"></param> private static void PerformanceTesting(HiResTimer hres, Message msg, WriterClient clnt, Receiver rcvr, Sender sndr) { try { XmlTextReader textReader = new XmlTextReader("Input.xml"); string xmlStr = ""; HiResTimer t = new HiResTimer(); t.Start(); if (File.Exists("Input.xml")) { XDocument docTemp; string key, msgid; xmlStr = InsertPerformance(hres, msg, clnt, sndr, xmlStr, out docTemp, out key, out msgid); string keyUp; XElement l; UpdatePerformance(msg, clnt, sndr, ref xmlStr, out docTemp, key, ref msgid, out keyUp, out l); //Delete entries docTemp = DeletePerformance(msg, clnt, sndr, ref xmlStr, key, ref msgid, ref keyUp, l); } t.Stop(); clnt.WriteClientTime = t.ElapsedMicroseconds; msg = new Message(); msg.fromUrl = clnt.localUrl; msg.toUrl = clnt.remoteUrl; msg.content = "done"; sndr.sendMessage(msg); // Wait for user to press a key to quit. Util.waitForUser(); // shut down this client's Receiver and Sender by sending close messages rcvr.shutDown(); sndr.shutdown(); Console.Write("\n\n"); } catch (CustomException ex) { throw new CustomException("Error in main of peformance testing", ex); } }