首页 > 其他分享 >Abp中使用Hangfire实现定时任务

Abp中使用Hangfire实现定时任务

时间:2023-08-05 14:22:46浏览次数:37  
标签:abp Hangfire hangfire Abp 任务 定时 执行 public

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

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

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就介绍完成了。

 

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

 

标签:abp,Hangfire,hangfire,Abp,任务,定时,执行,public
From: https://www.cnblogs.com/fei686868/p/17607908.html

相关文章

  • abp-vnext-pro 实战(四,给客户表增加多租户)
    XXXHttpApiHostModule里面默认启用多租户publicoverridevoidOnApplicationInitialization(ApplicationInitializationContextcontext){varapp=context.GetApplicationBuilder();。。。if(MultiTenancyConst......
  • mof提权原理及其过程——类似定时任务里有一个添加用户的命令
    关于mof提权的原理其实很简单,就是利用了c:/windows/system32/wbem/mof/目录下的 nullevt.mof 文件,每分钟都会在一个特定的时间去执行一次的特性,来写入我们的cmd添加提权用户命令使其被带入执行。 mof提权的原理:mof是windows系统的一个文件(在c:/windows/system32/wbem/mof/nul......
  • 微信开发之定时发送朋友圈的技术实现
    请求URL:http://域名地址/snsSend请求方式:POST请求头Headers:Content-Type:application/jsonAuthorization:login接口返回 参数:参数名必选类型说明wId是String登录实例标识content是String文本内容groupUser否String对谁可见(传微信id,多个用,分隔)blackList否String对谁不可见(传微信id,......
  • 【OpenHarmony内核编程接口】介绍定时器管理两种定时器以及案例演示
    前言本文介绍了内核编程接口之软定时器软定时器软定时器含义软件定时器(Timer),是基于系统时钟tick且由软件来模拟的定时器,当经过设定的tick计数值后会触发用户定义的回调函数ps1:定时器触发函数的执行,不是线程ps2:当定时器到期时,将执行回调函数以运行特定的代码ps3:定时精度......
  • 在Volo.Abp微服务中使用SignalR
    假设需要通过SignalR发送消息通知,并在前端接收消息通知的功能创建SignalR服务在项目中引用abpadd-packageVolo.Abp.AspNetCore.SignalR在Module文件中添加对模块依赖[DependsOn(...typeof(AbpAspNetCoreSignalRModule))]publicclassIdentityApplication......
  • abp使用动态api客户端注意事项
    步骤按照官方的来就行API/DynamicCSharpAPIClients|DocumentationCenter|ABP.IO但有一点要注意,这也是官方文档没提及的,比如你在application这一层调用另一个项目的api客户端则要在application层的module里加上依赖,这个容易忘记。[DependsOn(typeof(Bank......
  • swoole-crontab基于swoole的定时器程序,支持秒级处理
    Swoole-Crontab(基于Swoole扩展)https://github.com/osgochina/Donkey1.概述基于swoole的定时器程序,支持秒级处理.异步多进程处理。完全兼容crontab语法,且支持秒的配置,可使用数组规定好精确操作时间单中心-多客户端模式,能够横向扩展web界面管理,增删改查任务,完整的权限控制.请使......
  • NodaTime生成指定时区的时间
    最近遇到需要进行时区转换和获取/生成指定时区时间的需求。但网上大部分例子都是通过UTC时间或者DateTime.NtcNow或DateTime.Now实现的。但如果和第三方对接会出现对方只提供当地非当前时间且没带时区,这时候这些例子都不太满足需求,所以研究了一下用NodaTime来解决这个问题。代码......
  • 使用cron来定时执行脚本的步骤
    创建一个脚本,比如:/opt/port_stats.sh,脚本内容:#!/bin/bash#设置要监控的端口列表ports=({80,8080,456})#执行一次循环forportin"${ports[@]}";do num=$(netstat-nat|grep":"$port|wc-l) echo"[$(date'+%Y-%m-%d%H:%M:%S')]$port$num"&......
  • 一种轻量级定时任务实现
    现在市面上有各式各样的分布式定时任务,每个都有其独特的特点,我们这边的项目因为一开始使用的是分布式开源调度框架TBSchedule,但是这个框架依赖ZK,由于ZK的不稳定性和项目老旧无人维护,导致我们的定时任务会偶发出现异常,比如:任务停止、任务项丢失、任务不执行等;每逢618大促,在单量很......