第九節: 利用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 RemoteSchedulerServer
 2     {
 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 : Controller
 2     {     
 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). 運行結果

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM