初步版本251204
This commit is contained in:
@@ -1,7 +1,4 @@
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using FATrace.Com;
|
||||
using FATrace.Com;
|
||||
using FATrace.Model;
|
||||
using NLog;
|
||||
|
||||
@@ -13,13 +10,23 @@ namespace FATrace.OEMApp.Services
|
||||
private CancellationTokenSource? _cts;
|
||||
private Task? _loopTask;
|
||||
private TimeSpan _runAt = new TimeSpan(2, 0, 0);
|
||||
private int _retentionDays = 365;
|
||||
|
||||
/// <summary>
|
||||
/// 文件暂存保存的天数
|
||||
/// </summary>
|
||||
private int FileRetentionDays = 365;
|
||||
private bool _enabled = true;
|
||||
|
||||
/// <summary>
|
||||
/// 数据库保存的信息天数
|
||||
/// </summary>
|
||||
private int DbRetentionDays = 180;
|
||||
public event Action<string>? Info;
|
||||
|
||||
public void Start()
|
||||
{
|
||||
FileRetentionDays=ConfigHelper.GetIntOrDefault("VideoFileSaveDay", 365);
|
||||
DbRetentionDays = ConfigHelper.GetIntOrDefault("DbSaveDay", 180);
|
||||
if (_cts != null) return;
|
||||
|
||||
try
|
||||
@@ -30,7 +37,6 @@ namespace FATrace.OEMApp.Services
|
||||
{
|
||||
_runAt = new TimeSpan(2, 0, 0);
|
||||
}
|
||||
_retentionDays = Math.Max(1, ConfigHelper.GetIntOrDefault("DataRetentionDays", 365));
|
||||
}
|
||||
catch { }
|
||||
|
||||
@@ -42,8 +48,8 @@ namespace FATrace.OEMApp.Services
|
||||
|
||||
_cts = new CancellationTokenSource();
|
||||
_loopTask = Task.Run(() => RunAsync(_cts.Token));
|
||||
_logger.Info("[TimeClear] 服务已启动,时间点={RunAt}, 保留天数={Days}", _runAt, _retentionDays);
|
||||
SafeInfo($"定时清理服务启动,时间点={_runAt}, 保留天数={_retentionDays}");
|
||||
_logger.Info("[TimeClear] 服务已启动,时间点={RunAt}, 文件保留天数={FileDays}, 数据库保留天数={DbDays}", _runAt, FileRetentionDays, DbRetentionDays);
|
||||
SafeInfo($"定时清理服务启动,时间点={_runAt}, 文件保留天数={FileRetentionDays}, 数据库保留天数={DbRetentionDays}");
|
||||
}
|
||||
|
||||
public void Stop()
|
||||
@@ -87,23 +93,62 @@ namespace FATrace.OEMApp.Services
|
||||
|
||||
private async Task CleanupOnceAsync(CancellationToken token)
|
||||
{
|
||||
var cutoff = DateTime.Now.AddDays(-_retentionDays);
|
||||
_logger.Info("[TimeClear] 开始清理,截止时间: {Cutoff}", cutoff);
|
||||
SafeInfo($"开始清理,截止时间: {cutoff:yyyy-MM-dd HH:mm:ss}");
|
||||
var fileCutoff = DateTime.Now.AddDays(-FileRetentionDays);
|
||||
var dbCutoff = DateTime.Now.AddDays(-DbRetentionDays);
|
||||
_logger.Info("[TimeClear] 开始清理,文件截止: {FileCutoff}, 数据库截止: {DbCutoff}", fileCutoff, dbCutoff);
|
||||
SafeInfo($"开始清理,文件截止: {fileCutoff:yyyy-MM-dd HH:mm:ss}, 数据库截止: {dbCutoff:yyyy-MM-dd HH:mm:ss}");
|
||||
|
||||
long delJf = 0, delDl = 0, delRaw = 0, delAct = 0, delDlFiles = 0;
|
||||
|
||||
long delJf = 0, delDl = 0, delRaw = 0, delAct = 0;
|
||||
try
|
||||
{
|
||||
delJf = FSqlContext.FDb.Delete<JellyfinMonitorTask>().Where(a => a.CreateTime < cutoff).ExecuteAffrows();
|
||||
var toDelFile = FSqlContext.FDb.Select<DownloadTask>()
|
||||
.Where(a => a.CreateTime < fileCutoff && a.VideoFilePath != null && a.VideoFilePath != "")
|
||||
.ToList();
|
||||
foreach (var t in toDelFile)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(t.VideoFilePath) && File.Exists(t.VideoFilePath))
|
||||
{
|
||||
File.Delete(t.VideoFilePath);
|
||||
delDlFiles++;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.Warn(ex, "[TimeClear] 删除 DownloadTask 文件失败: {Path}", t.VideoFilePath);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.Warn(ex, "[TimeClear] 清理 JellyfinMonitorTask 失败");
|
||||
_logger.Warn(ex, "[TimeClear] 扫描 DownloadTask 待删文件失败");
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
delDl = FSqlContext.FDb.Delete<DownloadTask>().Where(a => a.CreateTime < cutoff).ExecuteAffrows();
|
||||
var dbOld = FSqlContext.FDb.Select<DownloadTask>()
|
||||
.Where(a => a.CreateTime < dbCutoff)
|
||||
.ToList();
|
||||
foreach (var t in dbOld)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(t.VideoFilePath) && File.Exists(t.VideoFilePath))
|
||||
{
|
||||
File.Delete(t.VideoFilePath);
|
||||
delDlFiles++;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.Warn(ex, "[TimeClear] 删除 DownloadTask 文件失败(删库前): {Path}", t.VideoFilePath);
|
||||
}
|
||||
}
|
||||
delDl = FSqlContext.FDb.Delete<DownloadTask>()
|
||||
.Where(a => a.CreateTime < dbCutoff)
|
||||
.ExecuteAffrows();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -112,7 +157,16 @@ namespace FATrace.OEMApp.Services
|
||||
|
||||
try
|
||||
{
|
||||
delRaw = FSqlContext.FDb.Delete<OEMRawUse>().Where(a => a.CreateTime < cutoff).ExecuteAffrows();
|
||||
delJf = FSqlContext.FDb.Delete<JellyfinMonitorTask>().Where(a => a.CreateTime < dbCutoff).ExecuteAffrows();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.Warn(ex, "[TimeClear] 清理 JellyfinMonitorTask 失败");
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
delRaw = FSqlContext.FDb.Delete<OEMRawUse>().Where(a => a.CreateTime < dbCutoff).ExecuteAffrows();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -121,15 +175,15 @@ namespace FATrace.OEMApp.Services
|
||||
|
||||
try
|
||||
{
|
||||
delAct = FSqlContext.FDb.Delete<VideoAction>().Where(a => a.CreateTime < cutoff).ExecuteAffrows();
|
||||
delAct = FSqlContext.FDb.Delete<VideoAction>().Where(a => a.CreateTime < dbCutoff).ExecuteAffrows();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.Warn(ex, "[TimeClear] 清理 VideoAction 失败");
|
||||
}
|
||||
|
||||
_logger.Info("[TimeClear] 清理完成: JellyfinMonitorTask={Jf}, DownloadTask={Dl}, OEMRawUse={Raw}, VideoAction={Act}", delJf, delDl, delRaw, delAct);
|
||||
SafeInfo($"清理完成: Jf={delJf}, Dl={delDl}, Raw={delRaw}, Act={delAct}");
|
||||
_logger.Info("[TimeClear] 清理完成: JellyfinMonitorTask={Jf}, DownloadTask(删库)={Dl}, DownloadTask(删文件)={DlFiles}, OEMRawUse={Raw}, VideoAction={Act}", delJf, delDl, delDlFiles, delRaw, delAct);
|
||||
SafeInfo($"清理完成: Jf={delJf}, Dl(库)={delDl}, Dl(文件)={delDlFiles}, Raw={delRaw}, Act={delAct}");
|
||||
|
||||
await Task.CompletedTask;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user