private IEnumerable <RuleEvaluationRequest> GetNextRequests(
            IEvaluationRequestsService evaluationRequestsService, int fileSizeConfig, int maxFileSizeCount)
        {
            _logger.Info("GetNextRequests Start");
            var ruleEvaluationRequests = new List <RuleEvaluationRequest>();

            List <EvaluationRequest> pendingRequests = evaluationRequestsService.GetNextRequests(fileSizeConfig, maxFileSizeCount).ToList();

            foreach (var pendingRequest in pendingRequests)
            {
                ruleEvaluationRequests.Add(new RuleEvaluationRequest()
                {
                    Id                 = pendingRequest.Id,
                    Year               = pendingRequest.TaxAppYear,
                    ReturnType         = pendingRequest.ReturnType,
                    SchemaType         = pendingRequest.SchemaType,
                    Locator            = pendingRequest.Locator,
                    Jurisdiction       = pendingRequest.Jurisdiction,
                    DocumentToEvaluate = pendingRequest.DocumentToEvaluate,
                    FileSize           = pendingRequest.FileSize
                });
            }

            _logger.Info("GetNextRequests End");
            return(ruleEvaluationRequests);
        }
 public RuleEvaluationRequestsDatabaseProducer(IEvaluationRequestsService evaluationRequestsService, BlockingCollection <RuleEvaluationRequest> workQueue, Func <IEvaluationRequestsService> evaluationRequestsServiceFactory /*, ILoggerFactory loggerFactory*/, WorkQueueCounter counter, PerformanceMetricsCollector performanceMetricsCollector)
 {
     //_logger = loggerFactory.GetLogger("RuleEngine_WindowsService");
     //_context = new TrmrLogContext("RuleEngine_WindowsService");
     this._workQueue = workQueue;
     this._evaluationRequestsServiceFactory = evaluationRequestsServiceFactory;
     this._counter     = counter;
     _metricsCollector = performanceMetricsCollector;
     InitializeCapacityThresholds();
 }
        public void CreatePendingRequests()
        {
            //_context.StartEventLog("CreatePendingRequests start");
            _logger.Info("CreatePendingRequests");
            float avgCpu       = _metricsCollector.Cpu;
            float commitCharge = _metricsCollector.PercentCommitCharge;


            if ((!this.CancelToken.IsCancellationRequested) && (avgCpu < _cpuUsageThreshold) && (commitCharge < _memoryUsageThreshold) && (_counter.count < _workQueue.BoundedCapacity))
            {
                IEvaluationRequestsService evaluationRequestsService = this._evaluationRequestsServiceFactory();
                try
                {
                    IEnumerable <RuleEvaluationRequest> pendingRequests = GetNextRequests(evaluationRequestsService, fileSizeConfig, maxFileSizeCount);

                    foreach (RuleEvaluationRequest request in pendingRequests)
                    {
                        bool added = _workQueue.TryAdd(request, timeOut, CancelToken);
                        if (added)
                        {
                            _counter.count++;
                        }
                    }
                }
                catch (Exception e)
                {
                    _logger.Error("Error in CreatePendingRequests", e);
                }
                finally
                {
                    //TODO Verify this code if needed
                    if (this.CancelToken.IsCancellationRequested)
                    {
                        foreach (var request in _workQueue.GetConsumingEnumerable())
                        {
                            evaluationRequestsService.UpdateRequestStatusToInPending(request.Id, RequestStatusConstants.PENDING, string.Empty);
                        }
                    }
                }
            }
        }
        public void ProcessRequests()
        {
            //_context.StartEventLog("ProcessRequests start");
            _logger.Info("ProcessRequests");
            while (!CancelToken.IsCancellationRequested)
            {
                try
                {
                    RuleEvaluationRequest nextRequest = new RuleEvaluationRequest()
                    {
                        Id                 = 43888,
                        Year               = "2015",
                        ReturnType         = "1120",
                        Locator            = "CTEST075",
                        SchemaType         = "Jurisdiction",
                        DocumentToEvaluate = "9ca715b2-c923-4ede-8f95-619f96e91117-CTEST075.xil",
                        Jurisdiction       = "Illinois"
                    };

                    //this.sem.WaitOne();

                    //Task newTask = Task.Run(() =>
                    //{
                    IEvaluationRequestsService evaluationRequestService = this._evaluationRequestsServiceFactory();
                    try
                    {
                        _logger.Info(String.Format("Processing RequestId {0} - Start", nextRequest.Id));

                        evaluationRequestService.UpdateRequestStatus(nextRequest.Id, RequestStatusConstants.IN_PROGRESS);
                        IRuleLogicExecutionService <EFileDocument> newService = _logicExecutionServiceFactory();

                        Stopwatch sw = Stopwatch.StartNew();

                        _logger.Info(String.Format("Start ExecuteRules for RequestId {0}", nextRequest.Id));
                        newService.ExecuteRules(nextRequest, _processor);
                        sw.Stop();
                        _logger.Info(String.Format("End ExecuteRules for RequestId {0} - Time  {1:0.00}s", nextRequest.Id, sw.ElapsedMilliseconds / 1000));

                        evaluationRequestService.UpdateRequestStatus(nextRequest.Id, RequestStatusConstants.COMPLETED);
                        _logger.Info(String.Format("Processing RequestId {0} - End", nextRequest.Id));
                    }
                    catch (Exception ex)
                    {
                        _logger.Error(string.Format("Error Processing RequestId {0}", nextRequest.Id), ex);
                        evaluationRequestService.UpdateRequestStatus(nextRequest.Id, RequestStatusConstants.FAILED);
                    }
                    finally
                    {
                        _counter.count--;
                        sem.Release();
                    }
                    //});
                    //_allTasks.Add(newTask);

                    //newTask.ContinueWith(
                    //    t => { _allTasks.Remove(t); }, CancelToken
                    //);
                }
                catch (OperationCanceledException e)
                {
                    _logger.Error("Operation was cancelled.", e);
                }
            }
            Task.WaitAll(_allTasks.Where(t => t.Status != TaskStatus.RanToCompletion).ToArray());
            this.sem.Dispose();
            //_context.EndEventLog();
        }