后台工作者HangFire与ABP框架Abp.Hangfire及扩展 (2)

运行项目,输入路径<your-site>/hangfire然后就可以看到界面了。

image.png

#78a5ba1a7de2f58f96535972fb2db04c#


image.png


我们分别点击上面界面中的“加入队列”“立即执行按钮”,就得到下面这幅图片。

image.png


点击进去,可以看到如下图。

image.png


image.png

界面看起来很清爽,而且一目了然。这就是可视化界面的好处。

Abp.Hangfire

ASP.NET Boilerplate提供后台作业和后台工作者,用于在应用程序的后台线程中执行某些任务。
后台作业用于排队某些任务,以队列和持续的方式在后台执行。
我们可以通过从BackgroundJob <TArgs>类继承或直接实现IBackgroundJob <TArgs>接口来创建后台作业类。
这是最简单的后台工作:

public class TestJob : BackgroundJob<int>, ITransientDependency { public override void Execute(int number) { Logger.Debug(number.ToString()); } }

后台作业定义了一个Execute方法获取输入参数。参数类型被定义为泛型 类参数,如示例中所示。后台工作必须注册到依赖注入系统中,实现ITransientDependency是最简单的方式。下面定义一个更实际的工作,在后台队列中发送电子邮件:

public class SimpleSendEmailJob : BackgroundJob<SimpleSendEmailJobArgs>, ITransientDependency { private readonly IRepository<User, long> _userRepository; private readonly IEmailSender _emailSender; public SimpleSendEmailJob(IRepository<User, long> userRepository, IEmailSender emailSender) { _userRepository = userRepository; _emailSender = emailSender; } public override void Execute(SimpleSendEmailJobArgs args) { var senderUser = _userRepository.Get(args.SenderUserId); var targetUser = _userRepository.Get(args.TargetUserId); _emailSender.Send(senderUser.EmailAddress, targetUser.EmailAddress, args.Subject, args.Body); } }

我们注入了用户仓储(为了获得用户信息)和email发送者(发送邮件的服务),然后简单地发送了该邮件。SimpleSendEmailJobArgs是该工作的参数,它定义如下:

[Serializable] public class SimpleSendEmailJobArgs { public long SenderUserId { get; set; } public long TargetUserId { get; set; } public string Subject { get; set; } public string Body { get; set; } }

作业参数应该是可序列化的,因为它 被序列化并存储在数据库中。虽然ASP.NET Boilerplate默认后台作业管理器使用JSON 序列化(不需要[Serializable]属性),但最好定义[Serializable]属性,因为将来可能会切换到另一个作业管理器,在二进制序列化。保持你的参数简单(如 DTO),不要包含 实体或其他不可序列化的对象。如SimpleSendEmailJob示例所示,我们只能存储 一个实体的Id,并从作业中的存储库获取该实体。将新作业添加到队列中定义后台作业后,我们可以注入并使用IBackgroundJobManager 将作业添加到队列中。查看上面定义的TestJob示例:

public class MyService { private readonly IBackgroundJobManager _backgroundJobManager; public MyService(IBackgroundJobManager backgroundJobManager) { _backgroundJobManager = backgroundJobManager; } public void Test() { _backgroundJobManager.Enqueue<TestJob, int>(42); } }

当入队(Enqueue)时,我们将42作为参数传递。IBackgroundJobManager将会实例化并使用42作为参数执行TestJob。
让我们看一下如何为上面定义的SimpleSendEmailJob添加一个新的工作:

[AbpAuthorize] public class MyEmailAppService : ApplicationService, IMyEmailAppService { private readonly IBackgroundJobManager _backgroundJobManager; public MyEmailAppService(IBackgroundJobManager backgroundJobManager) { _backgroundJobManager = backgroundJobManager; } public async Task SendEmail(SendEmailInput input) { await _backgroundJobManager.EnqueueAsync<SimpleSendEmailJob, SimpleSendEmailJobArgs>( new SimpleSendEmailJobArgs { Subject = input.Subject, Body = input.Body, SenderUserId = AbpSession.GetUserId(), TargetUserId = input.TargetUserId }); } }

Enqueu(或EnqueueAsync)方法具有其他参数,如优先级 和延迟。

默认后台作业管理器

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wssxgy.html