public override void DeleteMessage(MessageInfo info) { telecom.DoAction(() => new FileInfo(Path.Combine(TaskInfo["path"], info.Name)).Delete()); }
public virtual void DeleteMessage(MessageInfo message) { }
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()) })); }
public abstract List <MessageData> GetMessageData(MessageInfo message);
public abstract void WriteMessage(MessageInfo messageInfo, List <MessageData> data);
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); }
protected virtual string GetTaskId(MessageInfo addr) { return("" + readTask + addr + "#" + writeTask); }
private string GetTempFileName(MessageInfo info) { return(TaskInfo["Host"] + "_" + TaskInfo["Port"] + "_" + TaskInfo["Path"].Replace("/", "_") + "_" + info.Name + "_" + info.CreationTime.ToString("yyyyMMddHHmmss")); }