private static void ProcessFinishEvents(CancellationToken token, EventsQueue queue, string queueName, Action <CiEvent> action, SleepTimeWrapper sleepTimeWrapper) { Log.Debug($"{queueName} task - started"); while (!token.IsCancellationRequested) { try { while (!queue.IsEmpty()) { var ciEvent = queue.Peek(); action(ciEvent); //remove item from _finishedEventsQueue queue.Dequeue(); sleepTimeWrapper.SleepTime = SleepTimeWrapper.DEFAULT_SLEEP_TIME; } } catch (Exception e) { ExceptionHelper.HandleExceptionAndRestartIfRequired(e, Log, "ProcessFinishEvents"); sleepTimeWrapper.SleepTime = sleepTimeWrapper.SleepTime * 2; if (sleepTimeWrapper.SleepTime > SleepTimeWrapper.MAX_SLEEP_TIME) { CiEvent ciEvent = queue.Dequeue(); Log.Error($"Build {ciEvent.BuildInfo} - Impossible to handle event in {queueName} queue. Event is removed from queue."); sleepTimeWrapper.SleepTime = SleepTimeWrapper.DEFAULT_SLEEP_TIME; } } Thread.Sleep(sleepTimeWrapper.SleepTime * 1000);//wait before next loop } Log.Debug($"{queueName} task - finished"); }
public void Start() { _generalEventsQueue = PluginManager.GetInstance().GeneralEventsQueue; _scmEventsQueue = PluginManager.GetInstance().ScmEventsQueue; _testResultsQueue = PluginManager.GetInstance().TestResultsQueue; _generalEventsThread = Task.Factory.StartNew(() => ProcessGeneralEvents(_cancellationToken.Token), TaskCreationOptions.LongRunning); _scmEventsThread = Task.Factory.StartNew(() => ProcessFinishEvents(_cancellationToken.Token, _scmEventsQueue, "ScmEvents", SendScmEvent, SleepTimeWrapper.Create()), TaskCreationOptions.LongRunning); _testResultsThread = Task.Factory.StartNew(() => ProcessFinishEvents(_cancellationToken.Token, _testResultsQueue, "TestResults", SendTestResults, SleepTimeWrapper.Create()), TaskCreationOptions.LongRunning); Log.Debug("QueuesManager - started"); }