/// <summary> /// Sends the message. /// </summary> /// <param name="mInfo">The m information.</param> public void SendMessage(MessageManagerInfo mInfo) { lock (_messageQueue) { _messageQueue.Add(mInfo); } }
/// <summary> /// Mqs the spawn worker. /// </summary> /// <param name="msg">The MSG.</param> private void MQSpawnWorker(MessageManagerInfo msg) { var worker = (IBaseWorker)msg.MessageData; AddWorker(worker); worker.Start(true); }
/// <summary> /// Received the mq message. /// </summary> /// <param name="msg">The MSG.</param> internal void ReceivedMQMessage(MessageManagerInfo msg) { try { if (msg.BeginEvent != null) { msg.BeginEvent(); } switch (msg.MessageId) { case MessageManagerId.SpawnWorker: MQSpawnWorker(msg); break; case MessageManagerId.TerminateWorker: MQTerminateWorker(msg); break; case MessageManagerId.WorkerFailedToRespond: MQRemoveNonResponsiveWorker(msg); break; } if (msg.EndEvent != null) { msg.EndEvent(); } } catch (Exception ex) { Notification.SendException(ex, true); } }
/// <summary> /// Mqs the remove non responsive worker. /// </summary> /// <param name="msg">The MSG.</param> private void MQRemoveNonResponsiveWorker(MessageManagerInfo msg) { var threadInfo = (ThreadWatcherInfo)msg.MessageData; var worker = threadInfo.Worker; if (worker == null) { return; } var restart = worker.WorkPackage.Parameters("restartNonResponsive") == "true"; var workerName = worker.WorkPackage.Name; var instanceName = worker.WorkPackage.NameInstance; Notification.SendException(new Exception(string.Format("The following thread: '{0}' failed to respond.", worker.WorkPackage.NameInstance)), true); var mInfoTerminate = new MessageManagerInfo(MessageManagerId.TerminateWorker, worker) { EndEvent = () => { if (restart && ManagerRuntimeState == ManagerRuntimeStates.Started) { worker = CreateWorker(workerName, instanceName, worker.WorkPackage.GetData <object>()); var mInfo = new MessageManagerInfo(MessageManagerId.SpawnWorker, worker) { BeginEvent = () => { Notification.SendMessage(string.Format("Restarting worker: {0}", worker.WorkPackage.NameInstance), NotificationType.Information); } }; _messageManager.SendMessage(mInfo); } } }; _messageManager.SendMessage(mInfoTerminate); }
private void MQTerminateWorker(MessageManagerInfo msg) { var worker = (IBaseWorker)msg.MessageData; try { if (worker != null) { worker.Stop(); DisposeWorker(worker); RemoveWorker(worker); } } catch (WorkManagerException ex) { Notification.SendException(ex); } catch (Exception ex) { var eMsg = string.Format("An unhandled exception was detected while Terminating Worker '{0}'", worker.Name); Notification.SendException(new WorkManagerException(eMsg, ex), true); } }