Abp中使用Hangfire实现定时任务

有时我们需要写一些定时任务来定期执行某些方法,比如数据统计、数据计算等。

这时候,我们就需要用到定时任务。

Hangfire 是一个开源且商业免费使用的工具函数库。可以让你非常容易地在应用中执行多种类型的后台任务,而无需自行定制开发和管理基于 Windows Service 后台任务执行器。且任务信息可以被持久保存。内置提供集成化的控制台。

下面我们看看怎么用。

使用Hangfire,有两个库,1个事hangfire 库,一个是用来存储的库。默认hangfire的存储库是使用sqlserver,但很多企业使用的是mysql,所以需要另外安装基于mysql的存储库。

此处,为了便于显示,我们使用的是基于内存的存储库。

因为是使用abp框架,我们安装abp封装的hangfire框架。

从nuget引入:Volo.Abp.BackgroundJobs.HangFire

 再引入基于内容的存储库:Hangfire.MemoryStorage

 

Hangfire.MemoryStorage不是abp封装的,所以可能会存在里面引用的Hangfire.Core 版本和Volo.Abp.BackgroundJobs.HangFire不一致的问题。只需要再引用Hangfire.Core,二者最高的版本即可。

比如我这边的版本就是下图:

 

引入完之后,在项目的module.cs 文件中进行配置

先把abp的hangfire模块依赖引入: 

 typeof(AbpBackgroundJobsHangfireModule) //Add the new module dependency

然后再 public override void ConfigureServices(ServiceConfigurationContext context)方法中进行配置

  context.Services.AddHangfire(config => {

                // config.UseStorage(new MySqlStorage("server=127.0.0.1;database=patent;uid=root;pwd=WWW.1633.com;charset=utf8mb4;Allow User Variables=true;"));
                config.UseMemoryStorage();

            });

 

在引用初始化方法中执行

   public override void OnApplicationInitialization(ApplicationInitializationContext context)

   app.UseHangfireDashboard("/hangfire"); //启用hangfire面板
            app.UseHangfireServer();

这样就启用了hangfire服务,并可以通过/hangfire查看任务执行情况

接下来就是怎么调用执行我们的服务了

我们定义一个工作类

    public class JobForDaiLiShiCase :  ITransientDependency
    {
        public ITongJiDaiLiShiCaseService _tongJiDaiLiShiCaseService { get; set; }

      
        public async Task Run()
        {
            Console.WriteLine(DateTime.Now.ToString("HH:mm:ss"));
           // await _tongJiDaiLiShiCaseService.TongJiAsync();
        }
    }

记得要注入依赖,这边注入一个ITransientDependency类型

我们定义了一个Run方法,输出时间

然后,我们同样在 项目的 .module.cs文件中去调用任务

 app.UseHangfireDashboard("/hangfire"); //启用hangfire面板
            app.UseHangfireServer();
           

           
            // 创建每1分钟调用一次的定时任务
            RecurringJob.AddOrUpdate<JobForDaiLiShiCase>(x => x.Run(), "0/2 * * * * ?");

就是利用RecurringJob进行工作任务调用。执行了run方法,并配置执行周期,采用cron表达式。 这边的表达式是2秒。

我们运行看下输出效果。

 运行后,程序自动定期执行了。

 

但是,我们发现了一个问题,我们配置的是每隔2秒,为什么显示的是好几秒。

这就是执行速度差异的问题了。

当我们时间配置的很短的时候,是会出现差异的,但是执行次数不会变。一般我们也不建议配置这么短的时间。

至少都要几分钟以上的。还要根据任务执行的时间和资源情况来合理的制定这个执行周期。

这样,hangfire就介绍完成了。

 

如果我们换成mysql存储呢,我引用的是Hangfire.MySqlStorage 这个组件

 

只要将存储配置改下即可。

 context.Services.AddHangfire(config => {

                // config.UseStorage(new MySqlStorage("server=127.0.0.1;database=patent;uid=root;pwd=WWW.1633.com;charset=utf8mb4;Allow User Variables=true;"));
                //  config.UseMemoryStorage();
                config.UseStorage(new MySqlStorage("server=127.0.0.1;database=patent;uid=root;pwd=23234;charset=utf8mb4;Allow User Variables=true;", new MySqlStorageOptions() { }));

            });

 我们可以访问/hangfire 查看任务执行情况

 

 

更多分享,请大家关注我的个人公众号:

 

posted @ 2023-08-05 14:10  黄明辉  阅读(1025)  评论(0编辑  收藏  举报