From efd4cde4ce33dd4021f18601004e9607e8c29c51 Mon Sep 17 00:00:00 2001 From: Stuart Ferguson Date: Tue, 24 Feb 2026 13:53:25 +0000 Subject: [PATCH] Add error handling to pending transaction processor Wrapped pending transaction processing in a try-catch block to log exceptions and prevent the background service from crashing. This ensures the service continues running and retries processing in subsequent cycles, improving resilience. No changes were made to the transaction processing logic itself. --- TestHosts/TestHosts/Startup.cs | 84 ++++++++++++++++++---------------- 1 file changed, 45 insertions(+), 39 deletions(-) diff --git a/TestHosts/TestHosts/Startup.cs b/TestHosts/TestHosts/Startup.cs index 89e93f9..7ebe963 100644 --- a/TestHosts/TestHosts/Startup.cs +++ b/TestHosts/TestHosts/Startup.cs @@ -30,47 +30,53 @@ public PendingPrePaymentProcessor(IDbContextResolver resolver){ protected override async Task ExecuteAsync(CancellationToken stoppingToken){ while (stoppingToken.IsCancellationRequested == false){ - // TODO: may introduce a date filter - using ResolvedDbContext? resolvedContext = this.Resolver.Resolve("PataPawaReadModel"); - - var pendingTransactions = await resolvedContext.Context.Transactions.Where(t => t.IsPending).OrderBy(t => t.Date).ToListAsync(stoppingToken); - - if (pendingTransactions.Any()){ - // Process the pending transactions - foreach (Transaction pendingTransaction in pendingTransactions){ - - PrePayMeter meter = await resolvedContext.Context.PrePayMeters.SingleAsync(m => m.MeterNumber == pendingTransaction.MeterNumber, stoppingToken); - - pendingTransaction.Status = 0; - pendingTransaction.Messaage = "success"; - pendingTransaction.Vendor = "support"; - pendingTransaction.MeterNumber = meter.MeterNumber; - pendingTransaction.ResultCode = "elec000"; - pendingTransaction.StandardTokenAmt = 64; - pendingTransaction.StandardTokenTax = 0; - pendingTransaction.Units = 6.1m; - pendingTransaction.Token = Guid.NewGuid().ToString("N"); - pendingTransaction.StandardTokenRctNum = "Ce001OVS3709952"; - pendingTransaction.Date = DateTime.Now; - pendingTransaction.TotalAmount = 400; - pendingTransaction.Charges = new List{ - new TransactionCharge{ - ERCCharge = 3.19m, - ForexCharge = 0.47m, - FuelIndexCharge = 2.47m, - InflationAdjustment = 0, - MonthlyFC = 13.27m, - REPCharge = 1.39m, - TotalTax = 15.21m - } - }; - pendingTransaction.CustomerName = meter.CustomerName; - pendingTransaction.Reference = DateTime.Now.ToString("yyyyMMddhhmmsssfff"); - pendingTransaction.IsPending = false; - - await resolvedContext.Context.SaveChangesAsync(stoppingToken); + try { + // TODO: may introduce a date filter + using ResolvedDbContext? resolvedContext = this.Resolver.Resolve("PataPawaReadModel"); + + var pendingTransactions = await resolvedContext.Context.Transactions.Where(t => t.IsPending).OrderBy(t => t.Date).ToListAsync(stoppingToken); + + if (pendingTransactions.Any()) { + // Process the pending transactions + foreach (Transaction pendingTransaction in pendingTransactions) { + + PrePayMeter meter = await resolvedContext.Context.PrePayMeters.SingleAsync(m => m.MeterNumber == pendingTransaction.MeterNumber, stoppingToken); + + pendingTransaction.Status = 0; + pendingTransaction.Messaage = "success"; + pendingTransaction.Vendor = "support"; + pendingTransaction.MeterNumber = meter.MeterNumber; + pendingTransaction.ResultCode = "elec000"; + pendingTransaction.StandardTokenAmt = 64; + pendingTransaction.StandardTokenTax = 0; + pendingTransaction.Units = 6.1m; + pendingTransaction.Token = Guid.NewGuid().ToString("N"); + pendingTransaction.StandardTokenRctNum = "Ce001OVS3709952"; + pendingTransaction.Date = DateTime.Now; + pendingTransaction.TotalAmount = 400; + pendingTransaction.Charges = new List { + new TransactionCharge { + ERCCharge = 3.19m, + ForexCharge = 0.47m, + FuelIndexCharge = 2.47m, + InflationAdjustment = 0, + MonthlyFC = 13.27m, + REPCharge = 1.39m, + TotalTax = 15.21m + } + }; + pendingTransaction.CustomerName = meter.CustomerName; + pendingTransaction.Reference = DateTime.Now.ToString("yyyyMMddhhmmsssfff"); + pendingTransaction.IsPending = false; + + await resolvedContext.Context.SaveChangesAsync(stoppingToken); + } } } + catch (Exception ex) { + Logger.LogError("Error processing pending transactions", ex); + // Let the service contuine to run and attempt processing in the next cycle + } await Task.Delay(TimeSpan.FromMinutes(1),stoppingToken); }