任务调用及远端管理(基于Quartz.net)
这篇文章我们来了解一些项目中的一个很重要的功能:任务调度
可能有些同学还不了解这个,其实简单点说任务调度与数据库中的Job是很相似的东西
只不过是运行的物理位置与管理方式有点不一样,从功能上来说我觉得还是差不多的,
存储过程有很大的局限性,耦合性也太高,所以最好把系统的一些Job放在代码层,
于是就有了Quartz.net,我们本篇就是针对Quartz.net的二次开发
一、新建HelloJob
HelloJob.cs,示例Job,每次执行都输出msg变量中的信息
using Common.Logging;
using Quartz; namespace Job.Items
{
public class HelloJob : IJob
{
public const string Message = "msg";
private static readonly ILog log = LogManager.GetLogger(typeof(HelloJob)); public virtual void Execute(IJobExecutionContext context)
{
var jobKey = context.JobDetail.Key;
var message = context.JobDetail.JobDataMap.GetString(Message);
log.InfoFormat("HelloJob: msg: {0}", message);
}
}
}
HelloJobExample.cs,每5秒执行一次
public class HelloJobExample
{
public virtual void Run()
{
ISchedulerFactory sf = new StdSchedulerFactory();
IScheduler sched = sf.GetScheduler(); IJobDetail job = JobBuilder.Create<HelloJob>()
.WithIdentity("job1", "group1")
.Build(); JobDataMap map = job.JobDataMap;
map.Put("msg", "Your remotely added job has executed!"); ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.ForJob(job.Key)
.WithCronSchedule("/5 * * ? * *")
.Build(); sched.ScheduleJob(job, trigger);
sched.Start();
}
}
好了,有效代码就那么多,我们来试试
class Program
{
static void Main(string[] args)
{
var example = new HelloJobExample();
example.Run(); Console.ReadKey();
}
}

貌似没什么问题,如愿地执行了。
但是我们想想,实际运行中执行任务的服务器一般都是独立出来的,那怎么去管理这些任务的开启、关闭及暂停呢?
肯定不能每次手动去操作,那太麻烦了。我们的希望是在应用中(系统管理后台)去管理这些任务。万幸Quartz.net足够强大,
他是支持远程操作的,没有太深入了解,不过看调用参数应该是通过TCP请求进行操作的,我们试试看
二、Job远程管理
2.1、新建Job.Items项目,把之前新建的HelloJob.cs放在其中
2.2、新建Job.Server项目
新建RemoteServer.cs
public class RemoteServer : ILjrJob
{
public string Name
{
get { return GetType().Name; }
} public virtual void Run()
{
ILog log = LogManager.GetLogger(typeof(RemoteServer)); NameValueCollection properties = new NameValueCollection();
properties["quartz.scheduler.instanceName"] = "RemoteServer";
properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz";
properties["quartz.threadPool.threadCount"] = "";
properties["quartz.threadPool.threadPriority"] = "Normal";
properties["quartz.scheduler.exporter.type"] = "Quartz.Simpl.RemotingSchedulerExporter, Quartz";
properties["quartz.scheduler.exporter.port"] = "";
properties["quartz.scheduler.exporter.bindName"] = "QuartzScheduler";
properties["quartz.scheduler.exporter.channelType"] = "tcp";
properties["quartz.scheduler.exporter.channelName"] = "httpQuartz";
properties["quartz.scheduler.exporter.rejectRemoteRequests"] = "true";
}
}
2.3、新建控制器HelloJobController
public class HelloJobController : Controller
{
public ActionResult Index()
{
try
{
if (HelloJobHelper.Trigger != null)
{
ViewBag.JobKey = "remotelyAddedJob";
ViewBag.State = HelloJobHelper.Scheduler.GetTriggerState(HelloJobHelper.Trigger.Key);
ViewBag.StartTime = HelloJobHelper.Trigger.StartTimeUtc.ToString();
}
else
{
ViewBag.State = "获取Job执行状态失败";
}
}
catch (Exception ex)
{
ViewBag.State = "Job服务器连接失败";
} return View();
}
public ActionResult Run()
{
HelloJobHelper.RunJob(); return RedirectToAction("Index", "HelloJob");
}
public ActionResult Pause()
{
HelloJobHelper.PauseJob(); return RedirectToAction("Index", "HelloJob");
}
public ActionResult Resume()
{
HelloJobHelper.ResumeJob();
return RedirectToAction("Index", "HelloJob");
}
}
2.4、新建HelloJobHelper
先配置连接远端任务服务器的参数,这个要和上面的RemoteServer.cs对应
1 properties["quartz.scheduler.proxy"] = "true";
2 properties["quartz.scheduler.proxy.address"] = "tcp://127.0.0.1:555/QuartzScheduler";
我们来看看开始操作,运行这个方法,任务服务器将自动开启这个Job
public static void RunJob()
{
if (!scheduler.CheckExists(jobKey))
{
IJobDetail job = JobBuilder.Create<HelloJob>()
.WithIdentity(jobKey)
.Build(); JobDataMap map = job.JobDataMap;
map.Put("msg", "Your remotely added job has executed!"); ITrigger trigger = TriggerBuilder.Create()
.WithIdentity(triggerKey)
.ForJob(job.Key)
.WithCronSchedule("/5 * * ? * *")
.Build(); scheduler.ScheduleJob(job, trigger); JobDetail = job;
Trigger = trigger;
}
}
暂停比较简单
public static void PauseJob()
{
scheduler.PauseJob(jobKey);
}
2.5、View
@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Bootstrap.cshtml";
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
<style>
.col-sm-offset-2 {
margin-left:20px;
}
</style>
</head>
<body>
<br />
@using (Html.BeginForm("Run", "HelloJob", null, FormMethod.Post, new { @id = "form1", @class = "form-horizontal", role = "form" }))
{
@Html.AntiForgeryToken()
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<input type="hidden" name="Id" id="Id" />
<button type="submit" class="btn btn-default">Run</button>
</div>
</div>
}
@using (Html.BeginForm("Pause", "HelloJob", null, FormMethod.Post, new { @id = "form2", @class = "form-horizontal", role = "form" }))
{
@Html.AntiForgeryToken()
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<input type="hidden" name="Id" id="Id" />
<button type="submit" class="btn btn-default">Pause</button>
</div>
</div>
}
@using (Html.BeginForm("Resume", "HelloJob", null, FormMethod.Post, new { @id = "form3", @class = "form-horizontal", role = "form" }))
{
@Html.AntiForgeryToken()
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<input type="hidden" name="Id" id="Id" />
<button type="submit" class="btn btn-default">Resume</button>
</div>
</div>
}
<br />
<div>
<ul>
<li>ViewBag.JobKey: @ViewBag.JobKey</li>
<li>ViewBag.State: @ViewBag.State</li>
<li>ViewBag.StartTime: @ViewBag.StartTime</li>
<li>ViewBag.ExecuteTimes: @ViewBag.ExecuteTimes</li>
</ul>
</div>
</body>
</html>
2.6 好了,我们先运行服务端,开起来就好了

2.7、运行Web

2.7.1 点击Run

2.7.2、点击Pause(暂停)

2.7.3、点击Resume(恢复)

2.8、最后看看项目代码层次,涉及3个:MVC、Job.Items、Job.Server

好了,基本的功能有了。这篇就到这里
任务调用及远端管理(基于Quartz.net)的更多相关文章
- 基于Quartz.NET构建自己的动态作业调度器
在日常的开发中,运行定时任务基本上已经是很普遍的需求了,可以通过windows服务+timer组件来实现,也可以使用第三方框架来集成,Quartz.NET就是一款从JAVA的Quartz移植过来的一个 ...
- 任务调度之持久化(基于Quartz.net)
上一篇我们了解了任务调度及他的远端管理方式,传送门:任务调度及远端管理(基于Quartz.net) 这篇我们要完成任务调度的持久化功能,即新增修改删除之类的功能,这必须得要有的,不然都不知道后台都有什 ...
- RDIFramework.NET框架基于Quartz.Net实现任务调度详解及效果展示
在上一篇Quartz.Net实现作业定时调度详解,我们通过实例代码详细讲解与演示了基于Quartz.NET开发的详细方法.本篇我们主要讲述基于RDIFramework.NET框架整合Quartz.NE ...
- Window服务基于Quartz.Net组件实现定时任务调度(二)
前言: 在上一章中,我们通过利用控制台实现定时任务调度,已经大致了解了如何基于Quartz.Net组件实现任务,至少包括三部分:job(作业),trigger(触发器),scheduler(调度器). ...
- Quartz.NET总结(五)基于Quartz.net 的开源任务管理平台
前面总结了很多,关于Quartz.net 的文章,介绍了如何使用Quartz.net.不清楚的朋友,可以看我之前的系列文章,http://www.cnblogs.com/zhangweizhong/c ...
- 任务调度之集群(基于Quartz.net)
上一篇我们完成了任务调度的持久化,传送门:任务调度之持久化(基于Quartz.net) 这篇我们来完成Quartz.net的一个比较优秀的功能,即集群:集群可以提高任务调度服务的容灾性, 当一个节点宕 ...
- 基于 Quartz.NET 实现可中断的任务
基于 Quartz.NET 实现可中断的任务 Quartz.NET 是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等. Quartz.NET 允许开发 ...
- Java 基于quartz实现定时 之二(XML方式配置)
<!-- 在spring核心配置文件中进行如下配置 --> <!-- Spring基于quartz定时任务 --> <bean id="triggerByBea ...
- 一行代码完成定时任务调度,基于Quartz的UI可视化操作组件 GZY.Quartz.MUI
前言 之前发布过第一个版本,有兴趣的可以去看看: NET Core 基于Quartz的UI可视化操作组件 GZY.Quartz.MUI 简介 GitHub开源地址:l2999019/GZY.Quart ...
随机推荐
- Android仿微信朋友圈,全文收起功能,附源码
在众多的社交类软件中,朋友圈是必不可少的,可以与好友.同学等分享自己的日常和有意思的事情,在开发社交类App时,朋友圈发表的内容你不可能让他全部显示,全部显示的话用户体验度会非常不好,这时就要用到全文 ...
- github在windows下的安装和基本使用
1.在win下安装github时花费的时间是非常长的,有时还会出现因各种原因安装不成功.离线包本地安装方便的解决了此问题.点击http://pan.baidu.com/s/1boGrNLP可下载,解压 ...
- css之line-height
行内框盒子模型1."内容区域"(content area)2."内联盒子"(inline boxes)3."行框盒子"(line boxes ...
- Java排序小算法(冒泡和选择)
package MyTest; import java.util.Scanner; public class BubbleSort { public void Init(int array[]) { ...
- linux安装python3
使用root账号 wget https://www.python.org/ftp/python/3.4.4/Python-3.4.4.tgz tar -zxf Python-3.4.4.tgz cd ...
- webservice基本功能介绍
WebService, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据WebService规范实施的应用之间, 无论它们所使用的语言. 平台或内 ...
- Ansible 系列之 Playbooks 剧本 (1)
一.Playbooks 介绍 1.Playbooks是Ansible的配置,部署和编排语言.它们可以描述您希望远程系统执行的策略,或一般IT流程中的一组步骤. 如果说ansible 模块 是你车间里的 ...
- linux 之 tcpdump
tcpdump详细命令 -i 参数指定监听网口 -c 参数指定监听的数据包数量 -s 参数指定监听数据包大小 -w 参数指定监听数据包写入文件 如果要监听某几台主机数据包 例如10.10.10.10. ...
- FineUIMvc随笔(5)UIHelper是个什么梗?
声明:FineUIMvc(基础版)是免费软件,本系列文章适用于基础版. UIHelper.Result 在 FineUIMvc 的每一个 HttpPost 的控制器方法里面,你都会看到 UIHelpe ...
- SESSION 与 COOKIE的区别是
有以下几点 1.session是存在服务器端,cookie是存在客户端 2.cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,所以session安全性要比cookie ...