项目

单层解决方案:后台工作器

后台工作器是在应用程序后台持续运行的进程。它们适用于非即时性任务,例如数据处理、发送通知或监控系统健康状况。后台工作器通常在应用启动时开始运行,并持续工作直至应用停止。更多相关信息,可查阅后台工作器文档。

简单来说,您可以根据需求创建定时工作器,比如检查非活跃用户状态,若用户超过30天未登录应用,则将其状态更改为“未激活”。

public class PassiveUserCheckerWorker : AsyncPeriodicBackgroundWorkerBase
{
    public PassiveUserCheckerWorker(
            AbpAsyncTimer timer,
            IServiceScopeFactory serviceScopeFactory) : base(
            timer, 
            serviceScopeFactory)
    {
        Timer.Period = 600000; // 10分钟
    }

    protected async override Task DoWorkAsync(
        PeriodicBackgroundWorkerContext workerContext)
    {
        Logger.LogInformation("开始:设置非活跃用户状态...");

        // 解析依赖项
        var userRepository = workerContext
            .ServiceProvider
            .GetRequiredService<IUserRepository>();

        // 执行工作
        await userRepository.UpdateInactiveUserStatusesAsync();

        Logger.LogInformation("完成:设置非活跃用户状态...");
    }
}

创建工作器后,还需在应用中注册它。您可以在模块类的 OnApplicationInitializationAsync 方法中注册工作器:

public class BookstoreModule : AbpModule
{
    public override async Task OnApplicationInitializationAsync(ApplicationInitializationContext context)
    {
        await context.AddBackgroundWorkerAsync<PassiveUserCheckerWorker>();
    }
}

在分布式系统中扩展应用程序时,必须注意同一后台工作器可能在多个服务实例上同时运行,这需要仔细管理潜在的副作用。例如,若要从队列中处理消息,需确保每条消息仅被处理一次。为避免多个实例处理同一消息,可以使用分布式锁


在本文档中