欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

跨语言调用Hangfire定时作业服务

程序员文章站 2022-04-25 18:13:53
跨语言调用Hangfire定时作业服务 背景 Hangfire允许您以非常简单但可靠的方式执行后台定时任务的工作。内置对任务的可视化操作。非常方便。 但令人遗憾的是普遍都是业务代码和hagnfire服务本身聚合在一个程序中运行,极大的限制了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}" };
        }
    }

效果图

跨语言调用Hangfire定时作业服务

 github地址:https://github.com/liuyl1992/chaunce.hangfire