예제 #1
0
		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 ();
			}
		}
예제 #2
0
        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);
            }
        }
예제 #3
0
        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();
            }
        }