第九节: 利用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","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). 运行结果

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值