static void Main(string[] args) { var cfg = File.ReadAllText(Path.Combine(Environment.CurrentDirectory, "config.json")); JObject jo = (JObject)JsonConvert.DeserializeObject(cfg); var ip = CodeHelper.GetIP(jo["IP"].ToString()); var port = jo["PORT"].ToString(); var pwd = TokenHelper.Md5(jo["PASSWORD"].ToString()); var numberOfRuns = Convert.ToInt32(jo["NUMBEROFRUNS"].ToString()); // 最大运行次数 var accountFile = jo["ACCOUNTFILE"].ToString(); var accountDetailFile = jo["ACCOUNTDETAILFILE"].ToString(); var timeTableId = jo["TIMETABLEID"].ToString(); var classId = jo["CLASSID"].ToString(); var accounts = File.ReadAllLines(Path.Combine(Environment.CurrentDirectory, accountFile)); var teachingPlanId = jo["TEACHINGPLANID"].ToString(); var resourceId = jo["RESOURCEID"].ToString(); var mqIp = jo["MQIP"].ToString(); var mqPort = jo["MQPORT"].ToString(); var mqUserName = jo["MQUSERNAME"].ToString(); var mqPassword = jo["MQPASSWORD"].ToString(); var serverExchangeName = jo["SERVEREXCHANGENAME"].ToString(); //var maxDegreeOfParallelism = Convert.ToInt32(jo["CONCURRENT"].ToString()); MQHelper.CreateMqConnection(mqIp, mqPort, mqUserName, mqPassword); ConcurrentDictionary <string, string> cd = new ConcurrentDictionary <string, string>(); BlockingCollection <MData> bc = new BlockingCollection <MData>(); // 装置 AccountId 与 Account 的关系 var accountDetails = File.ReadAllLines(Path.Combine(Environment.CurrentDirectory, accountDetailFile)); foreach (var item in accountDetails) { var arr = item.Split('\t'); cd.TryAdd(arr[1], arr[0]); } var r = new Random((int)DateTime.Now.ToFileTimeUtc()); var accountIndexArray = new int[numberOfRuns]; for (var i = 0; i < numberOfRuns; i++) { accountIndexArray[i] = r.Next(0, accounts.Length - 1); } var taskList = new Task[numberOfRuns]; var startDateTime = $"[{ DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")}]"; for (var i = 0; i < numberOfRuns; i++) { int k = i; taskList[i] = new Task(() => { var account = string.Empty; account = accounts[accountIndexArray[k]]; var url = $"http://{ip}:{port}/oauth2/login.html?client_id=1&response_type=code&username={account}&password={pwd}"; SocketHttpHelper.SocketHttpPost(ip, port, url, out string status, out string data); LogHelper.OutputDebugString($"[{k}]{status}, {data}"); if (status == SocketHttpHelper.HttpState.S200) { JObject __jo = JsonConvert.DeserializeObject <JObject>(data); try { var t = __jo["code"].ToString() + __jo["state"].ToString(); var code = __jo["code"].ToString(); // 取得CODE var state = __jo["state"].ToString(); string client_secret = "111"; string baseUrl = "http://" + ip + ":" + port; string tokenUrl = baseUrl + "/oauth2/token"; string redirect_uri = baseUrl + "/oauth2/getToken.do"; var refreshToken = string.Empty; var body = $"grant_type=authorization_code&client_id=1&client_secret={client_secret}&refresh_token={refreshToken}&username={account}&redirect_uri={redirect_uri.Replace("&", "%26%")}&code={code}&state={state}"; SocketHttpHelper.SocketHttpPost(ip, port, tokenUrl, body, out status, out data); LogHelper.OutputDebugString($"[{k}]{status}, {data}"); // 保存有效数据,用于之后的并发测试 if (status == SocketHttpHelper.HttpState.S200) { var joAccessToken = JsonConvert.DeserializeObject <JObject>(data); var accessToken = joAccessToken["access_token"].ToString(); refreshToken = joAccessToken["refresh_token"].ToString(); bc.Add(new MData { AccessToken = accessToken, RefreshToken = refreshToken, Code = code, State = state, Account = account, AccountId = cd[account], ClassId = classId, TimeTableId = timeTableId }); } } catch { } } }); } Console.WriteLine($"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")}]开始获取Code、AccessToken..."); taskList.ToList().ForEach(a => a.Start()); //Parallel.For(0, taskList.Length, new ParallelOptions { MaxDegreeOfParallelism = maxDegreeOfParallelism }, i => { taskList[i].Start(); }); Task.WaitAll(taskList, 1000 * 60 * 10); // 最长等待10分钟 #if true #region 并发测试MQ(考勤) var bcTaskList = bc.ToList(); var mqKaoQinTask = new Task[bcTaskList.Count]; for (var i = 0; i < bcTaskList.Count; i++) { var k = i; mqKaoQinTask[i] = new Task(() => { var a = bcTaskList[k]; var jObj = new JObject(); jObj.Add(new JProperty("studentAccountId", a.AccountId)); jObj.Add(new JProperty("timeTableId", a.TimeTableId)); jObj.Add(new JProperty("wifiName", "Wifi-liuzhenhua")); jObj.Add(new JProperty("checkWorkStatus", "2")); jObj.Add(new JProperty("checkWorkTime", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"))); jObj.Add(new JProperty("classId", a.ClassId)); jObj.Add(new JProperty("tocken", a.AccessToken)); var jsonPostData = jObj.ToString(); LogHelper.OutputDebugString($"MQ::{jsonPostData}"); MQHelper.sentMsgToMQqueue("checkwork", jsonPostData); }); } ; Console.WriteLine($"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")}]开始并发测试MQ(考勤)..."); mqKaoQinTask.ToList().ForEach(a => a.Start()); //Parallel.For(0, mqKaoQinTask.Length, new ParallelOptions { MaxDegreeOfParallelism = maxDegreeOfParallelism }, i => { mqKaoQinTask[i].Start(); }); Task.WaitAll(mqKaoQinTask, 1000 * 60 * 5); // 最长等待5分钟 #endregion #region 并发测试MQ(举手发言) var mqJuShouFaYanTask = new Task[bcTaskList.Count]; for (var i = 0; i < bcTaskList.Count; i++) { var k = i; mqJuShouFaYanTask[i] = new Task(() => { var a = bcTaskList[k]; var jObj = new JObject(); jObj.Add(new JProperty("Course_ID", teachingPlanId)); jObj.Add(new JProperty("Time_Table_ID", a.TimeTableId)); jObj.Add(new JProperty("Account_ID", a.AccountId)); jObj.Add(new JProperty("accessToken", a.AccessToken)); var jsonPostData = jObj.ToString(); LogHelper.OutputDebugString($"MQ::{jsonPostData}"); MQHelper.sentMsgToMQqueue("student_speak", jObj.ToString()); }); } ; Console.WriteLine($"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")}]开始并发测试MQ(举手发言)..."); mqJuShouFaYanTask.ToList().ForEach(a => a.Start()); //Parallel.For(0, mqJuShouFaYanTask.Length, new ParallelOptions { MaxDegreeOfParallelism = maxDegreeOfParallelism }, i => { mqJuShouFaYanTask[i].Start(); }); Task.WaitAll(mqJuShouFaYanTask, 1000 * 60 * 5); // 最长等待5分钟 #endregion #region 并发测试MQ(回答问题) var mqHuiDaWenTiTask = new Task[bcTaskList.Count]; for (var i = 0; i < bcTaskList.Count; i++) { var k = i; mqHuiDaWenTiTask[i] = new Task(() => { var a = bcTaskList[k]; var jObj = new JObject(); jObj.Add(new JProperty("Time_Table_ID", a.TimeTableId)); jObj.Add(new JProperty("Resource_ID", resourceId)); jObj.Add(new JProperty("Course_ID", teachingPlanId)); jObj.Add(new JProperty("Account_ID", a.AccountId)); jObj.Add(new JProperty("Answer_Time", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"))); jObj.Add(new JProperty("type", "1")); jObj.Add(new JProperty("accessToken", a.AccessToken)); var jsonPostData = jObj.ToString(); LogHelper.OutputDebugString($"MQ::{jsonPostData}"); string routingKey = "tea.question.courseId." + a.TimeTableId; MQHelper.sentMsgToMQ(routingKey, jsonPostData, serverExchangeName); }); } ; Console.WriteLine($"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")}]开始并发测试MQ(回答问题)..."); mqHuiDaWenTiTask.ToList().ForEach(a => a.Start()); //Parallel.For(0, mqHuiDaWenTiTask.Length, new ParallelOptions { MaxDegreeOfParallelism = maxDegreeOfParallelism }, i => { mqHuiDaWenTiTask[i].Start(); }); Task.WaitAll(mqHuiDaWenTiTask, 1000 * 60 * 5); // 最长等待5分钟 #endregion #endif var s = $"Run from {startDateTime} to [{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")}], 总运行次数:{numberOfRuns}. All of task finished. Press enter to exit."; LogHelper.OutputDebugString(s); Console.WriteLine(s); Console.ReadLine(); Environment.Exit(0); }
static void Main(string[] args) { var cfg = File.ReadAllText(Path.Combine(Environment.CurrentDirectory, "config.json")); JObject jo = (JObject)JsonConvert.DeserializeObject(cfg); LogHelper.StartService(); var classId = "64c01042e1e64d23812768196ff012f6"; var timeTableId = "30b35e08dab04a5a88198b3ccb4cac73"; var accountId = "li_003"; var accessToken = "ACC-ESS-TOKEN-2020"; var T_T_T_BH = "DEMO-TTT-BH"; var url = jo["URL"].ToString(); var numberOfRuns = Convert.ToInt32(jo["NUMBEROFRUNS"].ToString()); // 最大运行次数 var mqIp = jo["MQIP"].ToString(); var mqPort = jo["MQPORT"].ToString(); var mqUserName = jo["MQUSERNAME"].ToString(); var mqPassword = jo["MQPASSWORD"].ToString(); Task[] mqKaoQinTask = new Task[numberOfRuns]; MQHelper.CreateMqConnection(mqIp, mqPort, mqUserName, mqPassword); var wsObj = WebServiceHelper.GetObject(url); bool isExitTask = false; for (var i = 0; i < numberOfRuns; i++) { var k = i; mqKaoQinTask[i] = new Task(() => { // 获取上课信息 string[] param = new string[] { accountId, "21", accessToken }; LogHelper.Trace($"param::accountId:{param[0]},applicationType:{param[1]},accessToken:{param[2]}"); //var s = WebServiceHelper.CallMethod(url, "getCourseInfoWhenStudentLoginInfo", param); var s = WebServiceHelper.CallMethod(wsObj, "getCourseInfoWhenStudentLoginInfo", param); LogHelper.Trace(s); // 考勤 var jObj = new JObject(); jObj.Add(new JProperty("studentAccountId", accountId)); jObj.Add(new JProperty("timeTableId", timeTableId)); jObj.Add(new JProperty("wifiName", "Wifi-liuzhenhua")); jObj.Add(new JProperty("checkWorkStatus", "2")); jObj.Add(new JProperty("checkWorkTime", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"))); jObj.Add(new JProperty("classId", classId)); jObj.Add(new JProperty("tocken", accessToken)); var jsonPostData = jObj.ToString(); LogHelper.OutputDebugString($"MQ::{jsonPostData}"); MQHelper.sentMsgToMQqueue("checkwork", jsonPostData); }); } ; Console.WriteLine($"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")}]开始并发测试MQ(考勤)..."); mqKaoQinTask.ToList().ForEach(a => a.Start()); #region 考勤统计 Task.Run(() => { while (!isExitTask) { string method2 = "getCheckWorkStatistics"; string[] param2 = new string[] { timeTableId, T_T_T_BH, accessToken }; LogHelper.Trace("param::timeTableId:{0},T_T_T_BH:{1},token:{2}", param2[0], param2[1], param2[2]); var s2 = WebServiceHelper.CallMethod(url, method2, param2); LogHelper.Trace(s2); LogHelper.Trace("Sleep 5000 ms."); Thread.Sleep(5000); } }); #endregion Task.WaitAll(mqKaoQinTask, 1000 * 60 * 5); // 最长等待5分钟 isExitTask = true; Console.WriteLine($"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")}]完成..."); LogHelper.Stop(); }