闲暇无事,写个帖子记录生活;
关于第一次使用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