作业调度小软件
最近,由于工作需要,做了一个作业调度的小软件。先上两张效果图。
一、效果图
作业启动状态
作业停止状态
二、Quartz
调度的核心库用的是 Quartz.NET。官方网站:http://quartznet.sourceforge.net/。这里有更多的中文介绍。
先创建一个类库,新建一个TaskJob类用来执行任务。
using System.Collections.Generic;
using System.Text;
using Quartz;
namespace MyJob
{
public class TaskJob : IJob
{
public void Execute(JobExecutionContext context)
{
//todo:此处为执行的任务
string path = AppDomain.CurrentDomain.BaseDirectory + "log\\Log.txt";
Common.writeInLog("开始执行任务。", path);
//。。。
Common.writeInLog("执行已完成。", path);
}
}
}
正如你所见,一个继承了IJob的TaskJob,将要执行的任务统统放在Execute中即可!
三、作业调度
创建一个WinForm项目,并添加对Quartz.dll和类库的引用。
JobConfig.xml
新建一个JobConfig.xml文件,指定TaskJob并配置Job的触发时间。
可以指定具体的执行时间,如<cron-expression>0 50 9 ? * *</cron-expression> 表示每天9点50点触发。
也可以指定为一段时间内重复多少次,如 <cron-expression>0 0/1 8-20 ? * MON-FRI</cron-expression> 表示周一到周五每天的8点到20点,每一分钟触发一次。
<quartz xmlns="http://quartznet.sourceforge.net/JobSchedulingData"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
version="1.0"
overwrite-existing-jobs="true">
<job>
<job-detail>
<name>MyJob</name>
<group>MyJob</group>
<job-type>MyJob.TaskJob, MyJob</job-type>
</job-detail>
<trigger>
<cron>
<name>cronMyJob</name>
<group>cronMyJob</group>
<job-name>MyJob</job-name>
<job-group>MyJob</job-group>
<!--周一到周五每天的8点到20点,每一分钟触发一次-->
<!--<cron-expression>0 0/1 8-20 ? * MON-FRI</cron-expression>-->
<!--每天9点50点触发-->
<cron-expression>0 50 9 ? * *</cron-expression>
</cron>
</trigger>
</job>
</quartz>
HandleMask
创建一个类,用来控制Job的开启和停止。
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Collections;
using Quartz;
using Quartz.Impl;
using Quartz.Xml;
namespace WinApp
{
public class HandleMask
{
IScheduler sched;
public void Start()
{
JobSchedulingDataProcessor processor;
processor = new JobSchedulingDataProcessor(true, true);
ISchedulerFactory sf = new StdSchedulerFactory();
sched = sf.GetScheduler();
string path = AppDomain.CurrentDomain.BaseDirectory + "JobConfig.xml";
Stream s = new StreamReader(path, System.Text.Encoding.GetEncoding("UTF-8")).BaseStream;
processor.ProcessStream(s, null);
processor.ScheduleJobs(new Hashtable(), sched, false);
sched.Start();
}
public void Stop()
{
if (sched != null)
{
sched.Shutdown(true);
}
}
}
}
start的时候会根据JobConfig.xml中的配置调度TaskJob中的Execute。
控制器
控制器的主要功能是启动和停止对作业的调度。
初始化
在下面的构造函数中用到了 mutex 。可见参考使用 Mutex实现会话状态下单实例运行和系统范围内单实例运行 。
同时,在窗体初始化时,就启动了作业。
batch = new HandleMask();
batch.Start();
bool closeTag = true;
public Form1()
{
try
{
bool newMutexCreated = false;
string mutexName = "Global\\" + System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
Mutex mutex = null;
try
{
mutex = new Mutex(false, mutexName, out newMutexCreated);
}
catch (Exception ex)
{
Environment.Exit(1);
}
if (newMutexCreated)
{
InitializeComponent();
lblCurState.Text = "作业已启动,启动时间:" + DateTime.Now;
batch = new HandleMask();
batch.Start();
}
else
{
Environment.Exit(1);
}
}
catch (Exception ex)
{
throw ex;
}
}
作业启动事件
{
batch.Start();
tscbStart.Enabled = false;
tscbStop.Enabled = true;
tscbExit.Enabled = true;
lblCurState.Text = "作业已启动,启动时间:"+DateTime.Now;
}
作业停止事件
{
batch.Stop();
tscbStart.Enabled = true;
tscbStop.Enabled = false;
tscbExit.Enabled = true;
lblCurState.Text = "作业已暂停,停止时间:"+DateTime.Now;
}
退出事件
{
batch.Stop();
closeTag = false;
Application.Exit();
}
辅助功能
禁止最大化:MaximizeBox:false;
禁止调整窗体大小: FormBorderStyle:FixedSingle
点击关闭时最小化
{
if (this.WindowState == FormWindowState.Minimized)
{
NormalToMinimized();
}
}
private void MinimizedToNormal()
{
this.Visible = true;
this.WindowState = FormWindowState.Normal;
notifyIcon1.Visible = false;
}
private void NormalToMinimized()
{
this.WindowState = FormWindowState.Minimized;
this.Visible = false;
this.notifyIcon1.Visible = true;
}
private void notifyIcon1_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
this.MinimizedToNormal();
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (closeTag)
{
e.Cancel = true;
NormalToMinimized();
}
}
四、源码下载
源码。