一、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视图编写如下代码
1 @{
2 ViewBag.Title = "Cron的使用";
3 Layout = "~/Views/Shared/_Layout.cshtml";
4 }
5 <link href="~/Content/BeginnerAdmin/plugins/layui/css/layui.css" rel="stylesheet" />
6 <link href="~/Content/BeginnerAdmin/css/global.css" rel="stylesheet" />
7 <script src="~/Js/lib/jquery-3.2.1/jquery-3.2.1.js"></script>
8 <script src="~/Js/lib/layer/layer.js"></script>
9 <script src="~/Js/lib/jquery-3.2.1/jquery-3.2.1.min.js"></script>
10
11
12 <div class="layui-form-item">
13 <label class="layui-form-label">Cron表达式</label>
14 <div class="layui-input-block" style="width:200px">
15 <input type="text" id="Cron" name="title" onclick="SetCron()" required lay-verify="required" placeholder="点击设置Cron表达式" autocomplete="off" class="layui-input">
16 </div>
17 </div>
18
19 <fieldset class="layui-elem-field site-demo-button">
20 <legend>任务控制区</legend>
21 <div>
22 <button id="OpenTask" class="layui-btn">开启任务</button>
23 <button id="CloseTask" class="layui-btn layui-btn-danger">关闭任务</button>
24 </div>
25 </fieldset>
26
27 <script type="text/javascript">
28 function SetCron() {
29 layer.open({
30 type: 2,
31 area: ['870px', '660px'],
32 fixed: false, //不固定
33 maxmin: true,
34 content: '/Quartz/SetCron'
35 });
36 // window.open("/Quartz/SetCron", "", "top=100,left=300,width=870,height=660");
37 }
38
39 $(document).ready(function () {
40 $("#OpenTask").click(function () {
41 var cron = $("#Cron").val();
42 if (cron === '') {
43 layer.tips('请设置Cron表达式', '#Cron', {
44 tips: 3
45 });
46 return false;
47 }
48 $.ajax({
49 url: "CronQuartzs",
50 type: 'post',
51 data: { cron: cron },
52 dataType: "json",
53 async: "false",
54 success: function (data) {
55 if (data.ResultSign === 0) {
56 layer.alert("开启成功");
57 } else {
58 layer.alert("开启失败--" + "错误信息:" + data.Message);
59 }
60 }
61 });
62 });
63 $("#CloseTask").click(function () {
64 $.ajax({
65 url: "CloseTask",
66 type: 'post',
67 data: {},
68 dataType: "json",
69 async: "false",
70 success: function (data) {
71 if (data.ResultSign === 0) {
72 layer.alert("关闭成功");
73 } else {
74 layer.alert("关闭失败--" + "错误信息:" + data.Message);
75 }
76 }
77 });
78 });
79 });
80 </script>
(6)、在SetCron视图编写如下代码
1 @{
2 ViewBag.Title = "设置Cron";
3 Layout = null;
4 }
5
6 <!DOCTYPE html>
7 <html>
8 <head>
9 <title>Cron表达式生成器</title>
10 <link href="~/Content/Cron/easyui.css" rel="stylesheet" type="text/css" />
11 <link href="~/Content/Cron/icon.css" rel="stylesheet" type="text/css" />
12 <script src="~/Js/lib/jquery-3.2.1/jquery-3.2.1.min.js"></script>
13 <script src="~/Content/Cron/jquery.easyui.min.js" type="text/javascript"></script>
14 <script src="~/Content/Cron/cron.js" type="text/javascript"></script>
15 <script src="~/Js/lib/layer/layer.js"></script>
16 <style type="text/css">
17 .line {
18 height: 25px;
19 line-height: 25px;
20 margin: 3px;
21 }
22
23 .imp {
24 padding-left: 25px;
25 }
26
27 .col {
28 width: 95px;
29 }
30 </style>
31 @*来源于http://jason.hahuachou.com/cron/index.htm网站,并下载源代码。*@
32 </head>
33 <body>
34
35 <center>
36 <div class="easyui-layout" style="width: 830px; height: 540px; border: 1px rgb(202, 196, 196) solid;
37 border-radius: 5px;">
38 <div style="height: 100%;">
39 <div class="easyui-tabs" data-options="fit:true,border:false">
40 <div title="秒">
41 <div class="line">
42 <input type="radio" checked="checked" name="second" onclick="everyTime(this)">
43 每秒 允许的通配符[, - * /]
44 </div>
45 <div class="line">
46 <input type="radio" name="second" onclick="cycle(this)">
47 周期从
48 <input class="numberspinner" style="width: 60px;" data-options="min:1,max:58" value="1"
49 id="secondStart_0">
50 -
51 <input class="numberspinner" style="width: 60px;" data-options="min:2,max:59" value="2"
52 id="secondEnd_0">
53 秒
54 </div>
55 <div class="line">
56 <input type="radio" name="second" onclick="startOn(this)">
57 从
58 <input class="numberspinner" style="width: 60px;" data-options="min:0,max:59" value="0"
59 id="secondStart_1">
60 秒开始,每
61 <input class="numberspinner" style="width: 60px;" data-options="min:1,max:59" value="1"
62 id="secondEnd_1">
63 秒执行一次
64 </div>
65 <div class="line">
66 <input type="radio" name="second" id="sencond_appoint">
67 指定每分钟在第几秒执行
68 </div>
69 <div class="imp secondList">
70 <input type="checkbox" value="1">01
71 <input type="checkbox" value="2">02
72 <input type="checkbox" value="3">03
73 <input type="checkbox" value="4">04
74 <input type="checkbox" value="5">05
75 <input type="checkbox" value="6">06
76 <input type="checkbox" value="7">07
77 <input type="checkbox" value="8">08
78 <input type="checkbox" value="9">09
79 <input type="checkbox" value="10">10
80 </div>
81 <div class="imp secondList">
82 <input type="checkbox" value="11">11
83 <input type="checkbox" value="12">12
84 <input type="checkbox" value="13">13
85 <input type="checkbox" value="14">14
86 <input type="checkbox" value="15">15
87 <input type="checkbox" value="16">16
88 <input type="checkbox" value="17">17
89 <input type="checkbox" value="18">18
90 <input type="checkbox" value="19">19
91 <input type="checkbox" value="20">20
92 </div>
93 <div class="imp secondList">
94 <input type="checkbox" value="21">21
95 <input type="checkbox" value="22">22
96 <input type="checkbox" value="23">23
97 <input type="checkbox" value="24">24
98 <input type="checkbox" value="25">25
99 <input type="checkbox" value="26">26
100 <input type="checkbox" value="27">27
101 <input type="checkbox" value="28">28
102 <input type="checkbox" value="29">29
103 <input type="checkbox" value="30">30
104 </div>
105 <div class="imp secondList">
106 <input type="checkbox" value="31">31
107 <input type="checkbox" value="32">32
108 <input type="checkbox" value="33">33
109 <input type="checkbox" value="34">34
110 <input type="checkbox" value="35">35
111 <input type="checkbox" value="36">36
112 <input type="checkbox" value="37">37
113 <input type="checkbox" value="38">38
114 <input type="checkbox" value="39">39
115 <input type="checkbox" value="40">40
116 </div>
117 <div class="imp secondList">
118 <input type="checkbox" value="41">41
119 <input type="checkbox" value="42">42
120 <input type="checkbox" value="43">43
121 <input type="checkbox" value="44">44
122 <input type="checkbox" value="45">45
123 <input type="checkbox" value="46">46
124 <input type="checkbox" value="47">47
125 <input type="checkbox" value="48">48
126 <input type="checkbox" value="49">49
127 <input type="checkbox" value="50">50
128 </div>
129 <div class="imp secondList">
130 <input type="checkbox" value="51">51
131 <input type="checkbox" value="52">52
132 <input type="checkbox" value="53">53
133 <input type="checkbox" value="54">54
134 <input type="checkbox" value="55">55
135 <input type="checkbox" value="56">56
136 <input type="checkbox" value="57">57
137 <input type="checkbox" value="58">58
138 <input type="checkbox" value="59">59
139 </div>
140 </div>
141 <div title="分钟">
142 <div class="line">
143 <input type="radio" checked="checked" name="min" onclick="everyTime(this)">
144 分钟 允许的通配符[, - * /]
145 </div>
146 <div class="line">
147 <input type="radio" name="min" onclick="cycle(this)">
148 周期从
149 <input class="numberspinner" style="width: 60px;" data-options="min:1,max:58" value="1"
150 id="minStart_0">
151 -
152 <input class="numberspinner" style="width: 60px;" data-options="min:2,max:59" value="2"
153 id="minEnd_0">
154 分钟
155 </div>
156 <div class="line">
157 <input type="radio" name="min" onclick="startOn(this)">
158 从
159 <input class="numberspinner" style="width: 60px;" data-options="min:0,max:59" value="0"
160 id="minStart_1">
161 分钟开始,每
162 <input class="numberspinner" style="width: 60px;" data-options="min:1,max:59" value="1"
163 id="minEnd_1">
164 分钟执行一次
165 </div>
166 <div class="line">
167 <input type="radio" name="min" id="min_appoint">
168 指定每小时在第几分执行
169 </div>
170 <div class="imp minList">
171 <input type="checkbox" value="1">01
172 <input type="checkbox" value="2">02
173 <input type="checkbox" value="3">03
174 <input type="checkbox" value="4">04
175 <input type="checkbox" value="5">05
176 <input type="checkbox" value="6">06
177 <input type="checkbox" value="7">07
178 <input type="checkbox" value="8">08
179 <input type="checkbox" value="9">09
180 <input type="checkbox" value="10">10
181 </div>
182 <div class="imp minList">
183 <input type="checkbox" value="11">11
184 <input type="checkbox" value="12">12
185 <input type="checkbox" value="13">13
186 <input type="checkbox" value="14">14
187 <input type="checkbox" value="15">15
188 <input type="checkbox" value="16">16
189 <input type="checkbox" value="17">17
190 <input type="checkbox" value="18">18
191 <input type="checkbox" value="19">19
192 <input type="checkbox" value="20">20
193 </div>
194 <div class="imp minList">
195 <input type="checkbox" value="21">21
196 <input type="checkbox" value="22">22
197 <input type="checkbox" value="23">23
198 <input type="checkbox" value="24">24
199 <input type="checkbox" value="25">25
200 <input type="checkbox" value="26">26
201 <input type="checkbox" value="27">27
202 <input type="checkbox" value="28">28
203 <input type="checkbox" value="29">29
204 <input type="checkbox" value="30">30
205 </div>
206 <div class="imp minList">
207 <input type="checkbox" value="31">31
208 <input type="checkbox" value="32">32
209 <input type="checkbox" value="33">33
210 <input type="checkbox" value="34">34
211 <input type="checkbox" value="35">35
212 <input type="checkbox" value="36">36
213 <input type="checkbox" value="37">37
214 <input type="checkbox" value="38">38
215 <input type="checkbox" value="39">39
216 <input type="checkbox" value="40">40
217 </div>
218 <div class="imp minList">
219 <input type="checkbox" value="41">41
220 <input type="checkbox" value="42">42
221 <input type="checkbox" value="43">43
222 <input type="checkbox" value="44">44
223 <input type="checkbox" value="45">45
224 <input type="checkbox" value="46">46
225 <input type="checkbox" value="47">47
226 <input type="checkbox" value="48">48
227 <input type="checkbox" value="49">49
228 <input type="checkbox" value="50">50
229 </div>
230 <div class="imp minList">
231 <input type="checkbox" value="51">51
232 <input type="checkbox" value="52">52
233 <input type="checkbox" value="53">53
234 <input type="checkbox" value="54">54
235 <input type="checkbox" value="55">55
236 <input type="checkbox" value="56">56
237 <input type="checkbox" value="57">57
238 <input type="checkbox" value="58">58
239 <input type="checkbox" value="59">59
240 </div>
241 </div>
242 <div title="小时">
243 <div class="line">
244 <input type="radio" checked="checked" name="hour" onclick="everyTime(this)">
245 小时 允许的通配符[, - * /]
246 </div>
247 <div class="line">
248 <input type="radio" name="hour" onclick="cycle(this)">
249 周期从
250 <input class="numberspinner" style="width: 60px;" data-options="min:0,max:23" value="0"
251 id="hourStart_0">
252 -
253 <input class="numberspinner" style="width: 60px;" data-options="min:2,max:23" value="2"
254 id="hourEnd_1">
255 小时
256 </div>
257 <div class="line">
258 <input type="radio" name="hour" onclick="startOn(this)">
259 从
260 <input class="numberspinner" style="width: 60px;" data-options="min:0,max:23" value="0"
261 id="hourStart_1">
262 小时开始,每
263 <input class="numberspinner" style="width: 60px;" data-options="min:1,max:23" value="1"
264 id="hourEnd_1">
265 小时执行一次
266 </div>
267 <div class="line">
268 <input type="radio" name="hour" id="hour_appoint">
269 指定每天在第几小时执行
270 </div>
271 <div class="imp hourList">
272 AM:
273 <input type="checkbox" value="0">00
274 <input type="checkbox" value="1">01
275 <input type="checkbox" value="2">02
276 <input type="checkbox" value="3">03
277 <input type="checkbox" value="4">04
278 <input type="checkbox" value="5">05
279 <input type="checkbox" value="6">06
280 <input type="checkbox" value="7">07
281 <input type="checkbox" value="8">08
282 <input type="checkbox" value="9">09
283 <input type="checkbox" value="10">10
284 <input type="checkbox" value="11">11
285 </div>
286 <div class="imp hourList">
287 PM:
288 <input type="checkbox" value="12">12
289 <input type="checkbox" value="13">13
290 <input type="checkbox" value="14">14
291 <input type="checkbox" value="15">15
292 <input type="checkbox" value="16">16
293 <input type="checkbox" value="17">17
294 <input type="checkbox" value="18">18
295 <input type="checkbox" value="19">19
296 <input type="checkbox" value="20">20
297 <input type="checkbox" value="21">21
298 <input type="checkbox" value="22">22
299 <input type="checkbox" value="23">23
300 </div>
301 </div>
302 <div title="日">
303 <div class="line">
304 <input type="radio" checked="checked" name="day" onclick="everyTime(this)">
305 日 允许的通配符[, - * / L W]
306 </div>
307 <div class="line">
308 <input type="radio" name="day" onclick="unAppoint(this)">
309 不指定
310 </div>
311 <div class="line">
312 <input type="radio" name="day" onclick="cycle(this)">
313 周期从
314 <input class="numberspinner" style="width: 60px;" data-options="min:1,max:31" value="1"
315 id="dayStart_0">
316 -
317 <input class="numberspinner" style="width: 60px;" data-options="min:2,max:31" value="2"
318 id="dayEnd_0">
319 日
320 </div>
321 <div class="line">
322 <input type="radio" name="day" onclick="startOn(this)">
323 从
324 <input class="numberspinner" style="width: 60px;" data-options="min:1,max:31" value="1"
325 id="dayStart_1">
326 日开始,每
327 <input class="numberspinner" style="width: 60px;" data-options="min:1,max:31" value="1"
328 id="dayEnd_1">
329 天执行一次
330 </div>
331 <div class="line">
332 <input type="radio" name="day" onclick="workDay(this)">
333 每月
334 <input class="numberspinner" style="width: 60px;" data-options="min:1,max:31" value="1"
335 id="dayStart_2">
336 号最近的那个工作日
337 </div>
338 <div class="line">
339 <input type="radio" name="day" onclick="lastDay(this)">
340 本月最后一天
341 </div>
342 <div class="line">
343 <input type="radio" name="day" id="day_appoint">
344 指定每月在第几日执行
345 </div>
346 <div class="imp dayList">
347 <input type="checkbox" value="1">1
348 <input type="checkbox" value="2">2
349 <input type="checkbox" value="3">3
350 <input type="checkbox" value="4">4
351 <input type="checkbox" value="5">5
352 <input type="checkbox" value="6">6
353 <input type="checkbox" value="7">7
354 <input type="checkbox" value="8">8
355 <input type="checkbox" value="9">9
356 <input type="checkbox" value="10">10
357 <input type="checkbox" value="11">11
358 <input type="checkbox" value="12">12
359 <input type="checkbox" value="13">13
360 <input type="checkbox" value="14">14
361 <input type="checkbox" value="15">15
362 <input type="checkbox" value="16">16
363 </div>
364 <div class="imp dayList">
365 <input type="checkbox" value="17">17
366 <input type="checkbox" value="18">18
367 <input type="checkbox" value="19">19
368 <input type="checkbox" value="20">20
369 <input type="checkbox" value="21">21
370 <input type="checkbox" value="22">22
371 <input type="checkbox" value="23">23
372 <input type="checkbox" value="24">24
373 <input type="checkbox" value="25">25
374 <input type="checkbox" value="26">26
375 <input type="checkbox" value="27">27
376 <input type="checkbox" value="28">28
377 <input type="checkbox" value="29">29
378 <input type="checkbox" value="30">30
379 <input type="checkbox" value="31">31
380 </div>
381 </div>
382 <div title="月">
383 <div class="line">
384 <input type="radio" checked="checked" name="mouth" onclick="everyTime(this)">
385 月 允许的通配符[, - * /]
386 </div>
387 <div class="line">
388 <input type="radio" name="mouth" onclick="unAppoint(this)">
389 不指定
390 </div>
391 <div class="line">
392 <input type="radio" name="mouth" onclick="cycle(this)">
393 周期从
394 <input class="numberspinner" style="width: 60px;" data-options="min:1,max:12" value="1"
395 id="mouthStart_0">
396 -
397 <input class="numberspinner" style="width: 60px;" data-options="min:2,max:12" value="2"
398 id="mouthEnd_0">
399 月
400 </div>
401 <div class="line">
402 <input type="radio" name="mouth" onclick="startOn(this)">
403 从
404 <input class="numberspinner" style="width: 60px;" data-options="min:1,max:12" value="1"
405 id="mouthStart_1">
406 日开始,每
407 <input class="numberspinner" style="width: 60px;" data-options="min:1,max:12" value="1"
408 id="mouthEnd_1">
409 月执行一次
410 </div>
411 <div class="line">
412 <input type="radio" name="mouth" id="mouth_appoint">
413 指定每年在第几月执行
414 </div>
415 <div class="imp mouthList">
416 <input type="checkbox" value="1">1
417 <input type="checkbox" value="2">2
418 <input type="checkbox" value="3">3
419 <input type="checkbox" value="4">4
420 <input type="checkbox" value="5">5
421 <input type="checkbox" value="6">6
422 <input type="checkbox" value="7">7
423 <input type="checkbox" value="8">8
424 <input type="checkbox" value="9">9
425 <input type="checkbox" value="10">10
426 <input type="checkbox" value="11">11
427 <input type="checkbox" value="12">12
428 </div>
429 </div>
430 <div title="周">
431 <div class="line">
432 <input type="radio" checked="checked" name="week" onclick="everyTime(this)">
433 周 允许的通配符[, - * / L #]
434 </div>
435 <div class="line">
436 <input type="radio" name="week" onclick="unAppoint(this)">
437 不指定
438 </div>
439 <div class="line">
440 <input type="radio" name="week" onclick="startOn(this)">
441 周期 从星期<input class="numberspinner" style="width: 60px;" data-options="min:1,max:7"
442 id="weekStart_0" value="1">
443 -
444 <input class="numberspinner" style="width: 60px;" data-options="min:2,max:7" value="2"
445 id="weekEnd_0">
446 </div>
447 <div class="line">
448 <input type="radio" name="week" onclick="weekOfDay(this)">
449 第<input class="numberspinner" style="width: 60px;" data-options="min:1,max:4" value="1"
450 id="weekStart_1">
451 周 的星期<input class="numberspinner" style="width: 60px;" data-options="min:1,max:7"
452 id="weekEnd_1" value="1">
453 </div>
454 <div class="line">
455 <input type="radio" name="week" onclick="lastWeek(this)">
456 本月最后一个星期<input class="numberspinner" style="width: 60px;" data-options="min:1,max:7"
457 id="weekStart_2" value="1">
458 </div>
459 <div class="line">
460 <input type="radio" name="week" id="week_appoint">
461 指定在周几执行
462 </div>
463 <div class="imp weekList">
464 <input type="checkbox" value="1">1
465 <input type="checkbox" value="2">2
466 <input type="checkbox" value="3">3
467 <input type="checkbox" value="4">4
468 <input type="checkbox" value="5">5
469 <input type="checkbox" value="6">6
470 <input type="checkbox" value="7">7
471 </div>
472 </div>
473 <div title="年">
474 <div class="line">
475 <input type="radio" checked="checked" name="year" onclick="unAppoint(this)">
476 不指定 允许的通配符[, - * /] 非必填
477 </div>
478 <div class="line">
479 <input type="radio" name="year" onclick="everyTime(this)">
480 每年
481 </div>
482 <div class="line">
483 <input type="radio" name="year" onclick="cycle(this)">周期 从
484 <input class="numberspinner" style="width: 90px;" data-options="min:2013,max:3000"
485 id="yearStart_0" value="2013">
486 -
487 <input class="numberspinner" style="width: 90px;" data-options="min:2014,max:3000"
488 id="yearEnd_0" value="2014">
489 </div>
490 </div>
491 </div>
492 </div>
493 <div data-options="region:'south',border:false" style="height: 230px">
494 <fieldset style="border-radius: 3px; height: 116px;">
495 <legend>表达式</legend>
496 <table style="height: 100px;">
497 <tbody>
498 <tr>
499 <td></td>
500 <td align="center">
501 秒
502 </td>
503 <td align="center">
504 分钟
505 </td>
506 <td align="center">
507 小时
508 </td>
509 <td align="center">
510 日
511 </td>
512 <td align="center">
513 月<br />
514 </td>
515 <td align="center">
516 星期
517 </td>
518 <td align="center">
519 年
520 </td>
521 </tr>
522 <tr>
523 <td>
524 表达式字段:
525 </td>
526 <td>
527 <input type="text" name="v_second" class="col" value="*" readonly="readonly" />
528 </td>
529 <td>
530 <input type="text" name="v_min" class="col" value="*" readonly="readonly" />
531 </td>
532 <td>
533 <input type="text" name="v_hour" class="col" value="*" readonly="readonly" />
534 </td>
535 <td>
536 <input type="text" name="v_day" class="col" value="*" readonly="readonly" />
537 </td>
538 <td>
539 <input type="text" name="v_mouth" class="col" value="*" readonly="readonly" />
540 </td>
541 <td>
542 <input type="text" name="v_week" class="col" value="?" readonly="readonly" />
543 </td>
544 <td>
545 <input type="text" name="v_year" class="col" readonly="readonly" />
546 </td>
547 </tr>
548 <tr>
549 <td>Cron 表达式:</td>
550 <td colspan="6">
551 <input type="text" name="cron" style="width: 100%;" value="* * * * * ?" id="cron" />
552 </td>
553 <td><input type="button" value="反解析到UI " id="bt" onclick="btnFan()" /></td>
554 </tr>
555 </tbody>
556 </table>
557 </fieldset>
558 <div style="text-align: center; margin-top: 5px;">
559 <script type="text/javascript">
560 /*killIe*/
561 $.parser.parse($("body"));
562 var cpro_id = "u1331261";
563 var id = getQueryString("id");
564 function btnFan() {
565 //获取参数中表达式的值
566 var txt = $("#cron").val();
567 if (txt) {
568 var regs = txt.split(' ');
569 $("input[name=v_second]").val(regs[0]);
570 $("input[name=v_min]").val(regs[1]);
571 $("input[name=v_hour]").val(regs[2]);
572 $("input[name=v_day]").val(regs[3]);
573 $("input[name=v_mouth]").val(regs[4]);
574 $("input[name=v_week]").val(regs[5]);
575
576 initObj(regs[0], "second");
577 initObj(regs[1], "min");
578 initObj(regs[2], "hour");
579 initDay(regs[3]);
580 initMonth(regs[4]);
581 initWeek(regs[5]);
582
583 if (regs.length > 6) {
584 $("input[name=v_year]").val(regs[6]);
585 initYear(regs[6]);
586 }
587 }
588 // 使用layer把子窗口的值传给父窗口
589 var index = parent.layer.getFrameIndex(window.name); // 得到索引
590 parent.$('#Cron').val(txt);
591 parent.layer.close(index);
592 }
593
594
595 function initObj(strVal, strid) {
596 var ary = null;
597 var objRadio = $("input[name='" + strid + "'");
598 if (strVal == "*") {
599 objRadio.eq(0).attr("checked", "checked");
600 } else if (strVal.split('-').length > 1) {
601 ary = strVal.split('-');
602 objRadio.eq(1).attr("checked", "checked");
603 $("#" + strid + "Start_0").numberspinner('setValue', ary[0]);
604 $("#" + strid + "End_0").numberspinner('setValue', ary[1]);
605 } else if (strVal.split('/').length > 1) {
606 ary = strVal.split('/');
607 objRadio.eq(2).attr("checked", "checked");
608 $("#" + strid + "Start_1").numberspinner('setValue', ary[0]);
609 $("#" + strid + "End_1").numberspinner('setValue', ary[1]);
610 } else {
611 objRadio.eq(3).attr("checked", "checked");
612 if (strVal != "?") {
613 ary = strVal.split(",");
614 for (var i = 0; i < ary.length; i++) {
615 $("." + strid + "List input[value='" + ary[i] + "']").attr("checked", "checked");
616 }
617 }
618 }
619 }
620
621 function initDay(strVal) {
622 var ary = null;
623 var objRadio = $("input[name='day'");
624 if (strVal == "*") {
625 objRadio.eq(0).attr("checked", "checked");
626 } else if (strVal == "?") {
627 objRadio.eq(1).attr("checked", "checked");
628 } else if (strVal.split('-').length > 1) {
629 ary = strVal.split('-');
630 objRadio.eq(2).attr("checked", "checked");
631 $("#dayStart_0").numberspinner('setValue', ary[0]);
632 $("#dayEnd_0").numberspinner('setValue', ary[1]);
633 } else if (strVal.split('/').length > 1) {
634 ary = strVal.split('/');
635 objRadio.eq(3).attr("checked", "checked");
636 $("#dayStart_1").numberspinner('setValue', ary[0]);
637 $("#dayEnd_1").numberspinner('setValue', ary[1]);
638 } else if (strVal.split('W').length > 1) {
639 ary = strVal.split('W');
640 objRadio.eq(4).attr("checked", "checked");
641 $("#dayStart_2").numberspinner('setValue', ary[0]);
642 } else if (strVal == "L") {
643 objRadio.eq(5).attr("checked", "checked");
644 } else {
645 objRadio.eq(6).attr("checked", "checked");
646 ary = strVal.split(",");
647 for (var i = 0; i < ary.length; i++) {
648 $(".dayList input[value='" + ary[i] + "']").attr("checked", "checked");
649 }
650 }
651 }
652
653 function initMonth(strVal) {
654 var ary = null;
655 var objRadio = $("input[name='mouth'");
656 if (strVal == "*") {
657 objRadio.eq(0).attr("checked", "checked");
658 } else if (strVal == "?") {
659 objRadio.eq(1).attr("checked", "checked");
660 } else if (strVal.split('-').length > 1) {
661 ary = strVal.split('-');
662 objRadio.eq(2).attr("checked", "checked");
663 $("#mouthStart_0").numberspinner('setValue', ary[0]);
664 $("#mouthEnd_0").numberspinner('setValue', ary[1]);
665 } else if (strVal.split('/').length > 1) {
666 ary = strVal.split('/');
667 objRadio.eq(3).attr("checked", "checked");
668 $("#mouthStart_1").numberspinner('setValue', ary[0]);
669 $("#mouthEnd_1").numberspinner('setValue', ary[1]);
670
671 } else {
672 objRadio.eq(4).attr("checked", "checked");
673
674 ary = strVal.split(",");
675 for (var i = 0; i < ary.length; i++) {
676 $(".mouthList input[value='" + ary[i] + "']").attr("checked", "checked");
677 }
678 }
679 }
680
681 function initWeek(strVal) {
682 var ary = null;
683 var objRadio = $("input[name='week'");
684 if (strVal == "*") {
685 objRadio.eq(0).attr("checked", "checked");
686 } else if (strVal == "?") {
687 objRadio.eq(1).attr("checked", "checked");
688 } else if (strVal.split('/').length > 1) {
689 ary = strVal.split('/');
690 objRadio.eq(2).attr("checked", "checked");
691 $("#weekStart_0").numberspinner('setValue', ary[0]);
692 $("#weekEnd_0").numberspinner('setValue', ary[1]);
693 } else if (strVal.split('-').length > 1) {
694 ary = strVal.split('-');
695 objRadio.eq(3).attr("checked", "checked");
696 $("#weekStart_1").numberspinner('setValue', ary[0]);
697 $("#weekEnd_1").numberspinner('setValue', ary[1]);
698 } else if (strVal.split('L').length > 1) {
699 ary = strVal.split('L');
700 objRadio.eq(4).attr("checked", "checked");
701 $("#weekStart_2").numberspinner('setValue', ary[0]);
702 } else {
703 objRadio.eq(5).attr("checked", "checked");
704 ary = strVal.split(",");
705 for (var i = 0; i < ary.length; i++) {
706 $(".weekList input[value='" + ary[i] + "']").attr("checked", "checked");
707 }
708 }
709 }
710
711 function initYear(strVal) {
712 var ary = null;
713 var objRadio = $("input[name='year'");
714 if (strVal == "*") {
715 objRadio.eq(1).attr("checked", "checked");
716 } else if (strVal.split('-').length > 1) {
717 ary = strVal.split('-');
718 objRadio.eq(2).attr("checked", "checked");
719 $("#yearStart_0").numberspinner('setValue', ary[0]);
720 $("#yearEnd_0").numberspinner('setValue', ary[1]);
721 }
722 }
723
724 </script>
725
726 <div>
727 </div>
728 </div>
729 </div>
730 <div>
731 </div>
732 </div>
733 </center>
734 </body>
735 </html>
(7)、_Layout视图是我们的模板页代码如下 注:路径看CronUse页面
1 <!DOCTYPE html>
2
3 <html>
4
5 <head>
6 <meta charset="utf-8">
7 <title>后台管理模板</title>
8 <meta name="renderer" content="webkit">
9 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
10 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
11 <meta name="apple-mobile-web-app-status-bar-style" content="black">
12 <meta name="apple-mobile-web-app-capable" content="yes">
13 <meta name="format-detection" content="telephone=no">
14 </head>
15
16 <body>
17 @RenderBody()
18 </body>
19
20 </html>
(8)、视图搭建好之后、我们在写后端实现quartz控制器 代码如下
1 /// <summary>
2 /// 设置Cron时间开启方法
3 /// </summary>
4 /// <param name="cron"></param>
5 /// <returns></returns>
6 public JsonResult CronQuartzs(string cron)
7 {
8 OperateStatus statu = new OperateStatus();
9 try
10 {
11 LogTool.DetailLogRecord("CronLog", LogTool.FolderCreationType.None, "创建调度器成功", false);
12 _sched.Start();
13 IJobDetail job = JobBuilder.Create<CronJob>()
14 .WithIdentity("Cron作业名称", "Cron作业分组")
15 .Build();
16 // 触发作业
17 ITrigger trigger = TriggerBuilder.Create()
18
19 #region 使用cron 规则
20
21 .WithIdentity("Cron触发器名称", "Cron触发器分组")
22 .WithCronSchedule(cron) // 你设置的执行时间
23 .StartAt(DateTime.UtcNow)
24 .WithPriority(1)
25 .Build();
26 #endregion
27
28 // 将作业和触发器添加到调度器
29 _sched.ScheduleJob(job, trigger);
30 statu.Message = "开启成功";
31 statu.ResultSign = ResultSign.Successful;
32 //return Json(statu);
33 }
34 catch (Exception ex)
35 {
36 statu.Message = ex.Message;
37 statu.ResultSign = ResultSign.Error;
38
39 }
40 return Json(statu);
41 }
42
43 /// <summary>
44 /// 关闭任务
45 /// </summary>
46 public JsonResult CloseTask()
47 {
48 OperateStatus statu = new OperateStatus();
49 try
50 {
51 _sched.Shutdown();
52 statu.Message = "关闭成功";
53 statu.ResultSign = ResultSign.Successful;
54 }
55 catch (Exception ex)
56 {
57 statu.Message = ex.Message;
58 statu.ResultSign = ResultSign.Error;
59 }
60 return Json(statu);
61 }
(9)、后端的实现是和前一篇博客相差不大的,但有2点不同是我们重新建立了一个作业类(CronJob) CronJob存放路径在Job文件夹下和OperateStatus消息提示类 OperateStatus存放路径Tool->Message文件夹下 代码如下
CronJob类
1 public class CronJob:IJob
2 {
3
4 /// <summary>
5 /// 作业默认实现接口
6 /// </summary>
7 /// <param name="context"></param>
8 public void Execute(IJobExecutionContext context)
9 {
10 LogTool.DetailLogRecord("CronLog", LogTool.FolderCreationType.None, "我的Cron表达式任务", false);
11 }
12 }
OperateStatus 类
1 /// <summary>
2 /// 调用服务或业务逻辑的返回标识枚举,使用DataContract特性,表示可序列化
3 /// </summary>
4 public enum ResultSign
5 {
6 /// <summary>
7 /// 操作成功
8 /// </summary>
9 Successful = 0,
10
11 /// <summary>
12 /// 警告
13 /// </summary>
14 Warning = 1,
15
16 /// <summary>
17 /// 操作引发错误
18 /// </summary>
19 Error = 2
20 }
21
22 /// <summary>
23 /// 调用调用服务或业务逻辑的操作状态,使用DataContract特性,表示可序列化
24 /// </summary>
25 public class OperateStatus
26 {
27 #region 构造函数
28
29 /// <summary>
30 /// 构造函数:默认为失败
31 /// </summary>
32 public OperateStatus()
33 {
34 ResultSign = ResultSign.Error;
35 Message = "失败";
36 }
37
38 public OperateStatus(OperateStatus status)
39 {
40 ResultSign = status.ResultSign;
41 Message = status.Message;
42 FormatParams = status.FormatParams;
43 }
44
45 #endregion
46
47 #region 属性
48
49 /// <summary>
50 /// 返回标记
51 /// </summary>
52 public ResultSign ResultSign { get; set; }
53
54 /// <summary>
55 /// 消息字符串(有多语言后将删除该属性)
56 /// </summary>
57 public string Message { get; set; }
58
59 /// <summary>
60 /// 消息的参数
61 /// </summary>
62 public List<string> FormatParams { get; set; }
63 #endregion
64 }
65
66 /// <summary>
67 /// 返回结果带实体信息
68 /// </summary>
69 /// <typeparam name="T">实体信息</typeparam>
70 public class OperateStatus<T> : OperateStatus
71 {
72 public T Data { get; set; }
73 }
(10)、恩、写了这么多终于结束了,下面我们就来看看我们的成果吧
运行项目我们看到如下界面
点击quartz.net 入门->Cron表达式的运用 会看到如下图界面
根据提示我们点击文本框弹出如下界面
点击反解析到UI,我们设置的Cron表达式就出现在我们文本框里啦 如图
到这里我们就把cron表达式设置成功 ,然后点击开启任务,我们打开本地磁盘E 找到QuartzLog\CronLog 我们会看到有一个日志文件并打开 日志如下
可以看到。日志里是我们设置的每分钟的第5秒执行一次的结果
三、源码及说明
1、有事请留言,要源码请加qq群:460362190
2、前端框架的加入,导致这篇博客写的有点繁琐,望大家理解,但是这是我以后编写quartz所必经的阶段
3、下一篇博客我将引入数据库,敬请期待
4、如果喜欢我的文章请点关注和推荐O(∩_∩)O~~ 无比感谢,有问题留言哦
来源:oschina
链接:https://my.oschina.net/u/4340310/blog/4332188