zoukankan      html  css  js  c++  java
  • 作业调度小软件

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

    一、效果图

    作业启动状

     作业停止状态

    二、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();
               }
            }

    四、源码下载
    源码



  • 相关阅读:
    EOJ 2743 Stock Exchange
    POJ-3468 A Simple Problem with Integers
    EOJ-1104 bitmap
    【转】旋转卡壳——凸多边形间对踵点对(定义)
    Ring 3层枚举进程的四种方法
    XX-Net项目,免费浏览谷歌的伟大项目
    浅析Java中的内存机制
    Ubuntu下eclipse中安装Scala插件
    注入(5)---导入表注入(HookINT)
    Linux下MySQL导入文件出错ERROR 1290 (HY000)
  • 原文地址:https://www.cnblogs.com/tenghoo/p/quartz.html
Copyright © 2011-2022 走看看