/// <summary> /// Function used in the thread scheduled. /// </summary> private void FctThreadProcesserScheduled() { IsRunningScheduled = true; while (IsRunningScheduled == true) { try { Global.Log.WriteEvent(LogType.debug, string.Format("[PROCESSER:SCH] Scanning scheduled queue...")); // check if the queue is empty if (QueueScheduled.IsEmpty() == false) { // give all the elements in the queue and dispach it ArrayList queuedObject = QueueScheduled.GiveSpooledObject(StateSpooledObject.queued); foreach (SpooledObject Object in queuedObject) { TimeSpan ts = Object.SendingDate - DateTime.Now; if (Object.SendingDate <= DateTime.Now) { QueueScheduled.ModifyState(Object.Name, StateSpooledObject.dispacher); _dispacher.AddToDispacher(Object); } } } Global.Log.WriteEvent(LogType.debug, string.Format("[PROCESSER:SCH] Next scan in {0} seconds", (float)_tempoThread / 1000)); Thread.Sleep(_tempoThread); } catch (ThreadAbortException) { } catch (Exception ex) { Global.Log.WriteError("[PROCESSER:SCH] " + ex.Message); Global.Log.WriteError("[PROCESSER:SCH] " + ex.StackTrace); } } }
/// <summary> /// Function used in the thread. /// </summary> private void FctThreadDispacher() { IsRunning = true; while (IsRunning == true) { // find a free worker bool oneWorkerIsFree = false; while (oneWorkerIsFree == false) { foreach (Worker work in _workers) { if (work.TaskToDo == null) { oneWorkerIsFree = true; break; } } Thread.Sleep(100); } _mutexSpooledObjects.WaitOne(); try { if (_spooledObjects.Count > 0) { for (int i = 0; i < _workers.Count; i++) { // dispach the spooled object to a free worker if (((Worker)_workers[i]).TaskToDo == null) { SpooledObject toWork = (SpooledObject)_spooledObjects[0]; _spooledObjects.RemoveAt(0); // modify state of object switch (toWork.Type) { case TypeSpooledObject.standardMail: { QueueStandard.ModifyState(toWork.Name, StateSpooledObject.sent); } break; case TypeSpooledObject.scheduledMail: case TypeSpooledObject.scheduledTask: { QueueScheduled.ModifyState(toWork.Name, StateSpooledObject.sent); } break; } Global.Log.WriteEvent(LogType.normal, string.Format("[DISPACHER] '{0}' is assigned to {1}", toWork.Name, ((Worker)_workers[i]).Name)); ((Worker)_workers[i]).TaskToDo = toWork; break; } } } } catch (ThreadAbortException) { } catch (Exception ex) { Global.Log.WriteError("[DISPACHER] " + ex.Message); Global.Log.WriteError("[DISPACHER] " + ex.StackTrace); } _mutexSpooledObjects.ReleaseMutex(); } }
/// <summary> /// Function used in the thread. /// </summary> private void FctThreadWorker() { IsRunning = true; while (IsRunning == true) { // check if a task have been transmitted by the dispacher if (TaskToDo != null) { string fileName = TaskToDo.Name; try { Global.Log.WriteEvent(LogType.normal, string.Format("[{0}] Start of task '{1}'", _threadWorker.Name, TaskToDo.Name)); switch (TaskToDo.Type) { case TypeSpooledObject.standardMail: case TypeSpooledObject.scheduledMail: { Object message = Activator.CreateInstance(Global.ActiveCommonAsm.GetType("ActiveUp.Net.Mail.Message", true)); message = TaskToDo.Object; /*message.GetType().GetProperty("Subject").SetValue(message,string.Format("TEST MAIL : {0}",_threadWorker.Name),null); * Global.ActiveMailAsm.GetType("ActiveUp.Mail.Smtp.SmtpClient").GetMethod("Send",new Type[] {Global.ActiveMailAsm.GetType("ActiveUp.Mail.Common.Message",true), Type.GetType("System.String")}).Invoke(null,new object[] {message,"mail.activeup.com"});*/ bool sentOK = true; if ((int)Global.SmtpServers.GetType().GetProperty("Count").GetValue(Global.SmtpServers, null) > 0) { sentOK = (bool)Global.ActiveSmtpAsm.GetType("ActiveUp.Net.Mail.SmtpClient").GetMethod("Send", new Type[] { Global.ActiveCommonAsm.GetType("ActiveUp.Net.Mail.Message", true), Global.ActiveCommonAsm.GetType("ActiveUp.Net.Mail.ServerCollection", true) }).Invoke(null, new object[] { message, Global.SmtpServers }); } else { //Global.ActiveMailAsm.GetType("ActiveUp.Net.Mail.SmtpClient").GetMethod("Send", new Type[] { Global.ActiveMailAsm.GetType("ActiveUp.Net.Mail.Message", true) }).Invoke(null, new object[] { message }); Global.ActiveSmtpAsm.GetType("ActiveUp.Net.Mail.SmtpClient").GetMethod("DirectSend", new Type[] { Global.ActiveCommonAsm.GetType("ActiveUp.Net.Mail.Message", true) }).Invoke(null, new object[] { message }); } switch (TaskToDo.Type) { case TypeSpooledObject.standardMail: { QueueStandard.Remove(TaskToDo.Name); ActiveQLibrary.Form.ManageForm.RemoveElemStandardQueue(TaskToDo.Name); } break; case TypeSpooledObject.scheduledMail: { QueueScheduled.Remove(TaskToDo.Name); ActiveQLibrary.Form.ManageForm.RemoveElemScheduledQueue(TaskToDo.Name); } break; } /*ActiveQLibrary.Form.ManageForm.Form.PProgress.NewValueProgressBar(_threadWorker.Name,0); * Thread.Sleep(2000); * ActiveQLibrary.Form.ManageForm.Form.PProgress.NewValueProgressBar(_threadWorker.Name,20); * Thread.Sleep(2000); * ActiveQLibrary.Form.ManageForm.Form.PProgress.NewValueProgressBar(_threadWorker.Name,40); * Thread.Sleep(2000); * ActiveQLibrary.Form.ManageForm.Form.PProgress.NewValueProgressBar(_threadWorker.Name,60); * Thread.Sleep(2000); * ActiveQLibrary.Form.ManageForm.Form.PProgress.NewValueProgressBar(_threadWorker.Name,80); * Thread.Sleep(2000); * ActiveQLibrary.Form.ManageForm.Form.PProgress.NewValueProgressBar(_threadWorker.Name,100); * Thread.Sleep(2000);*/ if (sentOK == false) { Global.Log.WriteError(string.Format("[{0}:{1}] An error occurs when sending mail.", _threadWorker.Name, fileName)); Global.MoveFileToError(TaskToDo.Name, string.Format("{0}", _threadWorker.Name)); } else if (Global.ConfigValue.DeleteMailWhenProcessed == true) { File.Delete(TaskToDo.Name); } else { Global.MoveFileToProcessed(TaskToDo.Name, string.Format("{0}", _threadWorker.Name)); } } break; case TypeSpooledObject.scheduledTask: { Task task = (Task)TaskToDo.Object; switch (task.Method.ToLower().ToString()) { case "post": { POST(task.Address); } break; case "get": { GET(task.Address); } break; case "file": { Process newProcess = new Process(); newProcess.StartInfo.FileName = task.Address; newProcess.Start(); } break; } DateTime nextExecution = task.GetNextTriggered(); ActiveQLibrary.Form.ManageForm.RemoveElemScheduledTask(TaskToDo.Name); if (nextExecution == DateTime.MinValue) { QueueScheduled.Remove(TaskToDo.Name); ActiveQLibrary.Form.ManageForm.RemoveElemScheduledTask(TaskToDo.Name); Global.Log.WriteEvent(LogType.debug, string.Format("[{0}] '{1}' no more exectution, deleting", _threadWorker.Name, TaskToDo.Name, nextExecution)); } else { QueueScheduled.ModifySendingDate(TaskToDo.Name, nextExecution); QueueScheduled.ModifyState(TaskToDo.Name, StateSpooledObject.queued); Global.Log.WriteEvent(LogType.debug, string.Format("[{0}] '{1}' next sending date '{2}'", _threadWorker.Name, TaskToDo.Name, nextExecution)); } } break; } //Thread.Sleep(100000); Global.Log.WriteEvent(LogType.normal, string.Format("[{0}] End of task '{1}'", _threadWorker.Name, TaskToDo.Name)); Thread.Sleep(200); // the task is ended, set the TaskToDo to null to indicates to the dispacher that it's free for a new task TaskToDo = null; } catch (ThreadAbortException) { } catch (Exception ex) { Global.Log.WriteError(string.Format("[{0}:{1}] {2}", _threadWorker.Name, fileName, ex.Message)); Global.Log.WriteError(string.Format("[{0}:{1}] {2}", _threadWorker.Name, fileName, ex.StackTrace)); if (ex.InnerException != null) { Global.Log.WriteError(string.Format("[{0}:{1}] {2}", _threadWorker.Name, fileName, ex.InnerException.Message)); Global.Log.WriteError(string.Format("[{0}:{1}] {2}", _threadWorker.Name, fileName, ex.InnerException.StackTrace)); } if (TaskToDo.Type != TypeSpooledObject.scheduledTask) { Global.MoveFileToError(TaskToDo.Name, string.Format("{0}", _threadWorker.Name)); if (TaskToDo.Type == TypeSpooledObject.standardMail) { QueueStandard.Remove(TaskToDo.Name); } else if (TaskToDo.Type == TypeSpooledObject.scheduledMail) { QueueScheduled.Remove(TaskToDo.Name); } } TaskToDo = null; } } Thread.Sleep(100); } }