public void Execute(IJobExecutionContext context)
        {
            Log.Information("Scanning database for completed get vouchers information requests");

            using (var lifetimeScope = component.BeginLifetimeScope())
            {
                using (var dipsDbContext = dbContext ?? lifetimeScope.Resolve <IDipsDbContext>())
                {
                    //Get all the potential requests that have been completed
                    var pendingRequests =
                        dipsDbContext.DipsRequest
                        .Where(q =>
                               !q.RequestCompleted.HasValue || !q.RequestCompleted.Value)
                        .ToList();

                    Log.Information("Found {0} completed get vouchers information requests", pendingRequests.Count);

                    foreach (var pendingRequest in pendingRequests)
                    {
                        Log.Debug("Creating Request for request {@guidName}", pendingRequest.guid_name);

                        //only commit the transaction if
                        // a) we were the first application to mark this request row as CorrectCodelineCompleted (DipsQueue uses optimistic concurrency)
                        // b) we were able to place a Request message on the bus
                        using (var tx = dipsDbContext.BeginTransaction())
                        {
                            try
                            {
                                //mark the line as completed
                                pendingRequest.RequestCompleted = true;

                                dipsDbContext.SaveChanges();

                                var requestNumber = pendingRequest.guid_name;

                                //get the record, generate and send the Request

                                var payload = JsonConvert.DeserializeObject <List <Criteria> >(pendingRequest.payload);

                                //Add the isReserved for balancing to Update criteria
                                //This is just to pass the isreservedforbalancing as true. could be dependent on the payload in future
                                var tmpCriteria = new Criteria();
                                tmpCriteria.name  = "voucherProcess.isReservedForBalancing";
                                tmpCriteria.value = "TRUE";
                                var tmpCriteriaArr = new Criteria[1];
                                tmpCriteriaArr[0] = tmpCriteria;

                                var requestRequest = new GetVouchersInformationRequest
                                {
                                    jobIdentifier        = pendingRequest.guid_name.Trim(),
                                    imageRequired        = ImageType.JPEG,
                                    imageResponseType    = ResponseType.MESSAGE,
                                    metadataResponseType = ResponseType.MESSAGE,
                                    searchCriteria       = payload.ToArray(),
                                    updateCriteria       = tmpCriteriaArr
                                };

                                if (adapterConfiguration.DeleteDatabaseRows)
                                {
                                    RequestHelper.CleanupRequestData(requestNumber, dipsDbContext);
                                }

                                Task.WaitAll(requestExchange.PublishAsync(requestRequest, pendingRequest.guid_name,
                                                                          "NSBD"));

                                tx.Commit();

                                Log.Debug(
                                    "get vouchers information request '{@guidName}' has been completed and a Request has been placed on the queue",
                                    pendingRequest.guid_name);
                                Log.Information("Batch '{@guidName}' Request sent: {@requestRequest}",
                                                pendingRequest.guid_name, requestRequest);
                            }
                            catch (OptimisticConcurrencyException)
                            {
                                //this is to handle the race condition where more than instance of this service is running at the same time and tries to update the row.

                                //basically ignore the message by loggin a warning and rolling back.
                                //if this row was not included by mistake (e.g. it should be included), it will just come in in the next request run.
                                Log.Warning(
                                    "Could not create a get vouchers information Request for request '{@guidName}' because the DIPS database row was updated by another connection",
                                    pendingRequest.guid_name);

                                tx.Rollback();
                            }
                            catch (Exception ex)
                            {
                                Log.Error(
                                    ex,
                                    "Could not complete and create a get vouchers information Request for request '{@guidName}'",
                                    pendingRequest.guid_name);
                                tx.Rollback();
                            }
                        }
                    }
                }
            }

            Log.Information("Finished processing completed get vouchers information requests");
        }
        public override void ExecuteJob()
        {
            Log.Information("Scanning database for completed get vouchers information requests");

            using (var dbConnection = new SqlConnection(Configuration.SqlConnectionString))
            {
                using (var dbContext = new DipsDbContext(dbConnection))
                {
                    //Get all the potential requests that have been completed
                    var pendingRequests =
                        dbContext.DipsRequest
                        .Where(q =>
                               !q.RequestCompleted.HasValue || !q.RequestCompleted.Value)
                        .ToList();

                    Log.Information("Found {0} completed get vouchers information requests", pendingRequests.Count());

                    foreach (var pendingRequest in pendingRequests)
                    {
                        Log.Debug("Creating Request for request {@guidName}", pendingRequest.guid_name);

                        //only commit the transaction if
                        // a) we were the first application to mark this request row as CorrectCodelineCompleted (DipsQueue uses optimistic concurrency)
                        // b) we were able to place a Request message on the bus
                        using (var tx = dbContext.BeginTransaction())
                        {
                            try
                            {
                                //mark the line as completed
                                pendingRequest.RequestCompleted = true;

                                dbContext.SaveChanges();

                                var requestNumber = pendingRequest.guid_name;

                                //get the record, generate and send the Request

                                var payload = JsonConvert.DeserializeObject <List <Criteria> >(pendingRequest.payload);

                                var requestRequest = new GetVouchersInformationRequest
                                {
                                    jobIdentifier        = pendingRequest.guid_name.Trim(),
                                    imageRequired        = ImageType.JPEG,
                                    imageResponseType    = ResponseType.MESSAGE,
                                    metadataResponseType = ResponseType.MESSAGE,
                                    searchCriteria       = payload.ToArray()
                                };

                                if (Configuration.DeleteDatabaseRows)
                                {
                                    RequestHelper.CleanupRequestData(requestNumber, dbContext);
                                }

                                Exchange.SendMessage(CustomJsonSerializer.MessageToBytes(requestRequest), "NSBD", pendingRequest.guid_name);

                                tx.Commit();

                                Log.Debug(
                                    "get vouchers information request '{@guidName}' has been completed and a Request has been placed on the queue",
                                    pendingRequest.guid_name);
                                Log.Information("Batch '{@guidName}' Request sent: {@requestRequest}",
                                                pendingRequest.guid_name, requestRequest);
                            }
                            catch (OptimisticConcurrencyException)
                            {
                                //this is to handle the race condition where more than instance of this service is running at the same time and tries to update the row.

                                //basically ignore the message by loggin a warning and rolling back.
                                //if this row was not included by mistake (e.g. it should be included), it will just come in in the next request run.
                                Log.Warning(
                                    "Could not create a get vouchers information Request for request '{@guidName}' because the DIPS database row was updated by another connection",
                                    pendingRequest.guid_name);

                                tx.Rollback();
                            }
                            catch (Exception ex)
                            {
                                Log.Error(
                                    ex,
                                    "Could not complete and create a get vouchers information Request for request '{@guidName}'",
                                    pendingRequest.guid_name);
                                tx.Rollback();
                            }
                        }
                    }
                }
            }
            Log.Information("Finished processing completed get vouchers information requests");
        }