作业调度小软件

最近,由于工作需要,做了一个作业调度的小软件。先上两张效果图。

一、效果图

作业启动状

 作业停止状态

二、Quartz

调度的核心库用的是 Quartz.NET。官方网站:http://quartznet.sourceforge.net/。这里有更多的中文介绍。

先创建一个类库,新建一个TaskJob类用来执行任务。

using System;
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点,每一分钟触发一次。

<?xml version="1.0" encoding="utf-8" ?>
<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;
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(truetrue);
            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();
 

        HandleMask batch;
        
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;
            }
        }

作业启动事件

        private void tscbStart_Click(object sender, EventArgs e)
        {
            batch.Start();
            tscbStart.Enabled 
= false;
            tscbStop.Enabled 
= true;
            tscbExit.Enabled 
= true;
            lblCurState.Text 
= "作业已启动,启动时间:"+DateTime.Now;
        }

作业停止事件

private void tscbStop_Click(object sender, EventArgs e)
        {
            batch.Stop();
            tscbStart.Enabled 
= true;
            tscbStop.Enabled 
= false;
            tscbExit.Enabled 
= true;
            lblCurState.Text 
= "作业已暂停,停止时间:"+DateTime.Now;
        }

退出事件

        private void tscbExit_Click(object sender, EventArgs e)
        {
            batch.Stop();
            closeTag 
= false;
            Application.Exit();
        }

辅助功能
禁止最大化:MaximizeBox:false;
禁止调整窗体大小: FormBorderStyle:FixedSingle

点击关闭时最小化

 private void Form1_Resize(object sender, EventArgs e)
        {
             
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();
           }
        }

四、源码下载
源码



原文地址:https://www.cnblogs.com/tenghoo/p/quartz.html