using System; using System.Threading; using System.Threading.Tasks; using CellularManagement.Domain.Services; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; namespace CellularManagement.Infrastructure.Services; /// /// 密钥轮换后台服务 /// public sealed class KeyRotationBackgroundService : BackgroundService { private readonly IKeyRotationService _keyRotationService; private readonly ILogger _logger; private readonly TimeSpan _checkInterval; /// /// 构造函数 /// public KeyRotationBackgroundService( IKeyRotationService keyRotationService, ILogger logger) { _keyRotationService = keyRotationService; _logger = logger; _checkInterval = TimeSpan.FromHours(1); // 每小时检查一次 } /// protected override async Task ExecuteAsync(CancellationToken stoppingToken) { try { // 初始化密钥轮换服务 await _keyRotationService.InitializeAsync(); while (!stoppingToken.IsCancellationRequested) { try { // 检查是否需要轮换密钥 if (_keyRotationService.ShouldRotateKey()) { _logger.LogInformation("开始轮换密钥"); await _keyRotationService.RotateKeyAsync(); _logger.LogInformation("密钥轮换完成"); } } catch (Exception ex) { _logger.LogError(ex, "密钥轮换检查失败: {Message}", ex.Message); } // 等待下一次检查 await Task.Delay(_checkInterval, stoppingToken); } } catch (Exception ex) { _logger.LogError(ex, "密钥轮换后台服务失败: {Message}", ex.Message); throw; } } }