Asp.Net MVC 3 + ExtJs 4.01做一个Quartz.Net管理平台

在原来的公司曾经用asp.net + extjs 2做过一个Quartz.Net简单管理平台(后来申请了著作权,尽然也可以),随着Asp.Net MVC 3和ExtJs 4的发布,突然有了重新用Asp.Net MVC 3 + ExtJs 4重新做一下的冲动(冲动是魔鬼呀。。。Asp.Net MVC 3 + ExtJs 4.01做一个Quartz.Net管理平台)。本次只实现了显示触发器Trigger的信息。
效果图:
Asp.Net MVC 3 + ExtJs 4.01做一个Quartz.Net管理平台
1.定义TriggerInfo,这里为了方便起见只列出了TriggerInfo的定义
Asp.Net MVC 3 + ExtJs 4.01做一个Quartz.Net管理平台Asp.Net MVC 3 + ExtJs 4.01做一个Quartz.Net管理平台View Code 1 using System; 2 using System.Runtime.Serialization; 3 4 [DataContract] 5 public class TriggerInfo 6 { 7 [DataMember] 8 public string CalendarName { get; set; } 9 10 [DataMember] 11 public string Description { get; set; } 12 13 [DataMember] 14 public DateTime? EndTimeUtc { get; set; } 15 16 [DataMember] 17 public DateTime? FinalFireTimeUtc { get; set; } 18 19 [DataMember] 20 public string FireInstanceId { set; get; } 21 22 [DataMember] 23 public string FullJobName { get; set; } 24 25 [DataMember] 26 public string FullName { get; set; } 27 28 [DataMember] 29 public string Group { get; set; } 30 31 [DataMember] 32 public bool HasAdditionalProperties { get; set; } 33 34 [DataMember] 35 public bool HasMillisecondPrecision { get; set; } 36 37 [DataMember] 38 public string JobGroup { get; set; } 39 40 [DataMember] 41 public string JobName { get; set; } 42 43 [DataMember] 44 public string Key { get; set; } 45 46 [DataMember] 47 public bool MayFireAgain { get; set; } 48 49 [DataMember] 50 public int MisfireInstruction { get; set; } 51 52 [DataMember] 53 public string Name { get; set; } 54 55 [DataMember] 56 public DateTime? NextFireTimeUtc { get; set; } 57 58 [DataMember] 59 public DateTime? PreviousFireTimeUtc { get; set; } 60 61 [DataMember] 62 public int Priority { get; set; } 63 64 [DataMember] 65 public DateTime StartTimeUtc { get; set; } 66 67 [DataMember] 68 public string[] TriggerListenerNames { get; set; } 69 70 [DataMember] 71 public TriggerType TriggerType { get; set; } 72 73 [DataMember] 74 public TriggerStateInfo TriggerState { get; set; } 75 76 [DataMember] 77 public bool Volatile { get; set; } 78 79 [DataMember] 80 public int RepeatCount { get; set; } 81 82 [DataMember] 83 public TimeSpan RepeatInterval { get; set; } 84 85 [DataMember] 86 public int TimesTriggered { get; set; } 87 88 [DataMember] 89 public int RepeatIndefinitely { get; set; } 90 91 [DataMember] 92 public string CronExpressionString { get; set; } 93 94 [DataMember] 95 public TimeZoneInfo TimeZone { get; set; } 96 }
2.定义服务契约IScheduleService
View Code 1 using System; 2 using System.ServiceModel; 3 4 using DataContract; 5 6 [ServiceContract] 7 public interface IScheduleService 8 { 9 [OperationContract] 10 void AddJob(JobInfo jobInfo, bool replace); 11 12 [OperationContract] 13 bool DeleteJob(string jobName, string groupName); 14 15 [OperationContract] 16 string[] GetJobGroupNames(); 17 18 [OperationContract] 19 JobInfo GetJobDetail(string jobName, string groupName); 20 21 [OperationContract] 22 string[] GetJobNames(string groupName); 23 24 [OperationContract] 25 TriggerInfo GetTrigger(string triggerName, string groupName); 26 27 [OperationContract] 28 string[] GetTriggerGroupNames(); 29 30 [OperationContract] 31 string[] GetTriggerNames(string groupName); 32 33 [OperationContract] 34 TriggerStateInfo GetTriggerState(string triggerName, string triggerGroup); 35 36 [OperationContract] 37 bool IsJobGroupPaused(string groupName); 38 39 [OperationContract] 40 bool IsTriggerGroupPaused(string groupName); 41 42 [OperationContract] 43 void PauseAll(); 44 45 [OperationContract] 46 void PauseJob(string jobName, string groupName); 47 48 [OperationContract] 49 void PauseJobGroup(string groupName); 50 51 [OperationContract] 52 void PauseTrigger(string triggerName, string triggerGroup); 53 54 [OperationContract] 55 void PauseTriggerGroup(string triggerGroup); 56 57 [OperationContract] 58 DateTime? RescheduleJob(string triggerName, string triggerGroup, TriggerInfo newTrigger); 59 60 [OperationContract] 61 void ResumeAll(); 62 63 [OperationContract] 64 void ResumeJob(string jobName, string groupName); 65 66 [OperationContract] 67 void ResumeJobGroup(string groupName); 68 69 [OperationContract] 70 void ResumeTrigger(string triggerName, string groupName); 71 72 [OperationContract] 73 void ResumeTriggerGroup(string groupName); 74 75 [OperationContract] 76 DateTime ScheduleJob(TriggerInfo trigger); 77 78 [OperationContract] 79 DateTime ScheduleJobByTrigger(JobInfo jobInfo, TriggerInfo trigger); 80 81 [OperationContract] 82 void Shutdown(bool waitForJobsToComplete); 83 84 [OperationContract] 85 void Standby(); 86 87 [OperationContract] 88 void Start(); 89 90 [OperationContract] 91 void StartDelayed(TimeSpan delay); 92 93 [OperationContract] 94 void TriggerJob(string jobName, string groupName); 95 96 [OperationContract] 97 void TriggerJobWithVolatileTrigger(string jobName, string groupName); 98 99 [OperationContract] 100 void UnscheduleJob(string triggerName, string groupName); 101 }
3.实现服务契约IScheduleService的ScheduleService ,由于服务提交代码,只能描述一下了,这个类就是把Quartz.Net的Schedule封装了一下。
4.定义SchduleController,来输出Job和Trigger的信息
View Code 1 using System.Collections.Generic; 2 using System.Web.Mvc; 3 4 using Vancl.Schedule.DataContract; 5 using Vancl.Schedule.ServiceContract; 6 using Vancl.Schedule.ServiceImpl; 7 8 public class ScheduleController : Controller 9 { 10 private readonly IScheduleService scheduleService = ScheduleService.Instance; 11 12 /// 13 /// 获取所有任务 14 /// 15 /// 16 public ActionResult GetJobs() 17 { 18 IList jobInfoes = new List(); 19 20 string[] groupNames = scheduleService.GetJobGroupNames(); 21 22 if (groupNames != null) 23 { 24 foreach (string groupName in groupNames) 25 { 26 string[] jobNames = scheduleService.GetJobNames(groupName); 27 28 if (jobNames != null) 29 { 30 foreach (string jobName in jobNames) 31 { 32 jobInfoes.Add(scheduleService.GetJobDetail(jobName, groupName)); 33 } 34 } 35 } 36 } 37 38 return new JsonResult() { Data = jobInfoes, JsonRequestBehavior = JsonRequestBehavior.AllowGet }; 39 } 40 41 /// 42 /// 获取所有触发器 43 /// 44 /// 45 public ActionResult GetTriggers() 46 { 47 IList triggerInfoes = new List(); 48 49 string[] groupNames = scheduleService.GetTriggerGroupNames(); 50 51 if (groupNames != null) 52 { 53 foreach (string groupName in groupNames) 54 { 55 string[] triggerNames = scheduleService.GetTriggerNames(groupName); 56 57 if (triggerNames != null) 58 { 59 foreach (string triggerName in triggerNames) 60 { 61 TriggerInfo triggerInfo = scheduleService.GetTrigger(triggerName, groupName); 62 triggerInfo.TriggerState = scheduleService.GetTriggerState(triggerName, groupName); 63 triggerInfoes.Add(triggerInfo); 64 } 65 } 66 } 67 } 68 69 return new JsonResult() { Data = triggerInfoes, JsonRequestBehavior = JsonRequestBehavior.AllowGet }; 70 } 71 }
5.定义TriggerInfo,扩展于Ext.data.Model
1 Ext.define("Vancl.Cxcp.TriggerInfo", { 2 extend: 'Ext.data.Model', 3 fields: ['Name', 'Group', 'JobName', 'JobGroup', 'TriggerType', 'StartTimeUtc', 'PreviousFireTimeUtc', 'NextFireTimeUtc', 'MisfireInstruction', 'TriggerState'] 4 });
6.出于方便,我直接利用了Ext的desktop,下面是用于显示所有Trigger信息的Grid
1 Ext.define('MyDesktop.GridWindow', { 2 extend: 'Ext.ux.desktop.Module', 3 4 requires: [ 5 'Ext.data.*', 6 'Ext.util.Format', 7 'Ext.grid.Panel', 8 'Ext.grid.RowNumberer' 9 ], 10 11 id: 'grid-win', 12 13 init: function () { 14 this.launcher = { 15 text: 'Grid Window', 16 iconCls: 'icon-grid', 17 handler: this.createWindow, 18 scope: this 19 }; 20 }, 21 22 createWindow: function () { 23 var desktop = this.app.getDesktop(); 24 var win = desktop.getWindow('grid-win'); 25 var store = new Ext.data.Store({ 26 model: 'Vancl.Cxcp.TriggerInfo', 27 proxy: { 28 type: 'ajax', 29 url: 'schedule/gettriggers', 30 reader: { 31 type: 'json', 32 root: '' 33 } 34 } 35 }); 36 if (!win) { 37 win = desktop.createWindow({ 38 id: 'grid-win', 39 title: '触发器信息', 40 width: 740, 41 height: 480, 42 iconCls: 'icon-grid', 43 animCollapse: false, 44 constrainHeader: true, 45 layout: 'fit', 46 items: [ 47 { 48 border: false, 49 xtype: 'grid', 50 store: store, 51 columns: [{ 52 text: 'Name', 53 dataIndex: 'Name' 54 }, { 55 text: 'Group', 56 dataIndex: 'Group' 57 }, { 58 text: 'JobName', 59 dataIndex: 'JobName' 60 }, { 61 text: 'JobGroup', 62 dataIndex: 'JobGroup' 63 }, { 64 text: 'TriggerType', 65 dataIndex: 'TriggerType' 66 }, { 67 text: 'StartTimeUtc', 68 dataIndex: 'StartTimeUtc' 69 }, { 70 text: 'PreviousFireTimeUtc', 71 dataIndex: 'PreviousFireTimeUtc' 72 }, { 73 text: 'NextFireTimeUtc', 74 dataIndex: 'NextFireTimeUtc' 75 }, { 76 text: 'MisfireInstruction', 77 dataIndex: 'MisfireInstruction' 78 }, { 79 text: 'TriggerState', 80 dataIndex: 'TriggerState' 81 }] 82 } 83 ], 84 tbar: [{ 85 text: 'Add', 86 tooltip: 'Add a new trigger', 87 iconCls: 'add' 88 }, '-', { 89 text: 'Remove Trigger', 90 tooltip: 'Remove the selected trigger', 91 iconCls: 'remove' 92 }] 93 }); 94 } 95 win.show(); 96 store.load(); 97 98 return win; 99 } 100 });
从以上示例可以看出,ExtJs 4相对于ExtJs 2/3已经有了很大的变化。比如 data model,对于对象的定义更加简单明了。
Tags: 

延伸阅读

最新评论

发表评论