第九节: 利用RemoteScheduler实现Sheduler的远程控制
一. RemoteScheduler远程控制
1. 背景: 在A服务器上部署了一个Scheduler,我们想在B服务器上控制这个Scheduler。
2. 猜想: A服务器上的Scheduler需要有地址、需要有端口、需要有名称(实际上也是如此)。
3. 需求: 一个控制台程序作为服务端运行A服务器上(也可以部署成服务),用另一个B服务器上的Web端控制来控制这个Scheduler的暂停、继续等操作。
4. 具体实现:
①:A服务器上的Server端的Scheduler需要配置port和bindName两个核心参数,用来对外公开。
②:B服务器上Client端的Scheduler的创建需要使用代理,并配置其地址(A服务器上对外公开的)。
(原理:通过代理获取A服务器中的Scheduler,然后获取里面的job和trigger,然后可以配置job和trigger的开启、关闭、编辑等,这里以操控job的暂停和继续为例,介绍其使用思路,详细的如何操控trigger或者编辑等,详解后面框架章节)
代码分享:
(1). A服务器上,即被控制端的Server端,这里我们用控制台程序代替。
(PS:核心点就是StdSchedulerFactory类需要配置 type、port、bindName )
public class RemoteSchedulerServer
{
public static void ShowRemoteScheduler()
{
//1. 配置调度器工厂
var schedulerFactory = new StdSchedulerFactory(new NameValueCollection()
{
{"quartz.scheduler.exporter.type","Quartz.Simpl.RemotingSchedulerExporter,Quartz" },
{"quartz.scheduler.exporter.port","" },
{"quartz.scheduler.exporter.bindName","QuartzScheduler" },
});
//2. 创建调度器
var scheduler = schedulerFactory.GetScheduler();
//3. 配置job和trigger并开启
var job = JobBuilder.Create<HelloJob4>()
.WithIdentity("myJob1", "jobGroup1")
.Build();
var trigger = TriggerBuilder.Create()
.WithIdentity("myJobTrigger1", "triggerGroup1")
.StartNow()
.WithCronSchedule("/1 * * ? * *")
.Build();
scheduler.ScheduleJob(job, trigger);
scheduler.Start();
}
}
(2). B服务器,即Client端,用来操控A服务器上Scheduler,下面的代码我在操控job暂停和继续的时候,直接把jobName和GroupName写死了,这里只是为了演示用法而已,实际上可以通过远程代理创建的scheduler来获取所有的job和trigger的。
(PS:核心点就是StdSchedulerFactory类需要配置 代理,并配置代理地址,即A服务器的地址、port、bindName )
public class RemoteSchedulerController : Controller
{
/// <summary>
/// 前端页面
/// </summary>
/// <returns></returns>
public ActionResult Index()
{
return View();
}
/// <summary>
/// 使用代理的方式创建Sheduler
/// </summary>
static IScheduler scheduler = null;
public RemoteSchedulerController()
{
var schedulerFactory = new StdSchedulerFactory(new System.Collections.Specialized.NameValueCollection()
{
{"quartz.scheduler.proxy","true" }, //使用代理
{"quartz.scheduler.proxy.Address","tcp://localhost:5555/QuartzScheduler" } //Server端的地址是多少,localhost就是多少
});
scheduler = schedulerFactory.GetScheduler();
scheduler.Start();
}
/// <summary>
/// 暂停Job
/// (这里直接从前端默认把名称传过来,实际可以从scheduler中拿到)
/// </summary>
/// <returns></returns>
public ActionResult PauseJob(string jobName, string groupName)
{
try
{
scheduler.PauseJob(new JobKey(jobName, groupName));
return Content("ok");
}
catch (Exception)
{ return Content("error");
} }
/// <summary>
/// 恢复Job
/// </summary>
/// <returns></returns>
public ActionResult ResumeJob(string jobName, string groupName)
{
try
{
scheduler.ResumeJob(new JobKey(jobName, groupName));
return Content("ok");
}
catch (Exception)
{ return Content("error");
}
}
}
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script>
$(function () {
//1. 暂停
$("#btn1").on("click", function () {
$.post("PauseJob", { "jobName": "myJob1", "groupName": "jobGroup1" }, function (data) {
if (data=="ok") {
alert("暂停成功");
} else {
alert("失败了");
}
});
});
//2. 继续
$("#btn2").on("click", function () {
$.post("ResumeJob", { "jobName": "myJob1", "groupName": "jobGroup1" }, function (data) {
if (data == "ok") {
alert("继续成功");
} else {
alert("失败了");
}
});
});
});
</script>
</head>
<body>
<div>
远程操控另一个服务器端的Sheduler
</div>
<p></p><p></p><p></p>
<button id="btn1">暂停</button>
<button id="btn2">继续</button>
</body>
</html>
(3). 运行结果



第九节: 利用RemoteScheduler实现Sheduler的远程控制的更多相关文章
- 第九节: 利用RemoteScheduler实现Sheduler的远程控制 第八节: Quartz.Net五大构件之SimpleThreadPool及其四种配置方案 第六节: 六类Calander处理六种不同的时间场景 第五节: Quartz.Net五大构件之Trigger的四大触发类 第三节: Quartz.Net五大构件之Scheduler(创建、封装、基本方法等)和Job(创建、关联
第九节: 利用RemoteScheduler实现Sheduler的远程控制 一. RemoteScheduler远程控制 1. 背景: 在A服务器上部署了一个Scheduler,我们想在B服务器上 ...
- CUDA:Supercomputing for the Masses (用于大量数据的超级计算)-第九节
原文链接 第九节:使用CUDA拓展高等级语言 Rob Farber 是西北太平洋国家实验室(Pacific Northwest National Laboratory)的高级科研人员.他在多个国家级的 ...
- JAVA 年轻代收集器 第九节
JAVA 年轻代收集器 第九节 继续上一章所讲的,STW即GC时候的停顿时间,他会暂停我们程序中的所有线程.如果STW所用的时间长而且次数多的话,那么我们整个系统稳定性以及可用性将大大降低. 因此我 ...
- centos 文档的压缩和打包 gzip,bzip2,xz,zip,unzip,tar,tgz 第九节课
centos 文档的压缩和打包 gzip,bzip2,xz,zip,unzip,tar,tgz 第九节课 SAS盘可以支持热插拔,看机器 tar.zip.tar -czvf 不会动源文件,gz ...
- 《C Prime Plus》第九节笔记
第九节 函数 9.1 复习函数 函数原型 function prototype 函数调用 function call 函数定义 function definition 形参 实参 典型的ANSI C函 ...
- [ExtJS5学习笔记]第九节 Extjs5的mvc与mvvm框架结构简介
本文地址:http://blog.csdn.net/sushengmiyan/article/details/38537431 本文作者:sushengmiyan ------------------ ...
- 第九节:基于MVC5+AutoFac+EF+Log4Net的基础结构搭建
一. 前言 从本节开始,将陆续的介绍几种框架搭建组合形式,分析每种搭建形式的优势和弊端,剖析搭建过程中涉及到的一些思想和技巧. (一). 技术选型 1. DotNet框架:4.6 2. 数据库访问:E ...
- java第九节 网络编程的基础知识
/** * * 网络编程的基础知识 * 网络协议与TCP/IP * IP地址和Port(端口号) * 本地回路的IP地址:127.0.0.1 * 端口号的范围为0-65535之间,0-1023之间的端 ...
- 第14.5节 利用浏览器获取的http信息构造Python网页访问的http请求头
一. 引言 在<第14.3节 使用google浏览器获取网站访问的http信息>和<第14.4节 使用IE浏览器获取网站访问的http信息>中介绍了使用Google浏览器和IE ...
随机推荐
- SpringBoot使用注解实现事务管理
conttoller controller和普通的controller类一样, 不用改变 @RequestMapping(value = "/path/{id}", method ...
- 在Linux系统中同步更新我们的Github博客
原理介绍 类似于版本管理,我们把我们的hexo博客文件系统在Github上建立一个分支,通过管理分支提交最新的博客文件系统,保证我们博客框架的更新.然后我们基于最新的博客框架,撰写文章,进行Githu ...
- Linux删除文件夹和修改文件名
rm [选项] 文件 -f, --force 强力删除,不要求确认 -i 每删除一个文件或进入一个子目录都要求确认 -I 在删除超过三个文件或者递归删除前要求确认 -r, -R 递归删除子目录 -d, ...
- MySQL常用日期时间函数
日期和时间函数: MySQL服务器中的三种时区设置: ①系统时区---保存在系统变量system_time_zone ②服务器时区---保存在全局系统变量global.time_zone ③每个客户端 ...
- Oracle 执行计划(一)-------基本介绍
本文参照自:https://www.cnblogs.com/Dreamer-1/p/6076440.html 打开SQL执行计划: 1.选中一句正在执行的SQL 2.F5快捷键,就会出现下图,这就是执 ...
- keras 中模型的保存
参考:https://www.cnblogs.com/weiyinfu/p/9788179.html#0 1.model.summary() 这个函数会打印模型结构,但是仅仅是打印到控制台,不能保存 ...
- 程序员如何开始做一个自己的 Side Project?
此系列文章我们开始聊一些软件开发人员如何开始动手写一些自己项目(Side Project)的思路与方法,以及过程中可能需要准备的知识,并分享一些相关的资源给大家. 1. 什么是 Side Projec ...
- OCR技术浅析-自写篇(2)
本例仅以本人浅薄理解,妄想自制文字识别程序,实际在识别部分未有完善. <?php class readChar{ private $imgSize; //图片尺寸 private $imgGd2 ...
- KeyError: 'Spider not found: test'
Error Msg: File "c:\python36\lib\site-packages\scrapy\cmdline.py", line 157, in _run_comma ...
- Python--day04(流程控制)
day03主要内容回顾 1.变量名命名规范 -- 1.只能由数字.字母 及 _ 组成 -- 2.不能以数字开头 -- 3.不能与系统关键字重名 -- 4._开头有特殊含义 -- 5.__开头__结尾的 ...