static void Main(string[] args) { Console.WriteLine("Remote middle tier host: "); string host = Console.ReadLine(); Console.WriteLine("Sakila.payment filter: "); string filter = Console.ReadLine(); CConnectionContext cc = new CConnectionContext(host, 20911, "SomeUserId", "A_Password_For_SomeUserId", tagEncryptionMethod.TLSv1); #if WIN32_64 #else //CA file is located at the directory ../socketpro/bin bool ok = CClientSocket.SSL.SetVerifyLocation("ca.cert.pem"); #endif using (CMaster master = new CMaster("")) { master.DoSslServerAuthentication += (pool, cs) => { int ret; IUcert cert = cs.UCert; string res = cert.Verify(out ret); return(ret == 0); }; ok = master.StartSocketPool(cc, 1, 1); if (!ok) { Console.WriteLine("Failed in connecting to remote middle tier server, and press any key to close the application ......"); Console.ReadLine(); return; } CDataSet cache = master.Cache; //accessing real-time update cache CWebAsyncHandler handler = master.Seek(); ok = handler.GetMasterSlaveConnectedSessions((m, s) => { Console.WriteLine("master connections: {0}, slave connections: {1}", m, s); }); ok = handler.QueryPaymentMaxMinAvgs(filter, (mma, res, errMsg) => { if (res != 0) { Console.WriteLine("QueryPaymentMaxMinAvgs error code: {0}, error message: {1}", res, errMsg); } else { Console.WriteLine("QueryPaymentMaxMinAvgs max: {0}, min: {1}, avg: {2}", mma.Max, mma.Min, mma.Avg); } }); CDBVariantArray vData = new CDBVariantArray(); vData.Add(1); //Google company id vData.Add("Ted Cruz"); vData.Add(DateTime.Now); vData.Add(1); //Google company id vData.Add("Donald Trump"); vData.Add(DateTime.Now); vData.Add(2); //Microsoft company id vData.Add("Hillary Clinton"); vData.Add(DateTime.Now); TaskCompletionSource <bool> tcs = new TaskCompletionSource <bool>(); ok = handler.UploadEmployees(vData, (res, errMsg, vId) => { if (res != 0) { Console.WriteLine("UploadEmployees Error code = {0}, , error message = {1}", res, errMsg); } else { foreach (object id in vId) { Console.WriteLine("Last id: " + id); } } tcs.SetResult(true); }, (h, canceled) => { Console.WriteLine("Socket closed or request cancelled"); tcs.SetResult(true); }); if (ok) { if (!tcs.Task.Wait(5000)) { Console.WriteLine("The above requests are not completed in 5 seconds"); } } else { Console.WriteLine("Socket already closed before sending request"); } Console.WriteLine("Press ENTER key to test requests parallel processing and fault tolerance at server side ......"); Console.ReadLine(); ss.CMaxMinAvg sum_mma = new ss.CMaxMinAvg(); DateTime start = DateTime.Now; uint returned = 0; for (uint n = 0; n < 10000; ++n) { ok = handler.QueryPaymentMaxMinAvgs(filter, (mma, res, errMsg) => { if (res != 0) { Console.WriteLine("QueryPaymentMaxMinAvgs error code: {0}, error message: {1}", res, errMsg); } else { sum_mma.Avg += mma.Avg; sum_mma.Max += mma.Max; sum_mma.Min += mma.Min; } ++returned; }); } ok = handler.WaitAll(); Console.WriteLine("Time required: {0} seconds for {1} requests", (DateTime.Now - start).TotalSeconds, returned); Console.WriteLine("QueryPaymentMaxMinAvgs sum_max: {0}, sum_min: {1}, sum_avg: {2}", sum_mma.Max, sum_mma.Min, sum_mma.Avg); Console.WriteLine("Press ENTER key to test requests server parallel processing, fault tolerance and sequence returning ......"); Console.ReadLine(); long prev_rental_id = 0; CWebAsyncHandler.DRentalDateTimes rdt = (dates, res, errMsg) => { if (res != 0) { Console.WriteLine("GetRentalDateTimes call error code: {0}, error message: {1}", res, errMsg); prev_rental_id = 0; } else if (dates.rental_id == 0) { Console.WriteLine("GetRentalDateTimes call rental_id={0} not available", dates.rental_id); prev_rental_id = 0; } else { if (0 == prev_rental_id || dates.rental_id == prev_rental_id + 1) { Console.WriteLine("GetRentalDateTimes call rental_id={0} and dates ({1}, {2}, {3})", dates.rental_id, dates.Rental, dates.Return, dates.LastUpdate); } else { Console.WriteLine("****** GetRentalDateTimes returned out of order ******"); } prev_rental_id = dates.rental_id; } }; //all requests should be returned in sequence (max rental_id = 16049) for (int n = 0; n < 1000; ++n) { ok = handler.GetRentalDateTimes(n + 1, rdt); } handler.WaitAll(); Console.WriteLine("Press a key to shutdown the demo application ......"); Console.ReadLine(); } }
static void Main(string[] args) { Console.WriteLine("Remote middle tier host: "); string host = Console.ReadLine(); Console.WriteLine("Sakila.payment filter: "); //for example: payment_id between 1 and 49 string filter = Console.ReadLine(); CConnectionContext cc = new CConnectionContext(host, 20911, "SomeUserId", "A_Password_For_SomeUserId", tagEncryptionMethod.TLSv1); #if WIN32_64 #else //CA file is located at the directory ../socketpro/bin bool ok = CClientSocket.SSL.SetVerifyLocation("ca.cert.pem"); #endif using (CMaster master = new CMaster("")) { master.DoSslServerAuthentication += (pool, cs) => { int ret; IUcert cert = cs.UCert; string res = cert.Verify(out ret); return(ret == 0); }; //master.QueueName = "mcqueue"; ok = master.StartSocketPool(cc, 1); if (!ok) { Console.WriteLine("No connection to remote middle tier server, and press a key to kill the demo ......"); Console.ReadLine(); return; } //accessing real-time update cache CDataSet cache = master.Cache; CWebAsyncHandler handler = master.Seek(); CDBVariantArray vData = new CDBVariantArray(); vData.Add(1); //Google company id vData.Add("Ted Cruz"); vData.Add(DateTime.Now); vData.Add(1); //Google company id vData.Add("Donald Trump"); vData.Add(DateTime.Now); vData.Add(2); //Microsoft company id vData.Add("Hillary Clinton"); vData.Add(DateTime.Now); try { var tms = handler.sendRequest(Consts.idGetMasterSlaveConnectedSessions); var tmma = handler.sendRequest(Consts.idQueryMaxMinAvgs, filter); var tue = handler.sendRequest(Consts.idUploadEmployees, vData); var sb = tms.Result; Console.WriteLine("master connections: {0}, slave connections: {1}", sb.Load <uint>(), sb.Load <uint>()); sb = tmma.Result; Console.WriteLine("QueryPaymentMaxMinAvgs"); int res = sb.Load <int>(); string errMsg = sb.Load <string>(); if (res != 0) { Console.WriteLine("\terror code: {0}, error message: {1}", res, errMsg); } else { CMaxMinAvg mma = sb.Load <CMaxMinAvg>(); Console.WriteLine("\tmax: {0}, min: {1}, avg: {2}", mma.Max, mma.Min, mma.Avg); } if (tue.Wait(5000)) { sb = tue.Result; res = sb.Load <int>(); errMsg = sb.Load <string>(); Console.WriteLine("UploadEmployees"); if (res != 0) { Console.WriteLine("\tError code: {0}, message: {1}", res, errMsg); } else { var vId = sb.Load <CInt64Array>(); foreach (object id in vId) { Console.WriteLine("\tLast id: " + id); } } } else { Console.WriteLine("The request UploadEmployees not completed in 5 seconds"); } Console.WriteLine("Press ENTER key to test requests server parallel processing ......"); Console.ReadLine(); CMaxMinAvg sum_mma = new CMaxMinAvg(); Queue <Task <CScopeUQueue> > qT = new Queue <Task <CScopeUQueue> >(); DateTime start = DateTime.Now; for (uint n = 0; n < 10000; ++n) { qT.Enqueue(handler.sendRequest(Consts.idQueryMaxMinAvgs, filter)); } int count = qT.Count; Console.WriteLine("QueryPaymentMaxMinAvgs"); while (qT.Count > 0) { sb = qT.Dequeue().Result; res = sb.Load <int>(); errMsg = sb.Load <string>(); if (res != 0) { Console.WriteLine("error code: {0}, message: {1}", res, errMsg); } else { CMaxMinAvg mma = sb.Load <CMaxMinAvg>(); sum_mma.Avg += mma.Avg; sum_mma.Max += mma.Max; sum_mma.Min += mma.Min; } sb.Dispose(); } Console.WriteLine("\tTime required: {0} seconds for {1} requests", (DateTime.Now - start).TotalSeconds, count); Console.WriteLine("\tsum_max: {0}, sum_min: {1}, sum_avg: {2}", sum_mma.Max, sum_mma.Min, sum_mma.Avg); Console.WriteLine("Press ENTER key to test server parallel processing and sequence returning ......"); Console.ReadLine(); for (long n = 0; n < 16000; ++n) { qT.Enqueue(handler.sendRequest(Consts.idGetRentalDateTimes, n + 1)); } long prev_rental_id = 0; Console.WriteLine("GetRentalDateTimes:"); while (qT.Count > 0) { sb = qT.Dequeue().Result; CRentalDateTimes dates = sb.Load <CRentalDateTimes>(); res = sb.Load <int>(); errMsg = sb.Load <string>(); if (res != 0) { Console.WriteLine("\terror code: {0}, message: {1}", res, errMsg); } else if (dates.LastUpdate.Ticks == 0 && dates.Rental.Ticks == 0 && dates.Return.Ticks == 0) { Console.WriteLine("\trental_id: {0} not available", dates.rental_id); } else { if (0 == prev_rental_id || dates.rental_id == prev_rental_id + 1) { //Console.WriteLine("rental_id={0} and dates ({1}, {2}, {3})", dates.rental_id, dates.Rental, dates.Return, dates.LastUpdate); } else { Console.WriteLine("\t****** returned out of order ******"); } } prev_rental_id = dates.rental_id; sb.Dispose(); } } catch (AggregateException ex) { foreach (Exception e in ex.InnerExceptions) { //An exception from server (CServerError), Socket closed after sending a request (CSocketError) or request canceled (CSocketError), Console.WriteLine(e); } } catch (CSocketError ex) { Console.WriteLine(ex); } catch (Exception ex) { Console.WriteLine(ex); } Console.WriteLine("Press a key to kill the demo ......"); Console.ReadLine(); } }