开源分布式Job系统,调度与业务分离-HttpJob.Agent组件介绍以及如何使用
项目介绍:
Hangfire:是一个开源的job调度系统,支持分布式JOB!!
Hangfire.HttpJob 是我针对Hangfire开发的一个组件,该组件和Hangfire本身是独立的。可以独立更新Hangfire版本不影响!
该组件已被Hangfire官方采纳,在Hangfire官网可以查到:
开源地址:
https://github.com/yuzd/Hangfire.HttpJob
该项目目的是:
剥离Job调度和业务
共有三篇文章
开源分布式Job系统,调度与业务分离-如何创建一个计划httpjob任务
开源分布式Job系统,调度与业务分离-如何创建周期性的HttpJob任务
开源分布式Job系统,调度与业务分离-HttpJob.Agent组件介绍以及如何使用
本篇教程:HttpJob.Agent组件介绍以及如何使用
HttpJob.Agent是什么?
是一个基于netcore web的一个中间件,专门用于配合Hangfire.HttpJob 开发HttpJob的组件
NUGET地址:Install-Package Hangfire.HttpJob.Agent
帮助快速创建HttpJob并有以下特色
- job的调度和业务完全分离
- 可以在hangfire的后台进行添加变成一个HttpJob
- 支持在hangfire后台手动发送该job 执行命令 和 停止命令
- 支持 长时间运行
如何使用
JobAgent 是作为一个中间件来使用的 DEMO 可以查看 https://github.com/yuzd/Hangfire.HttpJob/tree/master/Test/TestHangfireAgent
JobAgent:一个JobAgent表示一个App 通过netcore web形式部署,一个JobAgent可以宿主多个Job
Job:表示单个Job,用于处理特定的业务逻辑
1.创建一个netcore的web空的工程
安装nuget包
这里我也用NLOG组件来记录日志: 所以也安装下Nlog的包: NLog.Extensions.Logging
新增一个Nlog.config文件,可以参考 https://github.com/yuzd/Hangfire.HttpJob/blob/master/Test/TestHangfireAgent/NLog.Config
配置startup
在appsettings.json里面配置JobAgent的启动参数
参数说明
字段名称 | 备注 |
---|---|
Enabled | 代表是否启用JobAgent |
SitemapUrl | 代表JobAgent的请求地址 默认"/jobagent" |
EnabledBasicAuth | 代表是否开启basicAuth认证 如果true 需要设置下面2个参数 |
BasicUserName | basicAuth认证的用户名 |
BasicUserPwd | basicAuth认证的密码 |
AgentJob 分下面两种
- 单例的Job ===> 指的是在Agent运行期间只会存在一个实例 如果该实例没有执行完毕 是不允许再次执行的
- 多例的Job ===> 每次执行都会新生成一个实例
PS:Job类都是注册在Netcore 的 DI容器里面的,所以可以在job类的构造方法 注入你想要的类,比如Logger组件
开始写job了
1. 写一个最简单的job
新建一个cs 叫 TestJob.cs
让它继承 JobAgent 并且重写 下面3个方法
- OnStart
- OnStop
- OnException
特别说明: OnStart方法在被执行的时候是在一个独立的线程执行的,所以能够执行长时间的任务
默认注册的单例JOB,下面会有多例的举例
2. 注册到Hangfire里面去
# 特别要注意的以下几个参数 1. Url 要填 Agent的注册地址 “/jobagent” 2. BasicUserName 和 BasicPassword 要填 Agent的配置的basicAuth 3. AgentClass 要填你添加的job类的完整名称 4. DelayFromMinutes这里我们填-1 代表必须手动执行 如果填0代表是立即执行 如果填>1 代表延迟分钟数 # 那么对应如下填写: { "JobName": "TestJob", //Job名称 "Method": "POST", //http请求的方法 "ContentType": "application/json", //http参数类型 "Url": "http://localhost:5002/jobagent", //Agent的注册地址 "DelayFromMinutes": -1, //-1代表必须手动启动 "Data": "", "Timeout": 5000, //http调用超时设置 "BasicUserName": "test", //Agent设置的basicAuth "BasicPassword": "123456", //Agent设置的basicAuth "EnableRetry": false, "SendSucMail": false, "SendFaiMail": true, //http失败时发邮件通知 "Mail": "1877682825@qq.com", //http调用失败通知我 "AgentClass": "TestHangfireAgent.Jobs.TestJob,TestHangfireAgent" }
添加成功后可以在job列表查到
- 由于我刚刚添加设置的是DelayFromMinutes:-1 所以【队列】这里显示【multiple】代表可以多次运行 并且 只能自己点击按钮执行
- 由于我们填了AgentClass 这个属性,所以Hangfire会认为这个是一个AgentJob 在[作业]显示的名称里面会有 JobAgent的字样
如下图所示:
- 手动触发试一试
可以填参数 也可以不填参数 这里我们测试就随便写
可以看到AgentJob的控制台看到 调用执行成功 参数也传的没问题
再回到Hangfire的后台看下调用的日志
注意:由于这个是一个单例的JOB,在Onstart方法里面我们 采用 await Task.Delay(1000 * 10); 延迟了10秒 所以如果你在这10秒内重复执行这个Job 会提示 这个Job正在running 不能重新启动!等OnStart方法执行完毕后这个job才能被再次调用
2. 创建一个多例的JOB
其实很简单 就是在类上面加一个[TransientJob]标签就变成多例了
如下图所示 我们创建一个测试多例的job:TestTransientJob.cs 然后在它的类上面打上一个[TransientJob]标签 如下图所示:
采用和上面一样的方式注册到Hangfire里面去! 和上面单例的唯一区别就是 多例的Job 每次都是一个新的实例,不会判断你上一个实例有没有执行完.
3. 创建一个可以Hang住OnStart方法的Job
意思就是 Job在执行OnStart方法完成的时候 不去结束这个Job 而是Hang住。 和Console.ReadKey() 类似的感觉!!
等到收到OnStop命令才去终止这个Job。
常见使用场景:消息队列Client端处理
使用也很简单 在类上打一个标签[HangJobUntilStop(true)]即可
- Kubernetes监控开源工具基本介绍以及如何使用Sysdig进行监控
- 条形码类型介绍以及如何使用LEADTOOLS Barcodes
- 如何查看Win8安装应用以及在多设备帐户同步安装使用的方法介绍
- 如何在iOS中使用ZXing库(ZXing是一个开源的条码生成和扫描库,开源协议为Apache2.0。它持众多条码格式和语言,比如Java、 C++、 C#、 Objective-C以及Act )
- android开源框架android-async-http详细的使用介绍
- dotnet core使用开源组件FastHttpApi进行web应用开发(转)
- 条形码类型介绍以及如何使用LEADTOOLS Barcodes
- 实例演示如何使用RDIFramework.NET 框架的工作流组件进行业务流程的定义—请假申请流程-WinForm 推荐
- yarn对mapreducev1的重构,根本的思想是将 JobTracker 两个主要的功能分离成单独的组件,这两个功能是资源管理和任务调度 / 监控。
- 如何使用http或httpClient向服务器上传图片 以及使用http上传图片时协议的描述
- Vue单文件组件的如何使用方式介绍
- 封装GCD以及介绍如何使用
- 封装GCD以及介绍如何使用
- android-async-http开源项目介绍及使用方法
- *Delphi控件之---UpDown以及其与TEdit的配合使用(比如限制TEdit只能输入数字,还有Object Inspector之组件属性的介绍)
- .NET平台开源项目速览(9)软件序列号生成组件SoftwareProtector介绍与使用
- 从零开始,搭建博客系统MVC5+EF6搭建框架(4)上,前后台页面布局页面实现,介绍使用的UI框架以及JS组件
- 如何查看Activity任务栈以及dumpsys_activity命令的简要使用及介绍
- react-redux高阶组件connect方法使用介绍以及实现原理
- 关于vue自定义指令directives如何分离为组件并使用