void Sender (object state) { SenderState senderState = state as SenderState; if (String.IsNullOrEmpty (senderState.CsDataDir)) { Log (LogSeverity.Error, "Need a data directory to work."); return; } if (!Directory.Exists (senderState.CsDataDir)) return; string filePath; senderState.Deserializer = new JsonDeserializer (); while (true) { filePath = GetNextWorkItem (senderState); if (filePath == null) break; var sws = new SenderWorkerState () { State = senderState, WorkItemPath = filePath }; Thread th = new Thread (_ => { SenderWorker (sws); }); th.IsBackground = true; th.Start (); } }
void SenderWorker(object state) { SenderWorkerState sws = state as SenderWorkerState; if (sws == null) { Log(LogSeverity.Error, "Internal error - SenderWorker got a null state."); return; } string filePath = sws.WorkItemPath; SenderState senderState = sws.State; JsonDeserializer des = senderState.Deserializer; try { string fileText = HttpUtility.UrlDecode(File.ReadAllText(filePath)); if (String.IsNullOrEmpty(fileText)) { Log(LogSeverity.Error, "Empty payload for item '{0}'", filePath); PutWorkItemBack(filePath, senderState); return; } if (!fileText.StartsWith("payload=", StringComparison.Ordinal)) { Log(LogSeverity.Error, "Invalid payload format for item '{0}'", filePath); PutWorkItemBack(filePath, senderState); return; } fileText = fileText.Substring(8); Push push = des.Deserialize <Push> (fileText); push.CHAuthID = senderState.CommitSourceID; Mailer mailer = new Mailer(); if (mailer.Send(push)) { try { File.Delete(filePath); } catch (Exception ex) { Log(LogSeverity.Warning, "Failed to delete work item '{0}', the mail message might be sent twice. Exception {1} was thrown: {2}", filePath, ex.GetType(), ex.Message); } try { CachingFetcher.RemoveCommitsFromCache(push.CHAuthID, push.Commits); } catch (Exception ex) { Log(ex, "Failed to clean up commit cache, some files may have been left behind. {2} ({1})"); } } else { Log(LogSeverity.Info, "Mail not sent."); PutWorkItemBack(filePath, senderState, (push.Commits == null || push.Commits.Count == 0)); } } catch (Exception ex) { Log(ex, "Attempt to send work item '{4}' failed. Exception {1} was thrown: {2}", Path.GetFileName(filePath)); PutWorkItemBack(filePath, senderState); } }
void Sender(object state) { SenderState senderState = state as SenderState; if (String.IsNullOrEmpty(senderState.CsDataDir)) { Log(LogSeverity.Error, "Need a data directory to work."); return; } if (!Directory.Exists(senderState.CsDataDir)) { return; } string filePath; senderState.Deserializer = new JsonDeserializer(); while (true) { filePath = GetNextWorkItem(senderState); if (filePath == null) { break; } var sws = new SenderWorkerState() { State = senderState, WorkItemPath = filePath }; Thread th = new Thread(_ => { SenderWorker(sws); }); th.IsBackground = true; th.Start(); } }