第九节: 利用RemoteScheduler实现Sheduler的远程控制
2018-03-15 14:54
281 查看
一. 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 )
(2). B服务器,即Client端,用来操控A服务器上Scheduler,下面的代码我在操控job暂停和继续的时候,直接把jobName和GroupName写死了,这里只是为了演示用法而已,实际上可以通过远程代理创建的scheduler来获取所有的job和trigger的。
(PS:核心点就是StdSchedulerFactory类需要配置 代理,并配置代理地址,即A服务器的地址、port、bindName )
(3). 运行结果
![](https://oscdn.geek-share.com/Uploads/Images/Content/201803/72db4e250aac271df2689e24559de5fd.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201803/1cdc0af6ebe50dbad56c98d69fc2aebc.png)
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","5555" }, {"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). 运行结果
![](https://oscdn.geek-share.com/Uploads/Images/Content/201803/72db4e250aac271df2689e24559de5fd.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201803/1cdc0af6ebe50dbad56c98d69fc2aebc.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201803/019d69ff6f236ea81afbcb902d34c4d1.jpg)
相关文章推荐
- 利用远程桌面连接实现外网对局域网计算机的控制
- 利用python收发邮件功能实现远程电脑的控制
- 利用Windows2003 IP安全策略实现服务器远程桌面端口(3389)访问控制
- 利用Windows2003 IP安全策略实现服务器远程桌面端口(3389)访问控制
- 利用Windows2000实现远程控制
- 利用websm和vnc实现远程控制HMC
- 利用QQ轻松实现远程控制
- 利用远程桌面连接实现外网对局域网计算机的控制
- 利用远程桌面连接实现外网对局域网计算机的控制
- 【项目实践】利用Axure和SVN实现版本控制
- java利用jcraft实现和远程服务器交互,实现上传下载文件
- JAVA实现屏幕抓图 远程桌面控制
- MQTT是IBM开发的一个即时通讯协议,构建于TCP/IP协议上,是物联网IoT的订阅协议,借助消息推送功能,可以更好地实现远程控制
- 利用匿名管道实现远程CMD
- 【酱菜创客】ESP8266连接服务器实现远程控制LED灯
- 利用Ptrace在Android平台实现应用程序控制
- java网络编程--解析通过web.xml文件控制利用过滤器实现编码格式步骤
- Linux操作系统下利用SSH进行远程控制
- Linux操作系统下利用SSH进行远程控制
- 使用VisualSVNServer+花生壳实现远程协同开发版本控制