后台作业
- 为执行长时间运行的任务而用户无需等待, 例如:用户按了一下”报告”按钮开始一个长时间运行的报告任务, 你把这个任务添加到队列里,并在完成后通过电子邮件将报告的结果发送给你的用户.
- 创建可重试和持久的任务以确保代码将成功执行. 例如, 你可以在后台作业中发送电子邮件以克服临时故障并保证最终发送. 这样用户不需要在发送电子邮件时等待.
后台作业是持久性的这意味着即使你的应用程序崩溃了, 后台作业也会在稍后重试并执行.
ABP为后台作业提供了一个抽象模块和几个后台作业实现. 它具有内置/默认的实现以及与Hangfire和RabbitMQ的集成.
ABP为后台作业提供了一个 抽象 模块和 多个实现. 它有一个内置/默认实现以及Hangfire,RabbitMQ与Quartz集成.
nuget package 提供了创建后台作业和队列作业所需要的服务. 如果你的模块只依赖这个包,那么它可以独立于其实现/集成.
后台作业是一个实现IBackgroundJob<TArgs>
接口或继承自BackgroundJob<TArgs>
类的类.TArgs
是一个简单的C#类, 用于存储作业数据.
在示例中使用后台作业发送电子邮件,首先定义一个类来存储后台作业的参数
这个作业简单的使用了 IEmailSender
发送电子邮件 (请参阅 邮件发送文档).
异常处理
后台作业不应该隐藏异常. 如果它抛出一个异常, 在稍后后台作业将会自动重试. 只有在你不想为当前参数重新运行后台作业时才隐藏异常.
现在, 你可以使用 服务向队列中添加一个发送电子邮件作业:
刚才我们注入 IBackgroundJobManager
服务了并且使用它的 EnqueueAsync
方法添加一个新的作业到队列中.
Enqueue方法接收一些可选参数用于控制后台作业:
- priority 用于控制作业项的优先级. 它接收一个
BackgroundJobPriority
类型的枚举,它有Low
,BelowNormal
,Normal
(默认), 和Hight
字段. - delay 用于作业第一次重试之前的等待时间 (
TimeSpan
)类型.
你可能希望在你的应用程序中禁用后台作业执行. 如果你希望在另一个进程中执行后台作业并在当前进程中禁用它,通常可以使用以下命令.
使用 AbpBackgroundJobOptions
配置作业执行:
ABP framework 包含一个简单的 IBackgroundJobManager
实现;
- 重试作业执行直到作业执行成功或超时. 默认作业超时时间是2天. 记录所有异常 .
- 作业执行成功时从存储中(数据库)删除作业. 如果超时, 作业会在数据库中被设置为abandoned.
- 作业的重试等待时间会越来越长. 作业第一次重试等待1分钟, 第二次重试等待2分钟, 第三次重试等待4分钟,以此类推.
- 以固定的时间间隔轮询存储中的作业. 查询作业, 按优先级排序(asc)然后按尝试次数排序(asc).
在你的模块类中使用 AbpBackgroundJobWorkerOptions
配置默认作业管理器. 示例中更改后台作业的的超时时间:
默认的后台作业管理器需要数据存储用来保存和读取作业. 它将 定义为抽象的. 所以, 如果你想要的话你可以替换它的实现.
后台作业模块使用各种数据访问提供程序实现 IBackgroundJobStore
. 参阅 .
后台作业系统是可扩展的,你可以使用自己的实现或预先构建的集成更改默认后台作业管理器.