当前位置: 首页 > 编程日记 > 正文

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

项目介绍:

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 只运行一次

1. 进入hangfire的后台 点击 左侧栏【计划】

会看到一个按钮名称叫 【新增常规作业】如下图所示: image

2. 点击【新增常规作业】会出现一个json编辑器

如下图所示 image

json编辑器的参数说明如下

字段名称备注
JobName你给这个httpjob起的名称【必填项】
Method这个httpjob的请求方式 "get" 或者 "post" 【必填项】
ContentType这个httpjob的请求ContentType 默认"application/json" 【必填项】
Url这个httpjob的请求url 【必填项】
DelayFromMinutes需要延迟执行的分钟,注意:0 代表立刻执行; -1代表只能手动触发; >=1代表延迟分钟数 【必填项】
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

3.举例

我开发了一个订单支付超时检测 接口
访问地址是:
http://localhost:5000/checkOrder
访问方式是POST
访问的参数是 orderId
接口有basicAuth验证 用户名是admin 密码是test
希望计划 15分钟后执行 看有没有支付 没有支付 就把订单状态改成取消
如果接口访问失败那么通知邮箱 1877682825@qq.com# 那么对应如下填写:{"JobName": "checkOrder",                  //Job名称"Method": "POST",                         //http请求的方法 "ContentType": "application/json",        //http参数类型"Url": "http://localhost:5000/checkOrder",//接口的地址 "DelayFromMinutes": 15,                   //15分钟后执行"Data": {"OrderId":123456                        //传的参数 orderId},"Timeout": 5000,                          //http调用超时设置"BasicUserName": "admin",                 //http调用的basicAuth"BasicPassword": "test",                  //http调用的basicAuth"EnableRetry": false,"SendSucMail": false,"SendFaiMail": true,                      //http失败时发邮件通知"Mail": "1877682825@qq.com",              //http调用失败通知我"AgentClass": ""
}

点击【提交】添加job 成功如下图所示:

image

可以看到会在15分钟后执行该job

image

针对该job 可以看到有四个按钮

按钮名称说明
加入队列如果你想让这个job立即执行 可以点击该按钮
删除选中如果你想删除这个job 可以点击该按钮
带参数执行这个按钮的作用是 重新定义JSON里面的Data的值 并立即执行的意思,在AgentJob场景下使用较多
停止Job这个只能在AgentJob才可以使用

job到时执行 如下图所示

image

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

image

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

image

也可以在Tag页面进行查看

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

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

image

转载于:https://www.cnblogs.com/yudongdong/p/10942028.html

相关文章:

小手段:开启 GNOME 的窗口分组效果

Toy Posted in Tips用过 Windows XP 的伴侣除夜要都晓得它有一项分组雷同义务栏按钮的效果,该效果主动将同类窗口的义务按钮折叠为一个单独的按钮,从而无效处置义务栏的窗口拥堵后果。其实,在 Linux 的 GNOME 桌面情况中也有雷同的效果──窗…

MySQL设值自动修改时间

ALTER TABLE form_ylqx ADD update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 修改时间

[原]不祥的CPU——Alpha

这几天都在捣鼓 Sun Fire V890 小型机,小型机可不像PC服务器那样“不一样的品牌,一样的芯”,不同的品牌的小型机最大的不同当数CPU和OS了,IBM小型机CPU是Power而OS是AIX,HP小型机的CPU是Intel的Itanium而OS是HP-UX&…

Leetcode 764. Largest Plus Sign

思路:动态规划。对于第i行第j列的元素grid[i][j]表示的是这个元素的plus sign的等级,初始化不在mines中的元素对应的grid值为较大值(只要大于N/2即可),在mines中的元素对应的grid值为0。不在mines中的元素,…

吴裕雄--天生自然 JAVASCRIPT开发学习:(String) 对象

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <body><script> var carname1"Volvo XC60"; var carname2Volvo XC60; var answer1It\s al…

校园音乐点歌平台的设计与开发 微信小程序 点歌系统 java 开发

1、 微信小程序前台展示 2 、 使用到的技术框架 Springbootmavenmybatis网易云相关API 3、 后台展示 项目地址&#xff1a; 项目地址

Tile Racer — 3D 赛车游戏

Toy Posted in Tile Racer 是一款可免用度于 Linux 及 Windows 平台的 3D 赛车游戏。它不只具有十分逼真的效果&#xff0c;并且包罗用来创设新 Maps 的赛道编辑器。玩家可置身于游戏之中足够觉获得赛车的快乐喜爱。Tile Racer 此后最新版本为 0.6&#xff0c;你可以从这里下载…

如何找寻最适合的WEB应用安全解决方案(视频)

51CTO最近举办了一个“拯救网站运维经理赵明”的活动&#xff0c;活动主要讲了一个网站运维经理由于网站被黑而面临失业的故事。其中急需解决的问题&#xff0c;就是如何保护我们的网站。Web应用安全该如何做&#xff1f;怎么才能找到最佳方案&#xff1f;我们就这一主题来采访…

docker 笔记 (6)搭建本地registry

转&#xff1a;http://blog.csdn.net/felix_yujing/article/details/51564739 新版 registry v2对镜像存储格式进行了重新设计&#xff0c;并且和旧版还不兼容。registry v2是由go语言开发&#xff0c;docker从1.6版本开始支持registry v2&#xff0c;之前python开发的老版regi…

2019攻防世界web新手区

robots 看了题目描述&#xff0c;发现与robots协议有关&#xff0c;过完去百度robots协议。发现了robots.txt&#xff0c;然后去构造url访问这个文件 http://111.198.29.45:42287/robots.txt 得到提示&#xff1a;Disallow: f1ag_1s_h3re.php&#xff0c;再次构造url&#xff0…

SSM实现网上商城 有聊天功能

1.项目介绍 实现一个网上商城&#xff0c;商品信息展示&#xff0c;购物车&#xff0c;订单管理&#xff0c;个人中心&#xff0c;商品评价&#xff0c;商品搜索&#xff0c;地址管理&#xff0c;聊天&#xff0c;后台管理&#xff08;商品增删改查&#xff09;&#xff0c;分类…

as3中TextFormat类的使用

在AS3中对TextField进行格式化时可以有三种方法&#xff1a;html标签控制格式css使用TextFormathtml比较方便&#xff0c;但很有限&#xff0c;CSS可以外置维护比较容易&#xff0c;但缺少变化&#xff0c;TextFormat可以复杂多变&#xff0c;只是写起来比较麻烦&#xff0c;并…

pyqt5 使用 QTimer, QThread, pyqtSignal 实现自动执行,多线程,自定义信号触发。

渣渣用法&#xff0c;请等待我心情好的时候更新。 1.第一个例子 1.1 先看mainwindow.py from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_MainWindow(object):def setupUi(self, MainWindow):MainWindow.setObjectName("MainWindow")MainWindow.resize(640, 320…

linux secureCRT 显示中文乱码

安装的时候&#xff0c;只安装了英文&#xff0c;没有安装中文&#xff0c;所以只有en_US.UTF-8.因为linux本身就支持多语言&#xff0c;所以我们只需要在光盘 上找到&#xff12;个中文支持字体包安装上即可.这两个字体文件是存放在第四张光盘上的Servers目录下: fonts-chines…

PicGo 配置Gitee 图床

目录 1.下载安装picGo 2.打开picGo详情页面 3.创建gitee图床库 ​4. 配置picGo 5.获取gitee token信息 6.与typora搭配使用 1.下载安装picGo 百度picgo csdn下载地址:https://download.csdn.net/download/huyande123/12582917 2.打开picGo详情页面 3.创建gitee图床库 …

文件夹内多文件上传到服务器

文件夹上传至服务器希望可以给你一点帮助 直接上代码jsp页面 <div style"text-align:center; vertical-align:middel" id"uploadFile"> <input type"file" name"file" id"file" multiple"multiple" webk…

【Socket研究】~。~ Scoket开发蛋疼笔记 Silverlight

客户端连接步骤【Silverlight】 【注意】 Silverlight 客户端 记得一定是异步连接。 一。连接步骤 1.实例一个Scoket 2.实例套接字 SocketAsyncEventArgs 3.给套接字载入连接信息 4.载入异步方法转载于:https://www.cnblogs.com/manbaal/archive/2011/03/08/1977521.html

通知:正式迁移至新博客

博客迁移这事情已经有一段时间了&#xff0c;不过最近发现似乎还有许多朋友不知道这点&#xff0c;以为我怎么不写博客了——其实我还在写&#xff0c;写的还挺勤快的&#xff0c;只不过已经不继续同步到博客园了。这事儿说来也很遗憾&#xff0c;原本我打算两边同步更新&#…

java中别名问题

Java中别名问题 Java中涉及到对象引用时常常出现意想不到得问题直接将一个对象赋值给另一个对象时 改变另一个对象 开始的那个对象也出现改变class Person{private int age;public int getAge() {return age;}public void setAge(int age) {this.age age;}} 对于对象Person做如…

中国挪动批改KPI查核制度将器重客户满意度

飞象网讯&#xff08;魏德龄/文&#xff09;记者从相关动静处置解到&#xff0c;中国挪动2011年的KPI查核将大幅缩减&#xff0c;并消除数据业务、TD用户数和集体客户等目标&#xff0c;重点调高了利润和客户满意度目标&#xff0c;并加入了相关EVA财务目标查核。去年&#xff…

ElasticSearch安装使用 操作索引

文章目录1.下载并安装2.了解es的配置文件**elasticsearch-.yml**&#xff08;中文配置详解&#xff09;3.使用head插件1.使用谷歌浏览器head插件2.使用压缩中的head程序4.使用kibana(安装)1.什么是kibana2.kibana国际化&#xff0c;将kibana设值成中文3.启动&#xff08;es先启…

36.两个链表的第一个公共结点——剑指offer

/* 找出2个链表的长度&#xff0c;然后让长的先走两个链表的长度差&#xff0c;然后再一起走 &#xff08;因为2个链表用公共的尾部&#xff09; */ class Solution { public:ListNode* FindFirstCommonNode( ListNode *pHead1, ListNode *pHead2) {int len1 findListLenth(pH…

浅析SAAS数据模型设计(Oracle)

目前SAAS平台对于大家来说并不陌生&#xff0c;市场上真正属于SAAS应用的并不是特别多&#xff0c;还有很大一部分是ASP的模式在运行&#xff0c;不管对于公司还是技术部门都是很大的挑战。去年在做elearning项目的时候其实也就是一个ASP的模式扩展&#xff0c;ASP模式本身就会…

编译原理(六)自底向上分析之LR分析法

自底向上分析之LR分析法 说明&#xff1a;以老师PPT为标准&#xff0c;借鉴部分教材内容&#xff0c;AlvinZH学习笔记。 基本概念 1. LR分析&#xff1a;从左到右扫描(L)自底向上进行规约(R)&#xff0c;是规范规约&#xff0c;也即最右推导&#xff08;规范推导&#xff09;&a…

一篇文章让你搞懂原型和原型链

每一个构造函数在被创建的时候&#xff0c;会自动创建一个相应的对象&#xff0c;这个对象就是原型对象&#xff0c;这个函数有一个指向该对象的指针。举个例子&#xff1a; 下面创建了一个函数person。 function person () { } 则 person.prototype 就是原型对象。而原型对象里…

elasticsearch 文档操作

文章目录single API1.添加数据2.更新数据PUTPOST --此方式更零活&#xff0c;可指定修改指定字段2.查询数据简单查询--根据id查询根据查询条件查询 --query string search根据查询条件查询--query DSL1.term/terms 过滤2.range过滤3.exists 和 missing 过滤4.bool过滤5.bool查询…

一起学WP7 XNA游戏开发(八. 让3d model动起来)

如何让3d model动起来&#xff0c;其实就是要给model的bone设置动作&#xff0c;这样整个model就会动起来了。一&#xff0e;获取Bones在fbx文件中可以看到所有bones的名称&#xff0c;这样就可以通过名称来获取到bones。turretBone tankModel.Bones["turret_geo"];…

【Python】解析Python中类的使用

目录结构&#xff1a; contents structure [-]类的基本使用专有方法继承单重继承多重继承砖石继承1.类的基本使用 下面是类使用的一个简单案例&#xff0c; class person:"person 类的描述信息"def __init__(self,name"",age0):self.name nameself.age a…

hive中array嵌套map以及行转列的使用

1. 数据源信息 {"student": {"name":"king","age":11,"sex":"M"},"sub_score":[{"subject":"语文","score":80},{"subject":"数学","score&qu…

SpringBoot 操作elasticsearch

SpringBoot 操作elasticsearch 版本环境 jdk1.8elasticsearch 7.6.1 maven <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency>注意版本&#xf…