.Net Core怎么使用Hangfire

闲暇无事,写个帖子记录生活;

关于第一次使用hangfire使用的demo,该文章比较简单,因为我现在比较冷;

首先

Q:为什么使用Hangfire?

A:鄙人愚见,使用Hangfire在于三点,1.任务持久化,2.拥有可视化控制台界面,3.可重试

本文主要讲述以下两个方面:

一、添加及执行定时任务(周期任务)

    使用场景:心跳检查,定时更新,或者数据同步等需要循环执行的周期性任务

二、客户端调用添加队列任务(只执行一次)

    使用场景:信息推送(邮件,短信,微信公众号,钉钉等等),订单超时(超过限定时间未付款则取消订单)等只执行一次的任务,是否延时执行看需求;

废话说完,回归主题

一、添加引用NuGet包

Hangfire.AspNetCore    为基础包,必需

下面三个为数据持久化时持久地址,你用什么就挑那个引用就好了,tips:Hangfire默认的是MSSQL

Hangfire.MemoryStorage    微软提供的缓存,你程序挂了,这玩意儿也就没了

Hangfire.MySql.Core    持久化到mysql

Hangfire.Redis.StackExchange    持久化到Redis缓存

二、准备一下我们执行任务的业务代码

我这里准备一个工具类,也就是MailSmtp发送邮件(哔哔一下,该类直接从sugar官网直接copy过来的,特加强调)

然后实现一个消息服务类MessageService

 public class MessageService : IMessageService
    {
        public void SendEmailMsg(string msg)
        {
            var mail = new MailSmtp();
            bool isSuccess = mail.Send("@163.com", "test", "1007425623@qq.com", "哈哈", msg);
            Console.WriteLine($"发送消息:{msg}");
        }
    }

 

三、找到Startup.cs,添加如下代码

 public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

            //services.AddHangfire(x => x.UseStorage(new MySqlStorage(
            //    //Configuration["ConnectionString"],
            //    new MySqlStorageOptions
            //    {
            //        TransactionIsolationLevel = IsolationLevel.ReadCommitted, // 事务隔离级别。默认是读取已提交。
            //        QueuePollInterval = TimeSpan.FromSeconds(15),             //- 作业队列轮询间隔。默认值为15秒。
            //        JobExpirationCheckInterval = TimeSpan.FromHours(1),       //- 作业到期检查间隔(管理过期记录)。默认值为1小时。
            //        CountersAggregateInterval = TimeSpan.FromMinutes(5),      //- 聚合计数器的间隔。默认为5分钟。
            //        PrepareSchemaIfNecessary = true,                          //- 如果设置为true,则创建数据库表。默认是true。
            //        DashboardJobListLimit = 50000,                            //- 仪表板作业列表限制。默认值为50000。
            //        TransactionTimeout = TimeSpan.FromMinutes(1),             //- 交易超时。默认为1分钟。
            //        TablePrefix = "Hangfire"                                  //- 数据库中表的前缀。默认为none
            //    })));
            //services.AddHangfire(x => x.UseStorage(new MemoryStorage()));
            services.AddHangfire(configuration =>
            {
                configuration.UseRedisStorage("");
            });
            services.AddTransient<IMessageService, MessageService>();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseMvc();
            app.UseHangfireDashboard();   //使用hangfire面板
            app.UseHangfireServer();      //启动hangfire服务
            RecurringJob.AddOrUpdate<IMessageService>(x => x.SendEmailMsg("================================Hangfire服务端定时任务================================"), Cron.Minutely());
        }

这个也很简单,就去Hangfire官网,跳到github上看readme就行了

在这里我采用的是使用redis来当我作业持久化的地址,同时开放出我的reids地址,有缘人看到这篇文章的时候可以直接拿着项目跑起来看到效果;

直接F5,在端口后面加上 /hangfire 查看效果;例如:http://localhost:5000/hangfire

这时候,我们的第一个任务《定时任务》(周期任务)就已经完成了;

接下来第二个《队列任务》(只执行一次),这也很简单;

四、添加控制器及对应的接口

 [Route("api/[controller]/[action]")]
    [ApiController]
    public class DispatchController : ControllerBase
    {

        /// <summary>
        /// 添加一个任务到队列并立即执行
        /// </summary>
        /// <param name="jobDescriptor"></param>
        /// <returns></returns>
        [HttpPost]
        public JsonResult AddEnqueue()
        {
            try
            {
                var jobId = string.Empty;
                jobId = BackgroundJob.Enqueue<IMessageService>(x => x.SendEmailMsg("================================客户端添加的任务================================"));
                return new JsonResult(new { Flag = true, Message = $"Job:#{jobId}-已加入队列" });
            }
            catch (Exception ex)
            {
                return new JsonResult(new { Flag = false, Message = ex.Message });
            }
        }

        /// <summary>
        /// 添加一个延迟任务到队列
        /// </summary>
        /// <param name="jobDescriptor"></param>
        /// <returns></returns>
        [HttpPost]
        public JsonResult AddSchedule()
        {
            try
            {
                var jobId = string.Empty;
                jobId = BackgroundJob.Schedule(() => null, TimeSpan.FromMinutes(1));
                return new JsonResult(new { Flag = true, Message = $"Job:#{jobId}-已加入队列" });
            }
            catch (Exception ex)
            {
                return new JsonResult(new { Flag = false, Message = ex.Message });
            }
        }

        /// <summary>
        /// 添加一个定时任务
        /// </summary>
        /// <param name="jobDestriptor"></param>
        /// <returns></returns>
        [HttpPost]
        public JsonResult AddRecurring()
        {
            try
            {
                var jobId = string.Empty;
                RecurringJob.AddOrUpdate("", () => null, Cron.Hourly, TimeZoneInfo.Local);
                return new JsonResult(new { Flag = true, Message = $"Job:已加入队列" });
            }
            catch (Exception ex)
            {
                return new JsonResult(new { Flag = false, Message = ex.Message });
            }
        }

        /// <summary>
        /// 删除一个定时任务
        /// </summary>
        /// <param name="jobName"></param>
        /// <returns></returns>
        [HttpDelete("DeleteRecurring")]
        public JsonResult Delete(string jobName)
        {
            try
            {
                RecurringJob.RemoveIfExists(jobName);
                return new JsonResult(new { Flag = true, Message = $"Job:{jobName}已删除" });
            }
            catch (Exception ex)
            {
                return new JsonResult(new { Flag = false, Message = ex.Message });
            }
        }

        /// <summary>
        /// 触发一个定时任务
        /// </summary>
        /// <param name="jobName"></param>
        /// <returns></returns>
        [HttpGet("TriggerRecurring")]
        public JsonResult Trigger(string jobName)
        {
            try
            {
                RecurringJob.Trigger(jobName);
                return new JsonResult(new { Flag = true, Message = $"Job:{jobName}已触发执行" });
            }
            catch (Exception ex)
            {
                return new JsonResult(new { Flag = false, Message = ex.Message });
            }

        }

    }

什么,代码看着眼熟?恭喜你,记忆力相当可以,我复制某位大佬的,本文末会注明相关出处

这时候我们再F5启动,

 

好了,搞定了,本文到此结束,对于本文的类别,更合适的名字应该叫整合吧

demo源码:https://gitee.com/Jodro/Hangfire

本文相关链接:

https://blog.csdn.net/qinyuanpei/article/details/95936781

https://www.hangfire.io

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值