public DSDPSNode() { GlobalRabbitMQConnection.Instance.GetConnection().ConnectionShutdown += DSDPSNode_ConnectionShutdown; jobListDictionary = new Dictionary<int, List<Job>>(); jobProcessorManager = new JobProcessorkManager(); jobProcessorManager.OnJobCompleted += JobProcessorManager_OnJobCompleted; jobProcessorManager.OnJobProgress += JobProcessorManager_OnJobProgress; updateManager = new UpdateManager(); syncServerComm = new SyncMessageSender("DSDPS_SYNC", "NODE", "SERVER"); asyncServerCommSender = null; }
public DSDPSClient(Action<string, int> ServerClientJobSubmitCallback, Action<string, int> ServerClientJobCancelCallback , Action<string, List<JobStatus>> ServerClientJobStatusCallback) { GlobalRabbitMQConnection.Instance.GetConnection().ConnectionShutdown += DSDPSClient_ConnectionShutdown; jobListDictionary = new Dictionary<int, List<Job>>(); //serverMessageSender = new MessageSender("DPSClientToServer"); syncServerComm = new SyncMessageSender("DSDPS_SYNC", "CLIENT", "SERVER"); asyncServerCommSender = null; this.ServerClientJobSubmitCallback = ServerClientJobSubmitCallback; this.ServerClientJobCancelCallback = ServerClientJobCancelCallback; this.ServerClientJobStatusCallback = ServerClientJobStatusCallback; }
public void AsyncMessageProcessor(string incomingMsgStr,object orgMsg) { try { AsyncServerNodeRequestMessage incomingMsgBase = JsonConvert.DeserializeObject<AsyncServerNodeRequestMessage>(incomingMsgStr); switch (incomingMsgBase.messageType) { case AsyncMessageType.SERVER_NODE_JOB_SUBMIT: { AsyncServerNodeJobSubmitRequestMessage reqMsg = JsonConvert.DeserializeObject<AsyncServerNodeJobSubmitRequestMessage>(incomingMsgStr); Console.WriteLine(DateTime.Now.ToString("[HH:mm:ss.fff]") + "[S->N][JOB_SUBMIT]" + reqMsg.GetJson(true)); List<Job> jobList = reqMsg.jobList; bool result = false; foreach (Job job in jobList) { lock (lockObj) { result |= jobProcessorManager.StartJobProcessor(job); } } AsyncServerNodeJobSubmitResponseMessage respMsg = new AsyncServerNodeJobSubmitResponseMessage(); if (result) { respMsg.returnCode = 0; respMsg.returnMessage = "Job submit request accepted."; } else { respMsg.returnCode = -1; respMsg.returnMessage = "Job submit request failed."; } respMsg.orgMsgID = reqMsg.msgID; asyncServerCommSender.SendResponse(respMsg); break; } case AsyncMessageType.SERVER_NODE_JOB_CANCEL: lock (lockObj) { AsyncServerNodeJobCancelRequestMessage reqMsg = JsonConvert.DeserializeObject<AsyncServerNodeJobCancelRequestMessage>(incomingMsgStr); Console.WriteLine(DateTime.Now.ToString("[HH:mm:ss.fff]") + "[S->N][JOB_CANCEL]" + reqMsg.GetJson(true)); //ret will be true if at least one cancel request succeed List<int> jobIDList = reqMsg.jobIDList; bool result = false; foreach (int jobID in jobIDList) { result |= jobProcessorManager.TryCancelTask(jobID); } AsyncServerNodeJobCancelResponseMessage respMsg = new AsyncServerNodeJobCancelResponseMessage(); respMsg.orgMsgID = reqMsg.msgID; if (result == true) { respMsg.returnCode = 0; respMsg.returnMessage = "Job cancel request accepted."; } else { respMsg.returnCode = -1; respMsg.returnMessage = "Job cancel request failed."; } if (!asyncServerCommSender.SendResponse(respMsg)) Console.WriteLine("[Error] SendResponse failed!"); break; } case AsyncMessageType.SERVER_NODE_JOB_STATUS: lock (lockObj) { AsyncServerNodeJobStatusRequestMessage reqMsg = JsonConvert.DeserializeObject<AsyncServerNodeJobStatusRequestMessage>(incomingMsgStr); Console.WriteLine(DateTime.Now.ToString("[HH:mm:ss.fff]") + "[S->N][JOB_STATUS]" + reqMsg.GetJson(true)); AsyncServerNodeJobStatusResponseMessage respMsg = new AsyncServerNodeJobStatusResponseMessage(); respMsg.orgMsgID = reqMsg.msgID; if (reqMsg.jobIDList.Count > 0) { foreach (int jobID in reqMsg.jobIDList) { JobStatus jobStatus = jobProcessorManager.GetJobStatusClone(jobID); respMsg.jobStatusList.Add(jobStatus); } respMsg.returnCode = 0; respMsg.returnMessage = "Job status returned."; } else { respMsg.returnCode = -1; respMsg.returnMessage = "Job status request failed."; } if (!asyncServerCommSender.SendResponse(respMsg)) Console.WriteLine("[Error] SendResponse failed!"); break; } case AsyncMessageType.SERVER_NODE_NODE_PROC_UPDATE: int updateProcVersion = 0; lock (lockObj) { AsyncServerNodeProcUpdateCastMessage reqMsg = JsonConvert.DeserializeObject<AsyncServerNodeProcUpdateCastMessage>(incomingMsgStr); updateProcVersion = reqMsg.updateVersion; Console.WriteLine(DateTime.Now.ToString("[HH:mm:ss.fff]") + "[S->N][NODE_PROC_UPDATE]" + reqMsg.GetJson(true)); } Task.Factory.StartNew(() => { using (SyncMessageSender sender = new SyncMessageSender("DSDPS_UPDATE", "NODE", "SERVER")) { sender.Init(60000 * 5, true); SyncNodeServerGetProcBinaryRequest req = new SyncNodeServerGetProcBinaryRequest(); req.updateVersion = updateProcVersion; Console.WriteLine("[SERVER_NODE_NODE_PROC_UPDATE] requesting file..."); updateManager.StartBlocking(); string ret = sender.Call(req.GetJson()); Console.WriteLine("[SERVER_NODE_NODE_PROC_UPDATE] done!"); SyncNodeServerGetProcBinaryResponse resp = JsonConvert.DeserializeObject<SyncNodeServerGetProcBinaryResponse>(ret); lock (lockObj) { Console.WriteLine("Stop heartbeat task"); hbManager.Stop(); updateManager.UpdateJobProcessor(updateProcVersion, resp.compressedFile); } } }); break; case AsyncMessageType.SERVER_NODE_NODE_UPDATE: int updateNodeVersion = 0; lock (lockObj) { AsyncServerNodeNodeBinUpdateCastMessage reqMsg = JsonConvert.DeserializeObject<AsyncServerNodeNodeBinUpdateCastMessage>(incomingMsgStr); updateNodeVersion = reqMsg.updateVersion; Console.WriteLine(DateTime.Now.ToString("[HH:mm:ss.fff]") + "[S->N][NODE_UPDATE]" + reqMsg.GetJson(true)); DSDPSNode.Instance.Logout(); Task.Factory.StartNew(() => { using (SyncMessageSender sender = new SyncMessageSender("DSDPS_UPDATE", "NODE", "SERVER")) { sender.Init(60000 * 5, true); SyncNodeServerGetNodeBinaryRequest req = new SyncNodeServerGetNodeBinaryRequest(); req.updateVersion = updateNodeVersion; Console.WriteLine("[SERVER_NODE_NODE_PROC_UPDATE] requesting file..."); req.nodeKey = NodeKey; updateManager.StartBlocking(); string ret = sender.Call(req.GetJson()); Console.WriteLine("[SERVER_NODE_NODE_PROC_UPDATE] done!"); SyncNodeServerGetProcBinaryResponse resp = JsonConvert.DeserializeObject<SyncNodeServerGetProcBinaryResponse>(ret); lock (lockObj) { Console.WriteLine("Stop heartbeat task"); hbManager.Stop(); if (!updateManager.UpdateNode(updateNodeVersion, resp.compressedFile)) Console.WriteLine(DateTime.Now.ToString("[HH:mm:ss.fff]") + "[Error][AsyncMessageProcessor] Node update failed." + incomingMsgBase.messageType); } } }); } break; default: Console.WriteLine(DateTime.Now.ToString("[HH:mm:ss.fff]") + "[Error][AsyncMessageProcessor] Not supported type of message." + incomingMsgBase.messageType); break; } } catch (Exception e) { var st = new StackTrace(e, true); // Get the top stack frame var frame = st.GetFrame(0); // Get the line number from the stack frame var line = frame.GetFileLineNumber(); Console.WriteLine(DateTime.Now.ToString("[HH:mm:ss.fff]") + "[Error][ServerSideRPCRequestProcessor][" + line + "] " + e.Message); } }