Asp.Net Core下的开源任务调度平台ScheduleMaster—快速上手
概述
ScheduleMaster是一个开源的分布式任务调度系统,它基于Asp.Net Core平台构建,支持跨平台多节点部署运行。
它的项目主页在这里:
关于它的简单介绍可以看这里:
本地部署
使用前请准备好所需环境:
Visual Studio 2019、.Net Core3.0 SDK、Mysql 5.7、Centos(可选)、Docker(可选)。
下载源码到本地,然后用VS2019打开解决方案并编译通过。
打开项目Hos.ScheduleMaster.Web根目录下的appsettings.json文件,先修改Mysql数据库连接字符串以保证数据库正常访问,再找到NodeSetting节点,修改IP字段为master将要部署的ip地址(master端口为30000不用修改),在项目上右击选择发布...,发布到本地文件夹。
打开项目Hos.ScheduleMaster.QuartzHost根目录下的appsettings.json文件,同样先修改Mysql连接字符串,再找到NodeSetting节点,设置worker的名称IdentityName,修改IP字段为将要部署的ip地址,Port字段为要监听的地址(推荐为30001),在项目上右击选择发布...,发布到本地文件夹。如果要新增worker,按同样方式配置IdentityName、IP、Port即可,worker在启动后会把自己的信息注入到数据库中,在master中可以看到。
其他发布方式亦可。下面以运行2个worker节点为例:
在Windows中运行
- 找到master的发布目录,执行命令
dotnet Hos.ScheduleMaster.Web.dll启动程序,首次启动会自动迁移生成数据库结构并初始化种子数据,不需要执行脚本创建数据库,打开浏览器输入ip和端口访问即可(初始用户名admin,密码111111)。 - 找到worker的发布目录,执行命令
dotnet Hos.ScheduleMaster.QuartzHost.dll --urls http://*:30001启动程序,打开浏览器输入ip和端口会看到一个欢迎页面,表示worker已启动成功。 - 修改worker下的
appsettings.json文件为worker2的配置(如果发布前已经修改可跳过),执行命令dotnet Hos.ScheduleMaster.QuartzHost.dll --urls http://*:30002启动程序. - 登录到master中,可以看到节点管理菜单下各节点的运行状态。
在Linux(Centos)中运行
运行前请确保机器已经安装好
.Net Core3.0运行时环境。
把发布文件复制到Centos中,操作步骤同Windows。
在Docker中运行
- 在master的发布目录中执行
docker build -t ms_master .命令生成master镜像,再执行docker run -d -p 30000:30000 --name="mymaster" ms_master运行容器。 - 在worker的发布目录中执行
docker build -t ms_worker .命令生成worker镜像,再执行docker run --env identity=docker-worker1 --env port=30001 -d -p 30001:80 --name="myworker1" ms_worker运行容器启动worker1。 - 继续执行
docker run --env identity=docker-worker2 --env port=30002 -d -p 30002:80 --name="myworker2" ms_worker运行容器启动worker2。 - 执行
docker ps查看各容器运行状态。
接入一个任务
我们看一下如何编写业务代码以及怎么创建和启动一个任务。
编写业务代码
框架提供了统一的接入口,可以使用如下3种方式:
编译项目后手动添加引用程序集文件
Hos.ScheduleMaster.Base.dll。在nuget中搜索
ScheduleMaster直接安装到项目中。在命令行中使用
dotnet add package ScheduleMaster或程序包管理控制台中使用install-package ScheduleMaster安装。
然后新建一个业务类,集成自Hos.ScheduleMaster.Base.TaskBase,实现它的抽象方法Run就可以了,这个方法就是任务的入口。
下面是项目中最简单的一个Demo:
using System;
using Hos.ScheduleMaster.Base;
namespace Hos.ScheduleMaster.Demo
{
public class Simple : TaskBase
{
public override void Run(TaskContext context)
{
context.WriteLog($"当前时间是:{DateTime.Now}");
}
}
}
据有些朋友反馈,希望能加入单纯的http调度功能,这个将会作为重点功能在后面开发。
使用控制台创建任务
我以内置到系统中的demo任务为例子。首先登录到master控制台中进入到任务列表页面,选择创建任务,填写好配置信息:

如果需要指定参数,可以按如下方法设置:

在代码中使用如下代码读取自定义参数:
public override void Run(TaskContext context)
{
context.GetArgument<string>("param1");
context.GetArgument<int>("param2");
}
如果需要指定监护人,可以按如下方法设置:

如果在执行完成后要自动触发其他的任务,可以通过如下方式设置(拖拽选择):

前面的任务可以通过如下代码把结果传给后面的任务:
public override void Run(TaskContext context)
{
context.Result = new { success = true, message = "后面的兄弟大家好~" };
}
后面的任务获取前面的结果:
public override void Run(TaskContext context)
{
object pr=context.PreviousResult;
}
这里重点说一下程序包的问题,因为程序包是以程序集名称来打包并管理的,如果多个任务属于同一个程序集中,那么就不需要每个任务都重复上传程序包,同名的程序包重复上传会把已有的覆盖掉。这样子的话程序集的版本问题就要特别注意下,要避免同一程序包里的任务互相影响。
如果你想跑一个示例看看效果,可以按上面截图中配置基础信息即可,不需要再上传程序包。
使用API创建任务
除了使用控制台页面操作任务,系统还提供了几个简单的WebApi来操作,目前包括创建任务、查询任务详情、查询任务列表。
下面主要介绍创建任务API,接口定义如下:
访问地址:http://localhost:30000/api/task/create
请求类型:POST
主要参数:
| 参数名称 | 参数类型 | 是否必填 | 说明 |
|---|---|---|---|
| Title | string | 是 | 任务名称 |
| RunLoop | bool | 是 | 是否按周期执行 |
| CronExpression | string | 否 | cron表达式,如果RunLoop为true则必填 |
| AssemblyName | string | 是 | 程序集名称 |
| ClassName | string | 是 | 执行类名称,包含完整命名空间 |
| StartDate | DateTime | 是 | 任务开始时间 |
| EndDate | DateTime | 否 | 任务停止时间,为空表示不限停止时间 |
| Remark | string | 否 | 任务描述说明 |
| CreateUserName | string | 是 | 创建人用户名 |
| Keepers | List<int> | 否 | 监护人id |
| Params | List<ScheduleParam> | 否 | 自定义参数列表 |
对接流程:
- 在控制台中创建好专用的API对接用户账号。
- 使用对接账号的用户名设置为http header中的
ms_auth_user值。 - 使用加密过的秘钥设置为http header中的
ms_auth_secret值,加密规则:按{用户名}{密码}{用户名}的格式拼接,然后用32位的MD5算法进行加密,最后转换成小写字符串得到秘钥。 - 使用form格式发起http调用,如果非法用户会返回401-Unauthorized。
接口验签这块设计的比较简陋,因为考虑到这个场景使用的不多而且基本是内部系统调用,所以只做了简单验证。具体实现代码在
Hos.ScheduleMaster.Web.Filters.AccessControlFilter。
创建成功会返回任务id。
要提一下的是,使用API创建任务的方式不支持上传程序包,所以在任务需要启动时要确保程序包已通过其他方式上传,否则会启动失败。
启动流程

日志跟踪
在设计上,我把任务的每次运行定义为一个Trace并为之分配一个traceid,这样的话就能对产生的日志进行归类,区分哪一条是哪次运行产生的。
写入日志的方法为:
public override void Run(TaskContext context)
{
context.WriteLog("xxxxxxx");
context.WriteError(exception);
}
页面上在这里查看:

单击左边的运行记录可以看到与之关联的详细日志信息:

好了,这篇先就这么多~
结尾
如果有疑问,可以加入交流QQ群:824535095。
如果有优化建议或者发现了bug,欢迎提issue:https://github.com/hey-hoho/ScheduleMasterCore/issues
Asp.Net Core下的开源任务调度平台ScheduleMaster—快速上手的更多相关文章
- Asp.Net Core下的开源任务调度平台ScheduleMaster
从何说起 2017年初的时候,由于当时项目需要做了一个乞丐版定时调度系统,那时候只在单机上实现了核心的调度功能.做这个玩意之前也调研了社区中开源的解决方案,找了几个实地部署试跑了一下,其实都很不错.但 ...
- WebAPI调用笔记 ASP.NET CORE 学习之自定义异常处理 MySQL数据库查询优化建议 .NET操作XML文件之泛型集合的序列化与反序列化 Asp.Net Core 轻松学-多线程之Task快速上手 Asp.Net Core 轻松学-多线程之Task(补充)
WebAPI调用笔记 前言 即时通信项目中初次调用OA接口遇到了一些问题,因为本人从业后几乎一直做CS端项目,一个简单的WebAPI调用居然浪费了不少时间,特此记录. 接口描述 首先说明一下,基于 ...
- .NET Core开源任务调度平台ScheduleMaster上新了
ScheduleMaster上一次比较大的更新还是在6月份,转眼已经快过去4个月了,这段时间比较忙,中间只更新过一次修复了几个小bug.要总结这次更新的话,必须要用"千呼万唤始出来" ...
- Asp.Net Core 轻松学-多线程之Task快速上手
前言 Task是从 .NET Framework 4 开始引入的一项基于队列的异步任务(TAP)模式,从 .NET Framework 4.5 开始,任何使用 async/await 进行修饰 ...
- 国外10个ASP.Net C#下的开源CMS
国外10个ASP.Net C#下的开源CMS https://blog.csdn.net/peng_hai_lin/article/details/8612895 1.Ludico Ludico是 ...
- ASP.NET CORE下运行CMD命令
ASP.NET CORE下运行CMD命令,用以前的ASP.NET 的命令System.Diagnostics.Process.Start("notepad");这样是可以运行出记事 ...
- Asp.Net Core下的两种路由配置方式
与Asp.Net Mvc创建区域的时候会自动为你创建区域路由方式不同的是,Asp.Net Core下需要自己手动做一些配置,但更灵活了. 我们先创建一个区域,如下图 然后我们启动访问/Manage/H ...
- 项目开发中的一些注意事项以及技巧总结 基于Repository模式设计项目架构—你可以参考的项目架构设计 Asp.Net Core中使用RSA加密 EF Core中的多对多映射如何实现? asp.net core下的如何给网站做安全设置 获取服务端https证书 Js异常捕获
项目开发中的一些注意事项以及技巧总结 1.jquery采用ajax向后端请求时,MVC框架并不能返回View的数据,也就是一般我们使用View().PartialView()等,只能返回json以 ...
- ASP.Net Core下Authorization的几种方式 - 简书
原文:ASP.Net Core下Authorization的几种方式 - 简书 ASP.Net Core下Authorization的几种方式 Authorization其目标就是验证Http请求能否 ...
随机推荐
- HDU 1114 完全背包问题
题意:有一个存钱罐,空罐时的重量是e,满罐时的重量是f,现在有n种硬币,每一种有无限个,现在给出每一种硬币的价值p和重量w,问存钱罐中最少钱,输出最小钱,否则输出... 思路:变形的完全背包问题,只是 ...
- 2013-10-7 设置combboxItem高度的方法
//首先设置一个较大的 ItemHeight 值,比如 20: //然后设置 ComboBox 的 DrawMode 为 OwnerDrawVariable: //再设置DrawItem事件如下 if ...
- Mule自带例子之stockquote
1 配置效果图 2 配置文件 <?xml version="1.0" encoding="UTF-8"?> <mule version=&qu ...
- H3C 在接口上应用ACL
- 2018-8-10-如何入门-C++-AMP-教程
title author date CreateTime categories 如何入门 C++ AMP 教程 lindexi 2018-08-10 19:16:51 +0800 2018-2-13 ...
- Springboot学习笔记(一)—— 安装
springboot越来越流行了,相比较于springMVC,springboot采用了一种约定大于配置的理念,可以一键安装,一键运行,一键部署,内置tomcat,省去了一大堆配置的时间,并且,spr ...
- P1092 电子表格
题目描述 在流行的电子表格系统中(例如,在Excel中),使用如下计算方式来对列号进行计算. 第1列对应A,第2列对应B,--,第26列对应Z.然后使用两个大写英文字母来表示列:第27列对应AA,第2 ...
- 【u201】矩形覆盖
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 有N个矩形,矩形的底边边长为1,且均在X轴上,高度给出,第i个矩形的高为h[i],例如h = [3, ...
- Linux 线程实现机制分析 Linux 线程实现机制分析 Linux 线程模型的比较:LinuxThreads 和 NPTL
Linux 线程实现机制分析 Linux 线程实现机制分析 Linux 线程模型的比较:LinuxThreads 和 NPTL http://www.ibm.com/developerworks/c ...
- dotnet 使用 System.CommandLine 写命令行程序
在写命令行程序的时候,会遇到命令行解析的问题,以及参数的使用和规范化等坑.现在社区开源了命令行项目,可以帮助小伙伴快速开发命令行程序,支持自动的命令行解析和规范的参数 我写过一篇关于命令行解析的博客C ...