一、cron表达式简单介绍和下载

  1、在上一篇博客“Quartz.net 定时任务之简单任务”中,我简单介绍了quartz的使用,而这篇博客我将介绍cron的具体使用(不足之处望大神斧正)

  1、cron是为了方便编写定时执行作业时间扩展出来的插件,这个有很多版本(网页版,窗体版等),cron表达式的存在,从而大大减低设置作业人员的操作难度和开发人员的编写难度。

  2、cron表达式下载地址:https://www.oschina.net/code/snippet_98719_23426 下载下来之后,我打开页面我们会看到如下的界面  (为网页版)

  

   注:如果网页路径失效,或者下载失败的码友,请不要着急,继续往下看

二、cron表达式的使用

  1、在网上也看到了很多关于cron的使用说明的文章(在此感谢各位好心分享的大神),运用cron表达式有2个关键的地方

    (1)、cron的怎么使用到项目中?

    (2)、cron表达式怎么反解析到对应的输入框中?

  2、cron运用到项目中和反解析

    (1)、在上一篇博客中,我简单介绍了quartz的使用,从而会有一些小bug和美观不足的缺点,在编写这篇博客之前我做了小小的美化,如下图

  

  注:模板是使用的layer后台框架   模板编写者:Layui_初学者

  laery下载地址:http://layer.layui.com/

  (2)、这次美化之后后台的架构也做了小小的变化。下面截图说明

  

 (3)、把下载好的layer放在Js->lib->layer文件夹下  说明Js->lib文件夹下放了jquery 这里不做介绍

 (4)、好了回归正题,在大家在上面的截图可以看出,下载下来的Cron表达式存放路径是在Content->Cron 路径,下面我们需要一个容器来放cron的页面,建立控制器(Quartz)如下

  

  可以看到在quartz控制器里面我们建立了2个视图 CronUse 视图、SetCron视图,不难看出两个视图的作用  CronUse视图是我们使用Cron的视图,SetCron是我们设置Cron的视图

  (5)、2个视图分别建好之后,我们在CronUse视图编写如下代码

 @{
ViewBag.Title = "Cron的使用";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<link href="~/Content/BeginnerAdmin/plugins/layui/css/layui.css" rel="stylesheet" />
<link href="~/Content/BeginnerAdmin/css/global.css" rel="stylesheet" />
<script src="~/Js/lib/jquery-3.2.1/jquery-3.2.1.js"></script>
<script src="~/Js/lib/layer/layer.js"></script>
<script src="~/Js/lib/jquery-3.2.1/jquery-3.2.1.min.js"></script> <div class="layui-form-item">
<label class="layui-form-label">Cron表达式</label>
<div class="layui-input-block" style="width:200px">
<input type="text" id="Cron" name="title" onclick="SetCron()" required lay-verify="required" placeholder="点击设置Cron表达式" autocomplete="off" class="layui-input">
</div>
</div> <fieldset class="layui-elem-field site-demo-button">
<legend>任务控制区</legend>
<div>
<button id="OpenTask" class="layui-btn">开启任务</button>
<button id="CloseTask" class="layui-btn layui-btn-danger">关闭任务</button>
</div>
</fieldset> <script type="text/javascript">
function SetCron() {
layer.open({
type: ,
area: ['870px', '660px'],
fixed: false, //不固定
maxmin: true,
content: '/Quartz/SetCron'
});
// window.open("/Quartz/SetCron", "", "top=100,left=300,width=870,height=660");
} $(document).ready(function () {
$("#OpenTask").click(function () {
var cron = $("#Cron").val();
if (cron === '') {
layer.tips('请设置Cron表达式', '#Cron', {
tips:
});
return false;
}
$.ajax({
url: "CronQuartzs",
type: 'post',
data: { cron: cron },
dataType: "json",
async: "false",
success: function (data) {
if (data.ResultSign === ) {
layer.alert("开启成功");
} else {
layer.alert("开启失败--" + "错误信息:" + data.Message);
}
}
});
});
$("#CloseTask").click(function () {
$.ajax({
url: "CloseTask",
type: 'post',
data: {},
dataType: "json",
async: "false",
success: function (data) {
if (data.ResultSign === ) {
layer.alert("关闭成功");
} else {
layer.alert("关闭失败--" + "错误信息:" + data.Message);
}
}
});
});
});
</script>

  (6)、在SetCron视图编写如下代码

 @{
ViewBag.Title = "设置Cron";
Layout = null;
} <!DOCTYPE html>
<html>
<head>
<title>Cron表达式生成器</title>
<link href="~/Content/Cron/easyui.css" rel="stylesheet" type="text/css" />
<link href="~/Content/Cron/icon.css" rel="stylesheet" type="text/css" />
<script src="~/Js/lib/jquery-3.2.1/jquery-3.2.1.min.js"></script>
<script src="~/Content/Cron/jquery.easyui.min.js" type="text/javascript"></script>
<script src="~/Content/Cron/cron.js" type="text/javascript"></script>
<script src="~/Js/lib/layer/layer.js"></script>
<style type="text/css">
.line {
height: 25px;
line-height: 25px;
margin: 3px;
} .imp {
padding-left: 25px;
} .col {
width: 95px;
}
</style>
@*来源于http://jason.hahuachou.com/cron/index.htm网站,并下载源代码。*@
</head>
<body> <center>
<div class="easyui-layout" style="width: 830px; height: 540px; border: 1px rgb(202, 196, 196) solid;
border-radius: 5px;">
<div style="height: 100%;">
<div class="easyui-tabs" data-options="fit:true,border:false">
<div title="秒">
<div class="line">
<input type="radio" checked="checked" name="second" onclick="everyTime(this)">
每秒 允许的通配符[, - * /]
</div>
<div class="line">
<input type="radio" name="second" onclick="cycle(this)">
周期从
<input class="numberspinner" style="width: 60px;" data-options="min:1,max:58" value=""
id="secondStart_0">
-
<input class="numberspinner" style="width: 60px;" data-options="min:2,max:59" value=""
id="secondEnd_0">

</div>
<div class="line">
<input type="radio" name="second" onclick="startOn(this)">

<input class="numberspinner" style="width: 60px;" data-options="min:0,max:59" value=""
id="secondStart_1">
秒开始,每
<input class="numberspinner" style="width: 60px;" data-options="min:1,max:59" value=""
id="secondEnd_1">
秒执行一次
</div>
<div class="line">
<input type="radio" name="second" id="sencond_appoint">
指定每分钟在第几秒执行
</div>
<div class="imp secondList">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
</div>
<div class="imp secondList">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
</div>
<div class="imp secondList">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
</div>
<div class="imp secondList">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
</div>
<div class="imp secondList">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
</div>
<div class="imp secondList">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
</div>
</div>
<div title="分钟">
<div class="line">
<input type="radio" checked="checked" name="min" onclick="everyTime(this)">
分钟 允许的通配符[, - * /]
</div>
<div class="line">
<input type="radio" name="min" onclick="cycle(this)">
周期从
<input class="numberspinner" style="width: 60px;" data-options="min:1,max:58" value=""
id="minStart_0">
-
<input class="numberspinner" style="width: 60px;" data-options="min:2,max:59" value=""
id="minEnd_0">
分钟
</div>
<div class="line">
<input type="radio" name="min" onclick="startOn(this)">

<input class="numberspinner" style="width: 60px;" data-options="min:0,max:59" value=""
id="minStart_1">
分钟开始,每
<input class="numberspinner" style="width: 60px;" data-options="min:1,max:59" value=""
id="minEnd_1">
分钟执行一次
</div>
<div class="line">
<input type="radio" name="min" id="min_appoint">
指定每小时在第几分执行
</div>
<div class="imp minList">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
</div>
<div class="imp minList">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
</div>
<div class="imp minList">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
</div>
<div class="imp minList">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
</div>
<div class="imp minList">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
</div>
<div class="imp minList">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
</div>
</div>
<div title="小时">
<div class="line">
<input type="radio" checked="checked" name="hour" onclick="everyTime(this)">
小时 允许的通配符[, - * /]
</div>
<div class="line">
<input type="radio" name="hour" onclick="cycle(this)">
周期从
<input class="numberspinner" style="width: 60px;" data-options="min:0,max:23" value=""
id="hourStart_0">
-
<input class="numberspinner" style="width: 60px;" data-options="min:2,max:23" value=""
id="hourEnd_1">
小时
</div>
<div class="line">
<input type="radio" name="hour" onclick="startOn(this)">

<input class="numberspinner" style="width: 60px;" data-options="min:0,max:23" value=""
id="hourStart_1">
小时开始,每
<input class="numberspinner" style="width: 60px;" data-options="min:1,max:23" value=""
id="hourEnd_1">
小时执行一次
</div>
<div class="line">
<input type="radio" name="hour" id="hour_appoint">
指定每天在第几小时执行
</div>
<div class="imp hourList">
AM:
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
</div>
<div class="imp hourList">
PM:
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
</div>
</div>
<div title="日">
<div class="line">
<input type="radio" checked="checked" name="day" onclick="everyTime(this)">
日 允许的通配符[, - * / L W]
</div>
<div class="line">
<input type="radio" name="day" onclick="unAppoint(this)">
不指定
</div>
<div class="line">
<input type="radio" name="day" onclick="cycle(this)">
周期从
<input class="numberspinner" style="width: 60px;" data-options="min:1,max:31" value=""
id="dayStart_0">
-
<input class="numberspinner" style="width: 60px;" data-options="min:2,max:31" value=""
id="dayEnd_0">

</div>
<div class="line">
<input type="radio" name="day" onclick="startOn(this)">

<input class="numberspinner" style="width: 60px;" data-options="min:1,max:31" value=""
id="dayStart_1">
日开始,每
<input class="numberspinner" style="width: 60px;" data-options="min:1,max:31" value=""
id="dayEnd_1">
天执行一次
</div>
<div class="line">
<input type="radio" name="day" onclick="workDay(this)">
每月
<input class="numberspinner" style="width: 60px;" data-options="min:1,max:31" value=""
id="dayStart_2">
号最近的那个工作日
</div>
<div class="line">
<input type="radio" name="day" onclick="lastDay(this)">
本月最后一天
</div>
<div class="line">
<input type="radio" name="day" id="day_appoint">
指定每月在第几日执行
</div>
<div class="imp dayList">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
</div>
<div class="imp dayList">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
</div>
</div>
<div title="月">
<div class="line">
<input type="radio" checked="checked" name="mouth" onclick="everyTime(this)">
月 允许的通配符[, - * /]
</div>
<div class="line">
<input type="radio" name="mouth" onclick="unAppoint(this)">
不指定
</div>
<div class="line">
<input type="radio" name="mouth" onclick="cycle(this)">
周期从
<input class="numberspinner" style="width: 60px;" data-options="min:1,max:12" value=""
id="mouthStart_0">
-
<input class="numberspinner" style="width: 60px;" data-options="min:2,max:12" value=""
id="mouthEnd_0">

</div>
<div class="line">
<input type="radio" name="mouth" onclick="startOn(this)">

<input class="numberspinner" style="width: 60px;" data-options="min:1,max:12" value=""
id="mouthStart_1">
日开始,每
<input class="numberspinner" style="width: 60px;" data-options="min:1,max:12" value=""
id="mouthEnd_1">
月执行一次
</div>
<div class="line">
<input type="radio" name="mouth" id="mouth_appoint">
指定每年在第几月执行
</div>
<div class="imp mouthList">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
</div>
</div>
<div title="周">
<div class="line">
<input type="radio" checked="checked" name="week" onclick="everyTime(this)">
周 允许的通配符[, - * / L #]
</div>
<div class="line">
<input type="radio" name="week" onclick="unAppoint(this)">
不指定
</div>
<div class="line">
<input type="radio" name="week" onclick="startOn(this)">
周期 从星期<input class="numberspinner" style="width: 60px;" data-options="min:1,max:7"
id="weekStart_0" value="">
-
<input class="numberspinner" style="width: 60px;" data-options="min:2,max:7" value=""
id="weekEnd_0">
</div>
<div class="line">
<input type="radio" name="week" onclick="weekOfDay(this)">
第<input class="numberspinner" style="width: 60px;" data-options="min:1,max:4" value=""
id="weekStart_1">
周 的星期<input class="numberspinner" style="width: 60px;" data-options="min:1,max:7"
id="weekEnd_1" value="">
</div>
<div class="line">
<input type="radio" name="week" onclick="lastWeek(this)">
本月最后一个星期<input class="numberspinner" style="width: 60px;" data-options="min:1,max:7"
id="weekStart_2" value="">
</div>
<div class="line">
<input type="radio" name="week" id="week_appoint">
指定在周几执行
</div>
<div class="imp weekList">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
<input type="checkbox" value="">
</div>
</div>
<div title="年">
<div class="line">
<input type="radio" checked="checked" name="year" onclick="unAppoint(this)">
不指定 允许的通配符[, - * /] 非必填
</div>
<div class="line">
<input type="radio" name="year" onclick="everyTime(this)">
每年
</div>
<div class="line">
<input type="radio" name="year" onclick="cycle(this)">周期 从
<input class="numberspinner" style="width: 90px;" data-options="min:2013,max:3000"
id="yearStart_0" value="">
-
<input class="numberspinner" style="width: 90px;" data-options="min:2014,max:3000"
id="yearEnd_0" value="">
</div>
</div>
</div>
</div>
<div data-options="region:'south',border:false" style="height: 230px">
<fieldset style="border-radius: 3px; height: 116px;">
<legend>表达式</legend>
<table style="height: 100px;">
<tbody>
<tr>
<td></td>
<td align="center">

</td>
<td align="center">
分钟
</td>
<td align="center">
小时
</td>
<td align="center">

</td>
<td align="center">
月<br />
</td>
<td align="center">
星期
</td>
<td align="center">

</td>
</tr>
<tr>
<td>
表达式字段:
</td>
<td>
<input type="text" name="v_second" class="col" value="*" readonly="readonly" />
</td>
<td>
<input type="text" name="v_min" class="col" value="*" readonly="readonly" />
</td>
<td>
<input type="text" name="v_hour" class="col" value="*" readonly="readonly" />
</td>
<td>
<input type="text" name="v_day" class="col" value="*" readonly="readonly" />
</td>
<td>
<input type="text" name="v_mouth" class="col" value="*" readonly="readonly" />
</td>
<td>
<input type="text" name="v_week" class="col" value="?" readonly="readonly" />
</td>
<td>
<input type="text" name="v_year" class="col" readonly="readonly" />
</td>
</tr>
<tr>
<td>Cron 表达式:</td>
<td colspan="">
<input type="text" name="cron" style="width: 100%;" value="* * * * * ?" id="cron" />
</td>
<td><input type="button" value="反解析到UI " id="bt" onclick="btnFan()" /></td>
</tr>
</tbody>
</table>
</fieldset>
<div style="text-align: center; margin-top: 5px;">
<script type="text/javascript">
/*killIe*/
$.parser.parse($("body"));
var cpro_id = "u1331261";
var id = getQueryString("id");
function btnFan() {
//获取参数中表达式的值
var txt = $("#cron").val();
if (txt) {
var regs = txt.split(' ');
$("input[name=v_second]").val(regs[]);
$("input[name=v_min]").val(regs[]);
$("input[name=v_hour]").val(regs[]);
$("input[name=v_day]").val(regs[]);
$("input[name=v_mouth]").val(regs[]);
$("input[name=v_week]").val(regs[]); initObj(regs[], "second");
initObj(regs[], "min");
initObj(regs[], "hour");
initDay(regs[]);
initMonth(regs[]);
initWeek(regs[]); if (regs.length > ) {
$("input[name=v_year]").val(regs[]);
initYear(regs[]);
}
}
// 使用layer把子窗口的值传给父窗口
var index = parent.layer.getFrameIndex(window.name); // 得到索引
parent.$('#Cron').val(txt);
parent.layer.close(index);
} function initObj(strVal, strid) {
var ary = null;
var objRadio = $("input[name='" + strid + "'");
if (strVal == "*") {
objRadio.eq().attr("checked", "checked");
} else if (strVal.split('-').length > ) {
ary = strVal.split('-');
objRadio.eq().attr("checked", "checked");
$("#" + strid + "Start_0").numberspinner('setValue', ary[]);
$("#" + strid + "End_0").numberspinner('setValue', ary[]);
} else if (strVal.split('/').length > ) {
ary = strVal.split('/');
objRadio.eq().attr("checked", "checked");
$("#" + strid + "Start_1").numberspinner('setValue', ary[]);
$("#" + strid + "End_1").numberspinner('setValue', ary[]);
} else {
objRadio.eq().attr("checked", "checked");
if (strVal != "?") {
ary = strVal.split(",");
for (var i = ; i < ary.length; i++) {
$("." + strid + "List input[value='" + ary[i] + "']").attr("checked", "checked");
}
}
}
} function initDay(strVal) {
var ary = null;
var objRadio = $("input[name='day'");
if (strVal == "*") {
objRadio.eq().attr("checked", "checked");
} else if (strVal == "?") {
objRadio.eq().attr("checked", "checked");
} else if (strVal.split('-').length > ) {
ary = strVal.split('-');
objRadio.eq().attr("checked", "checked");
$("#dayStart_0").numberspinner('setValue', ary[]);
$("#dayEnd_0").numberspinner('setValue', ary[]);
} else if (strVal.split('/').length > ) {
ary = strVal.split('/');
objRadio.eq().attr("checked", "checked");
$("#dayStart_1").numberspinner('setValue', ary[]);
$("#dayEnd_1").numberspinner('setValue', ary[]);
} else if (strVal.split('W').length > ) {
ary = strVal.split('W');
objRadio.eq().attr("checked", "checked");
$("#dayStart_2").numberspinner('setValue', ary[]);
} else if (strVal == "L") {
objRadio.eq().attr("checked", "checked");
} else {
objRadio.eq().attr("checked", "checked");
ary = strVal.split(",");
for (var i = ; i < ary.length; i++) {
$(".dayList input[value='" + ary[i] + "']").attr("checked", "checked");
}
}
} function initMonth(strVal) {
var ary = null;
var objRadio = $("input[name='mouth'");
if (strVal == "*") {
objRadio.eq().attr("checked", "checked");
} else if (strVal == "?") {
objRadio.eq().attr("checked", "checked");
} else if (strVal.split('-').length > ) {
ary = strVal.split('-');
objRadio.eq().attr("checked", "checked");
$("#mouthStart_0").numberspinner('setValue', ary[]);
$("#mouthEnd_0").numberspinner('setValue', ary[]);
} else if (strVal.split('/').length > ) {
ary = strVal.split('/');
objRadio.eq().attr("checked", "checked");
$("#mouthStart_1").numberspinner('setValue', ary[]);
$("#mouthEnd_1").numberspinner('setValue', ary[]); } else {
objRadio.eq().attr("checked", "checked"); ary = strVal.split(",");
for (var i = ; i < ary.length; i++) {
$(".mouthList input[value='" + ary[i] + "']").attr("checked", "checked");
}
}
} function initWeek(strVal) {
var ary = null;
var objRadio = $("input[name='week'");
if (strVal == "*") {
objRadio.eq().attr("checked", "checked");
} else if (strVal == "?") {
objRadio.eq().attr("checked", "checked");
} else if (strVal.split('/').length > ) {
ary = strVal.split('/');
objRadio.eq().attr("checked", "checked");
$("#weekStart_0").numberspinner('setValue', ary[]);
$("#weekEnd_0").numberspinner('setValue', ary[]);
} else if (strVal.split('-').length > ) {
ary = strVal.split('-');
objRadio.eq().attr("checked", "checked");
$("#weekStart_1").numberspinner('setValue', ary[]);
$("#weekEnd_1").numberspinner('setValue', ary[]);
} else if (strVal.split('L').length > ) {
ary = strVal.split('L');
objRadio.eq().attr("checked", "checked");
$("#weekStart_2").numberspinner('setValue', ary[]);
} else {
objRadio.eq().attr("checked", "checked");
ary = strVal.split(",");
for (var i = ; i < ary.length; i++) {
$(".weekList input[value='" + ary[i] + "']").attr("checked", "checked");
}
}
} function initYear(strVal) {
var ary = null;
var objRadio = $("input[name='year'");
if (strVal == "*") {
objRadio.eq().attr("checked", "checked");
} else if (strVal.split('-').length > ) {
ary = strVal.split('-');
objRadio.eq().attr("checked", "checked");
$("#yearStart_0").numberspinner('setValue', ary[]);
$("#yearEnd_0").numberspinner('setValue', ary[]);
}
} </script> <div>
</div>
</div>
</div>
<div>
</div>
</div>
</center>
</body>
</html>

  (7)、_Layout视图是我们的模板页代码如下   注:路径看CronUse页面

 <!DOCTYPE html>

 <html>

 <head>
<meta charset="utf-8">
<title>后台管理模板</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="format-detection" content="telephone=no">
</head> <body>
@RenderBody()
</body> </html>

  (8)、视图搭建好之后、我们在写后端实现quartz控制器  代码如下

  /// <summary>
/// 设置Cron时间开启方法
/// </summary>
/// <param name="cron"></param>
/// <returns></returns>
public JsonResult CronQuartzs(string cron)
{
OperateStatus statu = new OperateStatus();
try
{
LogTool.DetailLogRecord("CronLog", LogTool.FolderCreationType.None, "创建调度器成功", false);
_sched.Start();
IJobDetail job = JobBuilder.Create<CronJob>()
.WithIdentity("Cron作业名称", "Cron作业分组")
.Build();
// 触发作业
ITrigger trigger = TriggerBuilder.Create() #region 使用cron 规则 .WithIdentity("Cron触发器名称", "Cron触发器分组")
.WithCronSchedule(cron) // 你设置的执行时间
.StartAt(DateTime.UtcNow)
.WithPriority()
.Build();
#endregion // 将作业和触发器添加到调度器
_sched.ScheduleJob(job, trigger);
statu.Message = "开启成功";
statu.ResultSign = ResultSign.Successful;
//return Json(statu);
}
catch (Exception ex)
{
statu.Message = ex.Message;
statu.ResultSign = ResultSign.Error; }
return Json(statu);
} /// <summary>
/// 关闭任务
/// </summary>
public JsonResult CloseTask()
{
OperateStatus statu = new OperateStatus();
try
{
_sched.Shutdown();
statu.Message = "关闭成功";
statu.ResultSign = ResultSign.Successful;
}
catch (Exception ex)
{
statu.Message = ex.Message;
statu.ResultSign = ResultSign.Error;
}
return Json(statu);
}

  (9)、后端的实现是和前一篇博客相差不大的,但有2点不同是我们重新建立了一个作业类(CronJob)   CronJob存放路径在Job文件夹下和OperateStatus消息提示类 OperateStatus存放路径Tool->Message文件夹下  代码如下

  CronJob类

  public class CronJob:IJob
{ /// <summary>
/// 作业默认实现接口
/// </summary>
/// <param name="context"></param>
public void Execute(IJobExecutionContext context)
{
LogTool.DetailLogRecord("CronLog", LogTool.FolderCreationType.None, "我的Cron表达式任务", false);
}
}

  OperateStatus 类

  /// <summary>
/// 调用服务或业务逻辑的返回标识枚举,使用DataContract特性,表示可序列化
/// </summary>
public enum ResultSign
{
/// <summary>
/// 操作成功
/// </summary>
Successful = , /// <summary>
/// 警告
/// </summary>
Warning = , /// <summary>
/// 操作引发错误
/// </summary>
Error =
} /// <summary>
/// 调用调用服务或业务逻辑的操作状态,使用DataContract特性,表示可序列化
/// </summary>
public class OperateStatus
{
#region 构造函数 /// <summary>
/// 构造函数:默认为失败
/// </summary>
public OperateStatus()
{
ResultSign = ResultSign.Error;
Message = "失败";
} public OperateStatus(OperateStatus status)
{
ResultSign = status.ResultSign;
Message = status.Message;
FormatParams = status.FormatParams;
} #endregion #region 属性 /// <summary>
/// 返回标记
/// </summary>
public ResultSign ResultSign { get; set; } /// <summary>
/// 消息字符串(有多语言后将删除该属性)
/// </summary>
public string Message { get; set; } /// <summary>
/// 消息的参数
/// </summary>
public List<string> FormatParams { get; set; }
#endregion
} /// <summary>
/// 返回结果带实体信息
/// </summary>
/// <typeparam name="T">实体信息</typeparam>
public class OperateStatus<T> : OperateStatus
{
public T Data { get; set; }
}

  (10)、恩、写了这么多终于结束了,下面我们就来看看我们的成果吧

  运行项目我们看到如下界面

  

  点击quartz.net 入门->Cron表达式的运用 会看到如下图界面

  

  根据提示我们点击文本框弹出如下界面

  

  点击反解析到UI,我们设置的Cron表达式就出现在我们文本框里啦  如图

  

  到这里我们就把cron表达式设置成功 ,然后点击开启任务,我们打开本地磁盘E 找到QuartzLog\CronLog 我们会看到有一个日志文件并打开 日志如下

  

  可以看到。日志里是我们设置的每分钟的第5秒执行一次的结果

三、源码及说明

  1、有事请留言,要源码请加qq群:460362190

  2、前端框架的加入,导致这篇博客写的有点繁琐,望大家理解,但是这是我以后编写quartz所必经的阶段

  3、下一篇博客我将引入数据库,敬请期待

  4、如果喜欢我的文章请点关注和推荐O(∩_∩)O~~  无比感谢,有问题留言哦

Quartz.net 定时任务之Cron表达式的更多相关文章

  1. 摆脱定时任务的cron表达式的困扰

    一.背景 最近因为需要,需要适用Spring的task定时任务进行跑定时任务,以前也接触过,但是因为懒没有好好地理解@Scheduled的cron表达式,这次便对它做了一个全方位的了解和任务,记录下来 ...

  2. Spring之Quartz定时任务和Cron表达式详解

    1.定时业务逻辑类 public class ExpireJobTask { /** Logger */ private static final Logger logger = LoggerFact ...

  3. 作业调度框架 Quartz 学习笔记(三) -- Cron表达式 (转载)

    前面两篇说的是简单的触发器(SimpleTrigger) , SimpleTrigger 只能处理简单的事件出发,如果想灵活的进行任务的触发,就要请出 CronTrigger 这个重要人物了. Cro ...

  4. Quartz学习-- quartz基本介绍和 Cron表达式

    Quartz学习 一. Quartz 大致简介 Quartz 是完全由 java 开发的一个开源的任务日程管理系统 ​任务日程管理系统 换句话说就是: ​ 一个预先确定的日程时间到达时,负责执行任务的 ...

  5. @Scheduled执行定时任务与cron表达式

    1 配置文件形式执行定时任务 1 1.X 版本与spring结合使用实例 1.1 常用maven管理 pom.xml文件 <project xmlns="http://maven.ap ...

  6. spring 定时任务 scheduled Cron表达式

    转载:https://blog.csdn.net/u011789653/article/details/51153536 可以借鉴:https://www.cnblogs.com/softidea/p ...

  7. 摆脱Spring 定时任务的@Scheduled cron表达式的困扰

    一.背景 最近因为需要,需要适用Spring的task定时任务进行跑定时任务,以前也接触过,但是因为懒没有好好地理解@Scheduled的cron表达式,这次便对它做了一个全方位的了解和任务,记录下来 ...

  8. .net core 实现基于 cron 表达式的任务调度

    .net core 实现基于 cron 表达式的任务调度 Intro 上次我们实现了一个简单的基于 Timer 的定时任务,详细信息可以看这篇文章. 但是使用过程中慢慢发现这种方式可能并不太合适,有些 ...

  9. Cron表达式详解和表达式的验证

    本篇不算原创,因为主要内容来自网上的博客,所以给出我参考文章的链接. 本文cron表达式详解的大部分内容参考了[cron表达式详解]和Quartz使用总结.Cron表达式 这两篇文章. cron校验的 ...

随机推荐

  1. Android 学习笔记之 Actionbar作为回到上一级

    首先,给Actionbar添加返回图标: 代码: @Override protected void onCreate(Bundle savedInstanceState) { super.onCrea ...

  2. 用 config drive 配置网络 - 每天5分钟玩转 OpenStack(173)

    上一节最后问了大家一个问题:如果 subnet 没有开 DHCP,会是怎样一个情况? 在其他条件不变的情况下,cloud-init 依然会完成那 3 个步骤,也就是说网卡还是会被配置成 dhcp 模式 ...

  3. 使用express创建新应用的骨架

    通过应用生成器工具 express 可以快速创建一个应用的骨架. 通过如下命令安装: $ npm install express-generator -g -h 选项可以列出所有可用的命令行选项: $ ...

  4. apache的配置参数

    #ErrorDocument 500 "The server made a boo boo."#ErrorDocument 404 /missing.html 1.Document ...

  5. zookeeper入门与实践

    概述 Zookeeper是Hadoop的一个子项目,它是分布式系统中的协调系统,可提供的服务主要有:配置服务.名字服务.分布式同步.组服务等. 它有如下的一些特点: 简单 Zookeeper的核心是一 ...

  6. Java中log4j的使用

    前言 距离上一篇文章又过去好长时间了,这段时间一直忙于工作,已经从net彻底转向Java了.工作也慢慢的步入正轨了,自己独自完成了一个小项目,不过工作中遇到了一些问题,还是得到了同学和同事的帮助.本来 ...

  7. Oracle数据库报错:索引中丢失 IN 或 OUT 参数

    另外,我记得好像以前也有这样的错误发生,当时的错误原因是,参数类型和数据库的类型不匹配引起的. 所以,如果有这种错误发生,应该仔细检查每个字段赋值的地方,检查类型及非空. 也可能是传参数问题,传参数过 ...

  8. ValueStack

    1.把list集合压入栈顶 /** * * 查找所有的用户 * @return */ public String findAll() { List<User> allUser = user ...

  9. input标签禁止输入,隐藏光标

    <INPUT class=""  value="" name= "" readonly onfocus="this.blur ...

  10. 如何选择合适的PHP开发框架

    PHP作为一门成熟的WEB应用开发语言,已经深受广大开发者的青睐.与此同时,各式各样的PHP开发框架也从出不穷,面对如此多而且良莠不齐的开发框架,开发者们想必都会眼花缭乱,不知道该选择用哪个.其实并没 ...