项目

分层解决方案:后台工作者

后台工作者是运行在应用程序后台的长时间运行进程。它们非常适合处理非时间敏感的任务,例如处理数据、发送通知或监控系统健康状况。通常,后台工作者在应用程序启动时开始运行,并持续运行直到应用程序停止。更多信息,请参阅后台工作者文档。

基本上,您可以根据需要创建计划工作者,使其按特定的时间间隔运行。例如,您可以创建一个工作者来检查非活跃用户的登录状态,如果用户在最近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 BookstoreApplicationModule : AbpModule
{
    public override async Task OnApplicationInitializationAsync(ApplicationInitializationContext context)
    {
        await context.AddBackgroundWorkerAsync<PassiveUserCheckerWorker>();
    }
}

在分布式系统中横向扩展您的应用程序时,必须考虑到相同的后台工作者可能在服务的多个实例上运行。这需要仔细管理潜在的副作用。例如,如果您正在处理队列中的消息,则需要确保每条消息仅被处理一次。为了防止多个实例处理同一条消息,您可以使用分布式锁


在本文档中