Example #1
0
 /// <summary>
 /// Sends the message.
 /// </summary>
 /// <param name="mInfo">The m information.</param>
 public void SendMessage(MessageManagerInfo mInfo)
 {
     lock (_messageQueue)
     {
         _messageQueue.Add(mInfo);
     }
 }
Example #2
0
        /// <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);
        }
Example #3
0
        /// <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);
            }
        }
Example #4
0
        /// <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);
        }
Example #5
0
        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);
            }
        }