第九节: 利用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 )

复制代码

 1  public class RemoteSchedulerServer2     {3         public static void ShowRemoteScheduler()4         {5             //1. 配置调度器工厂6             var schedulerFactory = new StdSchedulerFactory(new NameValueCollection()7             {8                 {"quartz.scheduler.exporter.type","Quartz.Simpl.RemotingSchedulerExporter,Quartz" },9                 {"quartz.scheduler.exporter.port","5555" },
10                 {"quartz.scheduler.exporter.bindName","QuartzScheduler" },
11             });
12             //2. 创建调度器
13             var scheduler = schedulerFactory.GetScheduler();
14             //3. 配置job和trigger并开启
15             var job = JobBuilder.Create<HelloJob4>()
16                 .WithIdentity("myJob1", "jobGroup1")
17                 .Build();
18             var trigger = TriggerBuilder.Create()
19                 .WithIdentity("myJobTrigger1", "triggerGroup1")
20                 .StartNow()
21                 .WithCronSchedule("/1 * * ? * *")
22                 .Build();
23             scheduler.ScheduleJob(job, trigger);
24             scheduler.Start();
25         }
26     }

复制代码

(2). B服务器,即Client端,用来操控A服务器上Scheduler,下面的代码我在操控job暂停和继续的时候,直接把jobName和GroupName写死了,这里只是为了演示用法而已,实际上可以通过远程代理创建的scheduler来获取所有的job和trigger的。

  (PS:核心点就是StdSchedulerFactory类需要配置 代理,并配置代理地址,即A服务器的地址、port、bindName )

复制代码

 1  public class RemoteSchedulerController : Controller2     {     3         /// <summary>4         /// 前端页面5         /// </summary>6         /// <returns></returns>7         public ActionResult Index()8         {9             return View();
10         }
11         /// <summary>
12         /// 使用代理的方式创建Sheduler
13         /// </summary>
14         static IScheduler scheduler = null;
15         public RemoteSchedulerController()
16         {
17             var schedulerFactory = new StdSchedulerFactory(new System.Collections.Specialized.NameValueCollection()
18             {
19                  {"quartz.scheduler.proxy","true" },  //使用代理
20                  {"quartz.scheduler.proxy.Address","tcp://localhost:5555/QuartzScheduler" }    //Server端的地址是多少,localhost就是多少
21             });
22             scheduler = schedulerFactory.GetScheduler();
23             scheduler.Start();
24         }
25         /// <summary>
26         /// 暂停Job 
27         /// (这里直接从前端默认把名称传过来,实际可以从scheduler中拿到)
28         /// </summary>
29         /// <returns></returns>
30         public ActionResult PauseJob(string jobName, string groupName)
31         {
32             try
33             {
34                 scheduler.PauseJob(new JobKey(jobName, groupName));
35                 return Content("ok");
36             }
37             catch (Exception)
38             {
39 
40                 return Content("error");
41             }
42             
43         }
44         /// <summary>
45         /// 恢复Job
46         /// </summary>
47         /// <returns></returns>
48         public ActionResult ResumeJob(string jobName, string groupName)
49         {
50             try
51             {
52                 scheduler.ResumeJob(new JobKey(jobName, groupName));
53                 return Content("ok");
54             }
55             catch (Exception)
56             {
57 
58                 return Content("error");
59             }
60         }
61     }

复制代码

复制代码

 1 <html>2 <head>3     <meta name="viewport" content="width=device-width" />4     <title>Index</title>5     <script src="~/Scripts/jquery-1.10.2.min.js"></script>6     <script>7         $(function () {8             //1. 暂停9             $("#btn1").on("click", function () {
10                 $.post("PauseJob", { "jobName": "myJob1", "groupName": "jobGroup1" }, function (data) {
11                     if (data=="ok") {
12                         alert("暂停成功");
13                     } else {
14                         alert("失败了");
15                     }
16                 });
17             });
18             //2. 继续
19             $("#btn2").on("click", function () {
20                 $.post("ResumeJob", { "jobName": "myJob1", "groupName": "jobGroup1" }, function (data) {
21                     if (data == "ok") {
22                         alert("继续成功");
23                     } else {
24                         alert("失败了");
25                     }
26                 });
27             });
28         });
29     </script>
30 </head>
31 <body>
32     <div>
33         远程操控另一个服务器端的Sheduler
34     </div>
35     <p></p><p></p><p></p>
36     <button id="btn1">暂停</button>
37     <button id="btn2">继续</button>
38 </body>
39 </html>

 

(3). 运行结果

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438779.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle扩容日志文件,调整Oracle Redo Logfile日志文件的大小

1、扩容lvlvextend -L 1G /dev/oravg/lv_redolog11lvextend -L 1G /dev/oravg/lv_redolog12lvextend -L 1G /dev/oravg/lv_redolog212、调整了一下大小&#xff0c;将每个日志文件调整为2Gselect * from v$logfile;查看属于哪个裸设备。group 1属于/dev/raw/raw10、group 2属于…

渗透技巧——利用netsh抓取连接文件服务器的NTLMv2 Hash

0x00 前言 在上篇文章《Windows下的密码hash——NTLM hash和Net-NTLM hash介绍》比较了NTLM hash和Net-NTLM hash的区别&#xff0c;本文将继续对Net-NTLM hash在内网渗透中的应用作介绍&#xff0c;解决一个有趣的问题&#xff1a; 如果获得了内网一个文件服务器的权限&#…

第十节: 利用SQLServer实现Quartz的持久化和双机热备的集群模式 :

背景&#xff1a; 默认情况下&#xff0c;Quartz.Net作业是持久化在内存中的&#xff0c;即 quartz.jobStore.type "Quartz.Simpl.RAMJobStore, Quartz"&#xff0c;这种模式有以下弊端&#xff1a; ① 想在A服务器上控制B服务器上已经发布了的job和trigger不方便&a…

第十节: 利用SQLServer实现Quartz的持久化和双机热备的集群模式

背景&#xff1a; 默认情况下&#xff0c;Quartz.Net作业是持久化在内存中的&#xff0c;即 quartz.jobStore.type "Quartz.Simpl.RAMJobStore, Quartz"&#xff0c;这种模式有以下弊端&#xff1a; ① 想在A服务器上控制B服务器上已经发布了的job和trigger不方便&a…

任务调度开源框架Quartz动态添加、修改和删除定时任务

Quartz 是个开源的作业调度框架&#xff0c;为在 Java 应用程序中进行作业调度提供了简单却强大的机制。Quartz框架包含了调度器监听、作业和触发器监听。你可以配置作业和触发器监听为全局监听或者是特定于作业和触发器的监听。Quartz 允许开发人员根据时间间隔&#xff08;或…

第十二节: 总结Quartz.Net几种部署模式(IIS、Exe、服务部署【借助TopSelf、服务类】)

一. IIS部署 比如在MVC框架中集成了Quartz.Net定时调度&#xff0c;此时该调度系统会随着MVC框架被挂在IIS下&#xff0c;IIS会进程回收&#xff0c;所以大部分开发都会遇到Quartz挂在IIS下一段时间不好用。 补充&#xff1a;IIS可以设置定时自动回收&#xff0c;默认回收是174…

[你必须知道的.NET] 第二回:对抽象编程:接口和抽象类

本文将介绍以下内容&#xff1a; • 面向对象思想&#xff1a;多态 • 接口 • 抽象类 1. 引言 在我之前的一篇post《抽象类和接口的谁是谁非》中&#xff0c;和同事管伟的讨论&#xff0c;得到很多朋友的关注&#xff0c;因为是不成体系的论道&#xff0c;所以给大家了解造…

Linux 启动失败 磁盘阵列,组建RAID5重启系统,出现md127的解决办法

我这里在组建RAID5之后重启了系统&#xff0c;当时/dev/md0变成了/dev/md127。出现这问题主要是我没有配置生成/etc/mdadm.conf文件&#xff0c;如果哪位伙伴出现类似我这种情况&#xff0c;而不是通过我这种方法解决的&#xff0c;希望能分享一下你的解决方法&#xff0c;谢谢…

[你必须知道的.NET] 第三回:历史纠葛:特性和属性

本文将介绍以下内容&#xff1a; • 定制特性的基本概念和用法 • 属性与特性的区别比较 • 反射的简单介绍 1. 引言 attribute是.NET框架引入的有一技术亮点&#xff0c;因此我们有必要花点时间来了解本文的内容&#xff0c;走进一个发现attribute登堂入室的入口。因为.N…

Linux的性能故障的含义,Linux排查性能故障的方法

好了&#xff0c;鉴于我们的Linux发行版现已安装&#xff0c;许多方面看起来似乎根本不“好”。今天我们将介绍为安装的Linux排查性能故障的方法。虽然今天的这篇文章明显倾向于Ubuntu&#xff0c;但我们探讨的几乎一切内容都同样适用于每个Linux发行版。要是哪些命令是专门针对…

[你必须知道的.NET] 第四回:后来居上:class和struct

本文将介绍以下内容&#xff1a; • 面向对象基本概念 • 类和结构体简介 • 引用类型和值类型区别 1. 引言 提起class和struct&#xff0c;我们首先的感觉是语法几乎相同&#xff0c;待遇却翻天复地。历史将接力棒由面向过程编程传到面向对象编程&#xff0c;class和stru…

linux shell跳板机,用shell开发跳板机

信号列表&#xff1a;在linux中和信号相关的常见命令为kill及trap命令&#xff0c;下来如何利用trap控制跳板机脚本来使用命令&#xff1a;命令&#xff1a;kill -l 和 trap -l企业实战中linux系统的重要信号及说明HUP(1) 挂起INT(2) 中断OUIT(3) 退…

[你必须知道的.NET] 第五回:深入浅出关键字---把new说透

本文将介绍以下内容&#xff1a; 面向对象基本概念new关键字深入浅出对象创建的内存管理 1. 引言 园子里好像没有或者很少把new关键字拿出来说的&#xff0c;那我就占个先机吧&#xff0c;呵呵。那么&#xff0c;我们到底有必要将一个关键字拿出来长篇大论吗&#xff1f;看来…

linux tcp server开源,GitHub - 06linux/cellnet: 高性能,简单,方便的开源服务器网络库...

cellnetcellnet是一个高性能&#xff0c;简单&#xff0c;方便的开源服务器网络库自由混合编码&#xff0c;业务代码无需调整。TCP和html5的应用都可以直接使用cellnet迅速搭建服务器框架。与Java的Netty或Mina网络库类似的Handler机制将给予强大定制功能。特性数据协议支持混合…

[你必须知道的.NET] 第六回:深入浅出关键字---base和this

本文将介绍以下内容&#xff1a; 面向对象基本概念base关键字深入浅出this关键字深入浅出1. 引言 new关键字引起了大家的不少关注&#xff0c;尤其感谢Anders Liu的补充&#xff0c;让我感觉博客园赋予的交流平台真的无所不在。所以&#xff0c;我们就有必要继续这个话题&…

[你必须知道的.NET] 第七回:品味类型---从通用类型系统开始

本文将介绍以下内容&#xff1a; .NET 基础架构概念 类型基础通用类型系统CLI、CTS、CLS的关系简述1. 引言 本文不是连环画&#xff0c;之所以在开篇以图形的形式来展示本文主题&#xff0c;其实就是想更加特别的强调这几个概念的重要性和关注度&#xff0c;同时希望从剖析其关…

[你必须知道的.NET] 第八回:品味类型---值类型与引用类型(上)-内存有理

本文将介绍以下内容&#xff1a; 类型的基本概念 值类型深入引用类型深入值类型与引用类型的比较及应用1. 引言 买了新本本&#xff0c;忙了好几天系统&#xff0c;终于开始了对值类型和引用类型做个全面的讲述了&#xff0c;本系列开篇之时就是因为想写这个主题&#xff0c;…

[你必须知道的.NET]第九回:品味类型---值类型与引用类型(中)-规则无边

接上回[第八回&#xff1a;品味类型---值类型与引用类型&#xff08;上&#xff09;&#xff0d;内存有理]的探讨&#xff0c;继续我们关注值类型和引用类型的话题。 本文将介绍以下内容&#xff1a; 类型的基本概念 值类型深入引用类型深入值类型与引用类型的比较及应用1. 引…

[你必须知道的.NET]第十回:品味类型---值类型与引用类型(下)-应用征途

本文将介绍以下内容&#xff1a; 类型的基本概念 值类型深入引用类型深入值类型与引用类型的比较及应用 [下载]&#xff1a;[类型示例代码] 1. 引言 值类型与引用类型的话题经过了两个回合&#xff08;[第八回&#xff1a;品味类型---值类型与引用类型&#xff08;上&#xf…

[你必须知道的.NET]第十一回:参数之惑---传递的艺术(上)

本文将介绍以下内容&#xff1a; 按值传递与按引用传递深论ref和out比较 参数应用浅析 1. 引言 接上回《第九回&#xff1a;品味类型---值类型与引用类型&#xff08;中&#xff09;&#xff0d;规则无边》中&#xff0c;对值类型和引用类型的讨论&#xff0c;其中关于string…