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


    项目介绍:

    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.Agent组件介绍以及如何使用

    HttpJob.Agent是什么?

    是一个基于netcore web的一个中间件,专门用于配合Hangfire.HttpJob 开发HttpJob的组件

    NUGET地址:Install-Package Hangfire.HttpJob.Agent

    帮助快速创建HttpJob并有以下特色

    1. job的调度和业务完全分离
    2. 可以在hangfire的后台进行添加变成一个HttpJob
    3. 支持在hangfire后台手动发送该job 执行命令 和 停止命令
    4. 支持 长时间运行

    如何使用

    JobAgent 是作为一个中间件来使用的 DEMO 可以查看 https://github.com/yuzd/Hangfire.HttpJob/tree/master/Test/TestHangfireAgent

    JobAgent:一个JobAgent表示一个App 通过netcore web形式部署,一个JobAgent可以宿主多个Job

    Job:表示单个Job,用于处理特定的业务逻辑

    1.创建一个netcore的web空的工程

    image

    image

    安装nuget包 image

    这里我也用NLOG组件来记录日志: 所以也安装下Nlog的包: NLog.Extensions.Logging

    新增一个Nlog.config文件,可以参考 https://github.com/yuzd/Hangfire.HttpJob/blob/master/Test/TestHangfireAgent/NLog.Config

    配置startup

    image

    在appsettings.json里面配置JobAgent的启动参数

    image

    参数说明

    字段名称备注
    Enabled 代表是否启用JobAgent
    SitemapUrl 代表JobAgent的请求地址 默认"/jobagent"
    EnabledBasicAuth 代表是否开启basicAuth认证 如果true 需要设置下面2个参数
    BasicUserName basicAuth认证的用户名
    BasicUserPwd basicAuth认证的密码

    AgentJob 分下面两种

    1. 单例的Job ===> 指的是在Agent运行期间只会存在一个实例 如果该实例没有执行完毕 是不允许再次执行的
    2. 多例的Job ===> 每次执行都会新生成一个实例

    PS:Job类都是注册在Netcore 的 DI容器里面的,所以可以在job类的构造方法 注入你想要的类,比如Logger组件

    开始写job了

    1. 写一个最简单的job

    新建一个cs 叫 TestJob.cs

    让它继承 JobAgent 并且重写 下面3个方法

    • OnStart
    • OnStop
    • OnException

    特别说明: OnStart方法在被执行的时候是在一个独立的线程执行的,所以能够执行长时间的任务

    默认注册的单例JOB,下面会有多例的举例

    image

    2. 注册到Hangfire里面去

    image

    # 特别要注意的以下几个参数
    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"
    }
    
    

    image

    image

    添加成功后可以在job列表查到

    1. 由于我刚刚添加设置的是DelayFromMinutes:-1 所以【队列】这里显示【multiple】代表可以多次运行 并且 只能自己点击按钮执行
    2. 由于我们填了AgentClass 这个属性,所以Hangfire会认为这个是一个AgentJob 在[作业]显示的名称里面会有 JobAgent的字样

    如下图所示: image

    1. 手动触发试一试 image

    可以填参数 也可以不填参数 这里我们测试就随便写 image

    可以看到AgentJob的控制台看到 调用执行成功 参数也传的没问题 image

    再回到Hangfire的后台看下调用的日志

    image

    注意:由于这个是一个单例的JOB,在Onstart方法里面我们 采用 await Task.Delay(1000 * 10); 延迟了10秒 所以如果你在这10秒内重复执行这个Job 会提示 这个Job正在running 不能重新启动!等OnStart方法执行完毕后这个job才能被再次调用

    2. 创建一个多例的JOB

    其实很简单 就是在类上面加一个[TransientJob]标签就变成多例了

    如下图所示 我们创建一个测试多例的job:TestTransientJob.cs 然后在它的类上面打上一个[TransientJob]标签 如下图所示:

    image

    采用和上面一样的方式注册到Hangfire里面去! 和上面单例的唯一区别就是 多例的Job 每次都是一个新的实例,不会判断你上一个实例有没有执行完.

    3. 创建一个可以Hang住OnStart方法的Job

    意思就是 Job在执行OnStart方法完成的时候 不去结束这个Job 而是Hang住。 和Console.ReadKey() 类似的感觉!!

    等到收到OnStop命令才去终止这个Job。

    常见使用场景:消息队列Client端处理

    使用也很简单 在类上打一个标签[HangJobUntilStop(true)]即可

    image

     

    20190605追加一个用于JobAgent的记录log到hangfire 后台 Console 中间件

    NUGET 地址: https://www.nuget.org/packages/Hangfire.HttpJob.Agent.MysqlConsole/

    也是开源的 开源代码在:https://github.com/yuzd/Hangfire.HttpJob

    这个中间件的目的是能让JobAgent 写log到hangfire的Console

    如图: image

    如何在JobAgent记录日志而且Hangfire后台能查到呢?

    1. 首先引用上面的MysqlConsole中间件的NUGET包

    2. 在application.json里面配置 image

    3. 在startUp.cs文件里面注册 image

    4. 在Job类里面使用 image

    注意说明:

    如果你不注册使用MysqlConsole这个中间件的话,

    那么默认的: jobContext.Console.WriteLine 方法 等于 _logger.LogInformation(message);

  • 相关阅读:
    Django 初试水(一)
    自己动手系列----使用数组实现一个简单的Set
    自己动手系列----使用数组实现一个简单的Map
    DB2中的MQT优化机制详解和实践
    Airy Memory 内存清理 + 注册码
    eclipse 工具翻译插件安装
    用sysdba登录oracle 11g数据库时遇到已连接到空闲例程 ora-013113
    Firewall 防火墙规则
    未找到段的定义
    ORACLE 锁表的解决方法 ORA-00054
  • 原文地址:https://www.cnblogs.com/yudongdong/p/10942128.html
Copyright © 2020-2023  润新知