修正命名错误
xiyunfei authored at 2023-04-09 21:10:58
2.00 KiB
NewLife.JT808
using Microsoft.Extensions.Hosting;
using JT808.Data;
using Microsoft.Extensions.Hosting;
using NewLife;
using NewLife.Log;
using NewLife.Threading;

namespace JT808.Server.HostedServices;

/// <summary>数据过期清理服务</summary>
/// <remarks>
/// 定期清理过期位置数据、原始报文、报警数据,可配置保留天数。
/// </remarks>
public class DataRetentionService : IHostedService
{
    private TimerX? _timer;
    private Int32 _keepDays = 90;

    public Task StartAsync(CancellationToken cancellationToken)
    {
        // 每天凌晨 3 点执行一次
        var now = DateTime.Now;
        var first = now.Date.AddDays(1).AddHours(3) - now;
        _timer = new TimerX(DoClean, null, (Int32)first.TotalMilliseconds, 86_400_000) { Async = true };
        XTrace.WriteLine("数据过期清理服务已启动,保留 {0} 天", _keepDays);
        return Task.CompletedTask;
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        _timer.TryDispose();
        _timer = null;
        return Task.CompletedTask;
    }

    private void DoClean(Object? state)
    {
        try
        {
            var expire = DateTime.Now.AddDays(-_keepDays);
            XTrace.WriteLine("开始清理 {0} 之前的数据...", expire.ToString("yyyy-MM-dd"));

            // 清理过期位置数据
            var delPos = PositionData.Delete(PositionData._.CreateTime < expire);
            XTrace.WriteLine("清理位置数据:{0} 条", delPos);

            // 清理过期原始报文
            var delRaw = RawData.Delete(RawData._.CreateTime < expire);
            XTrace.WriteLine("清理原始报文:{0} 条", delRaw);

            // 清理过期报警
            var delAlarm = Alarm.Delete(Alarm._.CreateTime < expire);
            XTrace.WriteLine("清理报警数据:{0} 条", delAlarm);

            XTrace.WriteLine("数据清理完成");
        }
        catch (Exception ex)
        {
            XTrace.WriteLine("数据清理异常:{0}", ex.Message);
        }
    }
}