跨语言调用Hangfire定时作业服务
跨语言调用Hangfire定时作业服务
背景
Hangfire允许您以非常简单但可靠的方式执行后台定时任务的工作。内置对任务的可视化操作。非常方便。
但令人遗憾的是普遍都是业务代码和hagnfire服务本身聚合在一个程序中运行,极大的限制了hangfire的扩展和跨语言调用。
所以萌生了开发一个支持restful api调用的sdk库
本来打算简单的建立webapi,内部再调用hangfire,但是一想实在不优雅,组件就应该尽量聚合在一个库的中,偶然找到了一个已经开发了支持restfull api的hangfire组件,github地址=>Hangfire.Job
看了下源码,调用了hangfire公开的接口获取请求路由信息,然后去hangfire去执行。只提供了单次执行和循环执行,其他场景可以参考代码扩展。
但是调用方要通过http请求,不是很方便,所以扩展了一个Chaunce.Hangfire.Client 的C# sdk来调用hangfire。此库也已上传nuget
使用方式
第一步:
部署hangfire服务
拉取Chaunce.Hangfire.Server(属于.netcore程序,支持跨平台部署)项目
然后修改appsettings.json文件
"ConnectionStrings": {
"HangfireConnection": "server=.;database={你想让hangfire生成的数据库名称};uid=sa;pwd=111111"
},
之后在数据库建立与ppsettings.json中数据库名称一致的数据库。
第二步:
使用hangfire客户端
建立asp.netcore 程序,并修改appsettings.json文件如下:
"HangfireClientOptions": {
"RecurringJobUrl": "hangfire/httpjob?op=recurringjob",
"BackgroundJobUrl": "",
"BaseUrl": "http://localhost:5000",
"UserName": "admin",
"PassWord":"test"
}
修改Startup文件将Chaunce.Hangfire.Client注册到asp.netcore组件中,
public void ConfigureServices(IServiceCollection services) { var option = Configuration.GetSection(nameof(HangfireClientOptions)).Get<HangfireClientOptions>(); services.AddHangfireClient(option); }
这里以Controller中使用为例:将IHangfireClient 注入构造函数进行使用
[Route("api/[controller]")] [ApiController] public class ValuesController : ControllerBase { private readonly IHangfireClient _hangfireClient; public ValuesController(IHangfireClient hangfireClient) { _hangfireClient = hangfireClient; } // GET api/values [HttpGet] public async Task<ActionResult<IEnumerable<string>>> Get() { var result = await _hangfireClient.SendTimerJobAsync(new HttpJobItem { Corn = Cron.MinuteInterval(10), Url = "https://www.cnblogs.com/xiaoliangge/", JobName = "I'm external Job by restful Api", }, TaskType.Recurringjob); return new string[] { "Do i succeeded?", $"{result}" }; } }
效果图
作者:Chaunce
GitHub:https://github.com/liuyl1992
公众号请搜:架构师高级俱乐部 SmartLife_com
声明:原创博客请在转载时保留原文链接或者在文章开头加上本人博客地址,如发现错误,欢迎批评指正。凡是转载于本人的文章,不能设置打赏功能等盈利行为