Example #1
0
 public override void DeleteMessage(MessageInfo info)
 {
     telecom.DoAction(() => new FileInfo(Path.Combine(TaskInfo["path"], info.Name)).Delete());
 }
Example #2
0
 public virtual void DeleteMessage(MessageInfo message)
 {
 }
Example #3
0
 public override List <MessageData> GetMessageData(MessageInfo info)
 {
     return(telecom.DoAction(() => new List <MessageData> {
         new MessageData(info.Name, new FileInfo(Path.Combine(TaskInfo["path"], info.Name)).OpenRead())
     }));
 }
Example #4
0
 public abstract List <MessageData> GetMessageData(MessageInfo message);
Example #5
0
 public abstract void WriteMessage(MessageInfo messageInfo, List <MessageData> data);
Example #6
0
        public override bool Processing()
        {
            bool goToSleep = true;

            LoadTaskQueue();
            OnStart(readTask);
            using (var reader = CreateReadTelecom())
            {
                try
                {
                    foreach (var addr in reader.GetMessageList())
                    {
                        OnList(readTask);
                        worker.ShowActivity();

                        var taskId = GetTaskId(addr);

                        var taskInfo = taskQueue.GetValue(taskId, new TelecomTaskInfo(readTask.Get("RetryCount", 3)), true);
                        if (taskInfo.Status == TelecomTaskStatus.IgnoreRead || taskInfo.Status == TelecomTaskStatus.IgnoreWrite)
                        {
                            continue;
                        }
                        if (taskInfo.Status == TelecomTaskStatus.Delete)
                        {
                            try
                            {
                                reader.DeleteMessage(addr);
                                OnDelete(readTask, addr, taskInfo);
                                taskQueue.Remove(taskId);
                            }
                            catch (Exception ex) { if (worker.IsInterrupt(ex))
                                                   {
                                                       throw;
                                                   }
                            }
                            continue;
                        }
                        goToSleep = false;

                        List <MessageData> msg = null;
                        var writeMessageInfo   = new MessageInfo();
                        try
                        {
                            msg = reader.GetMessageData(addr);
                            OnRead(readTask, addr, msg, taskInfo);
                            if (msg == null || msg.Count == 0)
                            {
                                continue;                                //for no_attach_mail (повторное чтение не оч затратно, так как сообщение без attach)
                            }
                            if (taskInfo.Status == TelecomTaskStatus.Read)
                            {
                                taskInfo.Status     = TelecomTaskStatus.Write;
                                taskInfo.RetryCount = writeTask.Get("RetryCount", 3);
                            }

                            try
                            {
                                foreach (var m in msg)
                                {
                                    m.Name = writeTask.Get("name", "{Name}").FormatStrEx(new { Name = m.Name, Read = readTask, Address = addr, Write = writeTask });
                                }

                                foreach (var v in writeTask.Parameters)
                                {
                                    writeMessageInfo[v.Key] = v.Value.FormatStrEx(new { Read = readTask, Write = writeTask, Address = addr, Name = addr.Name });
                                }
                                writeMessageInfo.CreationTime = addr.CreationTime;
                                //
                                CreateWriteTelecom().WriteMessage(writeMessageInfo, msg);
                                OnWrite(readTask, addr, writeMessageInfo, msg, taskInfo);
                                taskInfo.Status = TelecomTaskStatus.Delete;
                                SaveTaskQueue(); //раньше сохранять статус не имеет смысла
                                                 //закрываем потоки для последующего удаления
                                ReleaseMessageData(msg);
                                msg = null;
                                //
                                try
                                {
                                    reader.DeleteMessage(addr);
                                    OnDelete(readTask, addr, taskInfo);
                                    taskQueue.Remove(taskId);
                                }
                                catch (Exception deleteEx)
                                {
                                    if (worker.IsInterrupt(deleteEx))
                                    {
                                        throw;
                                    }
                                    OnDeleteError(readTask, addr, taskInfo, deleteEx);
                                }
                            }
                            catch (Exception writeEx)
                            {
                                //if (IsInterrupt(writeEx) && Status == WinServiceManager.ServiceWorkerStatus.StopRequested && IsWorkingThread) throw;   //останавливается сервис, а не просто прерывается длительная операция

                                taskInfo.Status = (taskInfo.RetryCount--) < 1 ? TelecomTaskStatus.IgnoreWrite : TelecomTaskStatus.Write;
                                SaveTaskQueue();//safe
                                OnWriteError(readTask, addr, writeMessageInfo, msg, taskInfo, writeEx);

                                if (worker.IsInterrupt(writeEx))
                                {
                                    throw;
                                }
                            }
                        }
                        catch (Exception readEx)
                        {
                            // if (IsInterrupt(readEx) && Status == WinServiceManager.ServiceWorkerStatus.StopRequested && IsWorkingThread) throw;    //останавливается сервис, а не просто прерывается длительная операция

                            if (taskInfo.Status == TelecomTaskStatus.Read)
                            {
                                taskInfo.Status = (taskInfo.RetryCount--) < 1 ? TelecomTaskStatus.IgnoreRead : TelecomTaskStatus.Read;
                            }
                            SaveTaskQueue();//safe
                            OnReadError(readTask, addr, msg, taskInfo, readEx);

                            if (worker.IsInterrupt(readEx))
                            {
                                throw;
                            }
                        }
                        finally
                        {
                            ReleaseMessageData(msg);
                        }
                    }
                }
                catch (Exception listEx)
                {
                    if (worker.IsInterrupt(listEx))
                    {
                        throw;
                    }
                    OnListError(readTask, listEx);
                }
            }
            SaveTaskQueue();
            OnStop(readTask);
            return(goToSleep);
        }
Example #7
0
 protected virtual string GetTaskId(MessageInfo addr)
 {
     return("" + readTask + addr + "#" + writeTask);
 }
Example #8
0
 private string GetTempFileName(MessageInfo info)
 {
     return(TaskInfo["Host"] + "_" + TaskInfo["Port"] + "_" + TaskInfo["Path"].Replace("/", "_") + "_" + info.Name + "_" + info.CreationTime.ToString("yyyyMMddHHmmss"));
 }