开源分布式Job系统,调度与业务分离-如何创建周期性的HttpJob任务

久未见 提交于 2021-02-20 08:27:51

项目介绍:

Hangfire:是一个开源的job调度系统,支持分布式JOB!!

Hangfire.HttpJob 是我针对Hangfire开发的一个组件,该组件和Hangfire本身是独立的。可以独立更新Hangfire版本不影响!

该组件已被Hangfire官方采纳,在Hangfire官网可以查到:

 

开源地址:

https://github.com/yuzd/Hangfire.HttpJob

 

该项目目的是:

剥离Job调度和业务

 

 

Hangfire.HttpJob究竟是干嘛的

  • 传统使用Hangfire都是把JOb的处理逻辑代码写在和Hangfire的同一个工程!
  • 缺点: 这样就耦合在了一起,如果业务线增大,会导致每个业务线的Job处理逻辑都得和Hangfire耦合在一起!发布的时候所有业务线Job都得暂停调度
  • 而使用了Hangfire.HttpJob的话 就是把Hangfire的服务拓展成可以把Job的处理逻辑代码写在别的工程里面(以webapi的形式暴露给Hangfire去调度)
  • 优点:这样就解耦了Hangfire和业务处理逻辑,业务job开发者可以忽略Hangfire的存在!不同的业务线分开不同的JobAgent可以分别部署,发布互不影响

Hangfire.HttpJob

是对Hangfire的一个扩展插件,利用Hangfire.HttpJob可以快速搭建分部署Job调度Server。

特点是:

  1. 业务与调度完全分离。
  2. 支持定点执行 延迟执行 周期性循环执行,支持秒级别
  3. 配合JobAgent组件可以实现Job管理 监控 日志等

 

共有三篇文章

 

开源分布式Job系统,调度与业务分离-如何创建一个计划httpjob任务

 

开源分布式Job系统,调度与业务分离-如何创建周期性的HttpJob任务

 

开源分布式Job系统,调度与业务分离-HttpJob.Agent组件介绍以及如何使用



 

 

本篇教程:如何创建一个周期性的HttpJob任务的

 

周期性的HttpJob任务的定义

  • 是多次运行的job 采用Cron表达式进行定义运行规则

注意事项

  • 最新版的hangfire已支持 6位数的Cron表达式(支持到秒级)
  • 但是我在hangfire的dashbord扩展的Cron生成页面还不支持到秒级别(大家可以在google找可以生成6位的网站工具)

1. 进入hangfire的后台 点击 上侧栏【周期性作业】

如下图所示: image

针对周期性作业 可以看到有三个按钮

按钮名称 说明
新增周期性作业 新增一个周期性httpjob作业
编辑周期性作业 如果你重新编辑该周期性httpjob作业内容可以点击该按钮
Cron表达式生成 跳转到Cron表达式生成页面

1. 生成Cron表达式

点击【Cron表达式生成】 进入Cron表达式生成页面 如下图: image

例如 我想要 每天晚上8点05分执行

image

image

image

得出结果:【5 20 * * *】

2.新增周期性作业

点击【新增周期性作业】按钮 会出现一个json编辑器

image

json编辑器的参数说明如下

字段名称 备注
JobName 你给这个httpjob起的名称【必填项】
Method 这个httpjob的请求方式 "get" 或者 "post" 【必填项】
ContentType 这个httpjob的请求ContentType 默认"application/json" 【必填项】
Url 这个httpjob的请求url 【必填项】
Cron Cron表达式 可以先用【Cron表达式生成】功能生成好,如果为空 代表只能手动触发执行
Data 这个httpjob在Method=“post”的时候可以指定post的内容,可以是一个对象也可以是一个string或者其他类型
Timeout 这个httpjob请求的超时时间(单位是毫秒 例如5000 代表是5秒)
BasicUserName 这个httpjob请求需要启用basic认证时设置的username
BasicPassword 这个httpjob请求需要启用basic认证时设置的密码
EnableRetry 失败的时候(比如超时 远程服务器请求错误等)是否启用重试 默认false ,如果设置true 会重试最大3次
SendSucMail 这个httpjob请求无异常的时候是否发送通知邮件 默认false
SendFaiMail 这个httpjob请求异常的时候是否发送通知邮件 默认true
Mail 设置通知邮件地址 如果有多个用半角逗号隔开
AgentClass 如果是AgentJob开发的httpjob 则需要填写,填写的是完整的类型格式{namespace},{程序集的名称} 例如:TestHangfireAgent.Jobs,TestHangfireAgent

举例



比如
每天晚上8点执行一次查询订单已完成超xx小时了(xx作为参数)
但是还没有点评的
发短信让催点评
接口地址:http://localhost:5000/scoreOrder
访问方式是POST
接口有basicAuth验证 用户名是admin 密码是test

# 那么对应如下填写:

{
  "JobName": "scoreOrder",                  //Job名称
  "Method": "POST",                         //http请求的方法 
  "ContentType": "application/json",        //http参数类型
  "Url": "http://localhost:5000/scoreOrder",//接口的地址 
  "Cron": "5 20 * * *",                     //每天晚上805分执行
  "Data": {
    "Hour":48                               //传的参数超过48小时
  },
  "Timeout": 5000,                          //http调用超时设置
  "BasicUserName": "admin",                 //http调用的basicAuth
  "BasicPassword": "test",                  //http调用的basicAuth
  "EnableRetry": false,
  "SendSucMail": false,
  "SendFaiMail": true,                      //http失败时发邮件通知
  "Mail": "1877682825@qq.com",              //http调用失败通知我
  "AgentClass": ""
}

image

点击【提交】

image

添加成功 在job列表可以查

我刚才设置的是20:05分执行

目前时间是19:50

正好是还有15分钟就要执行了 说明Cron表达式没有问题 image

对于周期性job 有3个按钮可以操作

按钮名称 说明
立即执行 如果你希望不要等到8点05想立即就执行可以点击它
停止或开始任务 如果你希望暂停这个周期性job 可以点它,点完之后再次点击就是开启
编辑周期任务 如果你刚刚添加的参数有错误,可以点击这个按钮重新编辑提交

image

停止或开始任务

如果一个周期性job是暂停的 会以红色字体展示 image

编辑周期任务

点击提交修改 image

周期性job执行

image

周期性job执行完毕 在完成列表可以查询

image

点击job编号进入job详情页查看具体执行情况和日志

image

也可以在Tag页面进行查看

说明:Tag页面是按jobName进行分组查询的 image

点击某一个jobName 进入该jobName下所有的运行完成的job列表

image

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!