using Rhea.Common; using Rhea.Common.Interface; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using Tiger.IBusiness; namespace Tiger.Business { /// /// 事务监控线程 /// public class TransactionMonitor : ITigerMonitor { #region Variables private WhileThread TransactionMonitorThread; #endregion #region Propertys public string Id { get; set; } = Guid.NewGuid().ToString("N"); public string Tag { get; set; } = "WMSTransactionMonitor"; public string Name { get; set; } = "WMSTransactionMonitor"; public bool IsRunning { get; set; } #endregion #region Functions public void Start() { try { TransactionMonitorThread = new(TransactionMonitoring); TransactionMonitorThread.Start(); Logger.Default.Info("Start Transaction Monitoring Thread"); } catch (System.Exception ex) { Logger.Console.Fatal(ex, "Start Transaction Monitoring Thread Exception"); } } public void Stop() { try { TransactionMonitorThread?.Stop(); Logger.Console.Info("Stop Transaction Monitoring Thread"); } catch (System.Exception ex) { Logger.Console.Fatal(ex, "Stop Transaction Monitoring Thread Exception"); } } private void TransactionMonitoring() { //Logger.Console.Info("Exec Transaction Monitoring Action"); //定时删除超时的Transaction try { var timeOutTrans = BizContext.TransactionDic.Where(q => (DateTime.Now - q.Value.LastActionTime).TotalHours > ApiConfig.Transaction_TimeoutHours || q.Value.IsFinished).Select(q => q.Key); if (timeOutTrans.Count() > 0) { foreach (var key in timeOutTrans) { try { BizContext.TransactionDic[key].Close(); } catch (System.Exception ex) { Logger.Console.Fatal(ex, $"删除超时的Transaction[{key}]({BizContext.TransactionDic[key].GetType().FullName})异常"); } } } } catch (System.Exception ex) { Logger.Console.Fatal(ex, "事务监控线程异常"); } //休眠10分钟 Thread.Sleep(10 * 60 * 1000); } #endregion } }