Quartz.net 定时任务之Cron表达式
一、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~~ 无比感谢,有问题留言哦