Przeglądaj źródła

1、注释锁过期机制
2、补充上一个需求记录的增加定时任务

MY 1 dzień temu
rodzic
commit
a02a574103

+ 67 - 0
JLHHJSvr/GlobalVar/GlobalVar.cs

@@ -17,6 +17,8 @@ using JLHHJSvr.Excutor.APP;
 using JLHHJSvr.LJLib.HttpServer;
 using LJLib;
 using LJLib.TextLog;
+using JLHHJSvr.Tools;
+using JLHHJSvr.Helper;
 
 namespace JLHHJSvr
 {
@@ -277,6 +279,71 @@ namespace JLHHJSvr
             }
         }
 
+        /// <summary>
+        /// 定时任务
+        /// </summary>
+        public static void StartTimer()
+        {
+            var manager = new DailySchedulerManager();
+            manager.AddTask("ClearExpireLock", new TimeSpan(2, 0, 0),() => ClearExpireLock());
+            manager.AddTask("ClearOldLogs", new TimeSpan(2, 0, 0),() => CleanupOldLogs());
+        }
+        /// <summary>
+        /// 清理7天前的请求日志文件
+        /// </summary>
+        public static void CleanupOldLogs()
+        {
+            try
+            {
+                var files = Directory.GetFiles(Path.Combine(App_Data, "log"), "REQUEST_*.log");
+                DateTime threshold = DateTime.Now.AddDays(-7);
+
+                foreach (var file in files)
+                {
+                    string fileName = Path.GetFileNameWithoutExtension(file);
+                    // 格式: REQUEST_yyyyMMdd
+                    if (fileName.Length == "REQUEST_yyyyMMdd".Length &&
+                        DateTime.TryParseExact(fileName.Replace("REQUEST_", ""),
+                                               "yyyyMMdd",
+                                               null,
+                                               System.Globalization.DateTimeStyles.None,
+                                               out DateTime logDate))
+                    {
+                        if (logDate < threshold.Date)
+                        {
+                            File.Delete(file);
+                        }
+                    }
+                }
+            }
+            catch(Exception ex)
+            {
+                Trace.Write(ex);
+            }
+        }
+        /// <summary>
+        /// 清理过期锁
+        /// </summary>
+        public static void ClearExpireLock()
+        {
+            using (SqlConnection con = new SqlConnection(GlobalVar.ConnectionString))
+            using (SqlCommand cmd = con.CreateCommand())
+            {
+                con.Open();
+                using (cmd.Transaction = con.BeginTransaction())
+                {
+                    try
+                    {
+                        LockHelper.ClearExpireLock(cmd);
+                        cmd.Transaction.Commit();
+                    }
+                    catch (Exception e)
+                    {
+                        cmd.Transaction?.Rollback();
+                    }
+                }
+            }
+        }
 
         public static string ConnectionString { get; set; }
 

+ 6 - 6
JLHHJSvr/Helper/LockHelper.cs

@@ -160,7 +160,7 @@ namespace JLHHJSvr.Helper
                 arg_msg = item.log_msg;
                 return true;
             }
-            return !(item.Code == LockCheckResultCode.Success || item.Code == LockCheckResultCode.LockedBySelf);
+            return !(item.Code == LockCheckResultCode.Success || item.Code == LockCheckResultCode.LockedBySelf || item.Code == LockCheckResultCode.Expired);
         }
         /// <summary>
         /// DFS方式检查单据及依赖链上的锁
@@ -181,11 +181,11 @@ namespace JLHHJSvr.Helper
                 new Dictionary<string, object> { { "@keyword", keyword }, { "@billid", billid } },
                 mainLock, "keyword,billid,billcode,opemp,is_locked,lock_time,expire_time");
 
-            if (mainLock.expire_time < DateTime.Now)
-            { 
-                mainLock.Code = LockCheckResultCode.Expired;
-                return mainLock;
-            }
+            //if (mainLock.expire_time < DateTime.Now)
+            //{ 
+            //    mainLock.Code = LockCheckResultCode.Expired;
+            //    return mainLock;
+            //}
             if (mainLock.is_locked == 1)
             {
                 mainLock.Code = mainLock.opemp.Equals(opemp) ? LockCheckResultCode.LockedBySelf : LockCheckResultCode.LockedByOther;

+ 2 - 0
JLHHJSvr/JLHHJSvr.cs

@@ -94,6 +94,8 @@ namespace JLHHJSvr
                         Trace.Write("主侦听线程异常退出:" + ex.ToString());
                     }
                 });
+
+                GlobalVar.StartTimer();
             }
             catch (Exception ex)
             {

+ 1 - 0
JLHHJSvr/JLHHJSvr.csproj

@@ -642,6 +642,7 @@
     <Compile Include="Tools\CalculateFormula.cs" />
     <Compile Include="Tools\ListEx.cs" />
     <Compile Include="Tools\ObjectHelper.cs" />
+    <Compile Include="Tools\ScheduledTimeTask.cs" />
     <Compile Include="XML\XmlConfig.cs" />
     <EmbeddedResource Include="Form2.resx">
       <DependentUpon>Form2.cs</DependentUpon>

+ 68 - 0
JLHHJSvr/Tools/ScheduledTimeTask.cs

@@ -0,0 +1,68 @@
+using JLHHJSvr.LJException;
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Threading;
+
+namespace JLHHJSvr.Tools
+{
+    public class ScheduledTimeTask
+    {
+        public string Name { get; }
+        public TimeSpan RunAt { get; }
+        public Action TaskAction { get; }
+        private Timer _timer;
+
+        public ScheduledTimeTask(string name, TimeSpan runAt, Action action)
+        {
+            Name = name;
+            RunAt = runAt;
+            TaskAction = action;
+            ScheduleNext();
+        }
+
+        private void ScheduleNext()
+        {
+            var now = DateTime.Now;
+            var nextRun = DateTime.Today.Add(RunAt);
+            // 下一天执行
+            if (now > nextRun) nextRun = nextRun.AddDays(1);
+            var timeToGo = nextRun - now;
+            _timer = new Timer(_ =>
+            {
+                Trace.Write($"{Name}定时任务执行!!!");
+                TaskAction.Invoke();
+                ScheduleNext(); // 再次调度
+            }, null, timeToGo, Timeout.InfiniteTimeSpan);
+        }
+
+        public void Stop() => _timer?.Dispose();
+    }
+
+    public class DailySchedulerManager
+    {
+        private readonly Dictionary<string, ScheduledTimeTask> _tasks = new Dictionary<string, ScheduledTimeTask>();
+
+        public void AddTask(string name, TimeSpan runAt, Action action)
+        {
+            if (_tasks.ContainsKey(name)) throw new LJCommonException($"任务 \"{name}\" 已存在");
+            _tasks[name] = new ScheduledTimeTask(name, runAt, action);
+        }
+
+        public void RemoveTask(string name)
+        {
+            if (_tasks.TryGetValue(name, out var task))
+            {
+                task.Stop();
+                _tasks.Remove(name);
+            }
+        }
+
+        public void StopAll()
+        {
+            foreach (var task in _tasks.Values) task.Stop();
+            _tasks.Clear();
+        }
+    }
+
+}