跨語言呼叫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}" }; } }
效果圖