采用Windows服务任务调度Quartz.NET

Windows服务使用标准的Csharp编写,任务调度框架采用开源的Quartz.NET。
    首先创建Windows服务-JobService
    

其次创建类库项目-JobLibrary
    整体解决方案架构图如下:
    

在JobLibary中添加Quartz.NET的Nuget包引用,添加之后,vs会自动添加一系列的依赖项,这些依赖项是必须的,别手抖删掉了。
    
    
    其次再添加Common.Logging.Log4Net1211的Nuget包,他是Log4net的另外一种实现,会自动添加log4net的依赖
    所有添加的包如下图:
    

  下面开始添加任务,在libary中添加一个job类继承IJob,并实现其接口

  

using System;
using Quartz;

namespace JobLibrary
{
    public class Job : IJob
    {
        private static readonly Common.Logging.ILog logger = Common.Logging.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
        public void Execute(IJobExecutionContext context)
        {
            try
            {
                logger.Info("job开始");
                using (System.IO.StreamWriter sw = new System.IO.StreamWriter("E:\\log.txt", true))
                {
                    sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + " 吃饭---睡觉");

                }
                logger.Info("job结束");
            }
            catch (Exception e)
            {
                logger.Error(e.Message);
            }
        }
    }   

}

这个类就是你需要做的任务。我的任务是吃饭和睡觉。

然后再在JobService中添加JobLibrary的引用,并且添加如下代码(需要同样添加Nuget引用)

using Common.Logging;
using Quartz;
using Quartz.Impl;
using System.ServiceProcess;

namespace JobService
{
    public partial class Service1 : ServiceBase
    {
        private IScheduler scheduler;
        private readonly ILog logger;
        public Service1()
        {
            InitializeComponent();
            ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
            scheduler = schedulerFactory.GetScheduler();
            logger = LogManager.GetLogger(GetType());
        }

        protected override void OnStart(string[] args)
        {
            logger.Info("Quartz服务成功启动");
            scheduler.Start();
        }

        protected override void OnStop()
        {
            scheduler.Shutdown(false);
        }
    }
}

  

代码完成之后,需要配置quartz_jobs.xml,在JobService项目添加xml配置文件“quartz_jobs.xml”,并添加任务配置。

<?xml version="1.0" encoding="UTF-8"?>
<!-- This file contains job definitions in schema version 2.0 format -->
<job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0">
  <processing-directives>
    <overwrite-existing-data>true</overwrite-existing-data>
  </processing-directives>
  <schedule>
    <!--定义示例任务1 Job-->
    <job>
      <name>DemoJob1</name>
      <group>DeomJobGroup</group>
      <description>Quartz.Net示例任务1</description>
      <job-type>JobLibrary.Job,JobLibrary</job-type>
      <durable>true</durable>
      <recover>false</recover>
    </job>

    <!--定义示例任务1 触发器 每10秒执行一次DemoJob1任务-->
    <trigger>
      <cron>
        <name>DemoJob1Trigger</name>
        <group>DeomJobTriggerGroup</group>
        <job-name>DemoJob1</job-name>
        <job-group>DeomJobGroup</job-group>
        <cron-expression>0/10 * * * * ?</cron-expression>
      </cron>
    </trigger>
  </schedule>
</job-scheduling-data>

  这个配置文件有个莫名其妙的bug,就是最上面那几行不能有空行,不知道是什么情况,有知道伙计望告知。被这个坑了半天。

  其次,在添加quartz.config配置文件

  

# You can configure your scheduler in either <quartz> configuration section
# or in quartz properties file
# Configuration section has precedence

quartz.scheduler.instanceName = ServerScheduler

# configure thread pool info
quartz.threadPool.type = Quartz.Simpl.SimpleThreadPool, Quartz
quartz.threadPool.threadCount = 10
quartz.threadPool.threadPriority = Normal

# job initialization plugin handles our xml reading, without it defaults are used
quartz.plugin.xml.type = Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz
quartz.plugin.xml.fileNames = ~/quartz_jobs.xml

# export this server to remoting context
quartz.scheduler.exporter.type = Quartz.Simpl.RemotingSchedulerExporter, Quartz
quartz.scheduler.exporter.port = 555
quartz.scheduler.exporter.bindName = QuartzScheduler
quartz.scheduler.exporter.channelType = tcp
quartz.scheduler.exporter.channelName = httpQuartz

然后就是app.config的quartz的配置了

  

 <configSections>
    <section name="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
    <sectionGroup name="common">
      <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging"/>
    </sectionGroup>
  </configSections>

  然后就是编译,记住quartz_jobs.xml和quartz.config这两个文件一定要编译输出,要不然读取不到。

  

启动之后,就可以看到写到文件中的内容了。

如果一台机器上跑任务,那么如果这太机器挂掉了怎么办?如果是多台机器上跑任务,那么任务重复执行怎么办?

时间: 2024-10-25 08:37:57

采用Windows服务任务调度Quartz.NET的相关文章

使用普通Windows服务创建Quartz.Net服务项目

使用普通Windows服务创建Quartz.Net服务项目 首先创建Quartz.Net.2.0解决方案,添加 Windows服务 项目,添加安装程序,修改服务运行账户类型为LocalSystem(默认为User) 添加C5.dll.Common.Logging.dll.Common.Logging.Log4Net.dll.log4net.dll.Quartz.dll引用 C5.dll 一个C#和其他CLI语言的泛型集合类..Net2.0及以上才可以使用.简介地址:http://www.itu.

windows服务+定时任务(quartz.net)+nancy

需求一:软件要能在操作系统启动后,自动运行因为操作系统是windows 10,所以最先想到的是windows服务,因为windows服务有个自动启动选项,设为true就行了..net做这个最合适了,可以建windows服务项目. 需求二:包含N个任务,要求每天.每周.每月都可以执行,时间可自己设置面对这个需求,很明显Timer不适合了,最先想到的便是Quartz.net,因为这个东西之前也用过,所以就用它了.满足需求绰绰有余.有一点需要说明的是,具体时间是保存在数据库里面的,服务在从数据库读取到

windows 服务实现定时任务调度(Quartz.Net)

我们通常在一些情况下需要软件具有一个自动执行某些任务的功能,但是又不希望直接启动软件,或者每次都要手动的来启动软件,这时我们可可以考虑到windows服务了. 首先创建一个windows服务项目(详细信息请参阅:C#创建Windows Service(Windows 服务)基础教程) 在创建好的项目中点击“单击此处切换到代码视图”切换到代码 我们主要关注一下两个方法: • OnStart – 控制服务启动 • OnStop – 控制服务停止 例: 1 public partial class S

Quartz.Net在windows服务中的使用

写在前面 这几天在弄一个项目,需要定时抓取一些数据,当时也想直接用timer算了.因为之前也弄过这样的项目,但是一想,已经用过了,再去使用同一种思路,未免太乏味了.就换了一种新玩法.这里将之前看到的一篇文章中提出的一个思路,在这个项目中实践了一下,发现乐在其中. Quarzt.net [转]C#创建服务及使用程序自动安装服务,.NET创建一个即是可执行程序又是Windows服务的exe 这篇文章,给了一种好玩的方式,并且自己也实践了一下,而且也确确实实在项目中用到了. 简单一个demo,先熟悉如

Quartz.NET Windows 服务示例

想必大家在项目中处理简单的后台持续任务或者定时触发任务的时候均使用 Thread 或者 Task 来完成,但是项目中的这种需求一旦多了的话就得将任务调度引入进来了,那今天就简单的介绍一下 Quartz.NET 基于 Windows 服务宿主是怎样配置使用的. Quartz.NET 是一个优秀的任务调度框架,移植于 Java 版的 Quartz . 官网:http://www.quartz-scheduler.net Github:https://github.com/quartznet/quar

C#-Windows服务+Quartz定时任务

Windows服务中,因为需要精确到特定时间执行,用Quartz代替定时器Timer. 顺便一提,Quartz如果在网页的项目中使用,Quartz会因为网页的关闭而停止,所以和Windows服务搭配较为理想. 1.新建服务 可以参考:https://www.cnblogs.com/ywkcode/p/11569593.html 2.Quartz使用 可以参考:https://www.cnblogs.com/ywkcode/p/11110126.html 代码如下: (1)创建任务 新建“Upda

Quartz+TopShelf实现Windows服务作业调度

Quartz:首先我贴出来了两段代码(下方),可以看出,首先根据配置文件(quartz.config),包装出一个Quartz.Core.QuartzScheduler instance,这是一个调度器,调度各个任务项(Jobs)的执行.这个调度器可以被Start.被Shutdown.被PauseAll.被ResumeAll,这对应 了windows服务的开启.停止.暂停.恢复.当启动服务,我就调用调度器的Start(),停止服务我就调用调度器的Shutdown()方法. namespace Q

使用Topshelf快速搭建Windows服务

创建一个windows服务用于同步SqlServer数据到Elasticsearch 新建elasticsearch索引 PUT:http://localhost:9200/index_singer/ { "settings": { "number_of_shards": 5, "number_of_replicas": 1 }, "mappings": { "singer_index": { "

不用写Windows服务实现定时器功能(FluentScheduler )

链接:http://www.cnblogs.com/mafly/p/FluentScheduler.html MacBook Pro 只有四个 USB Type-C 接口是否错了? 一项新技术的诞生总会对已存在的事物造成冲击或影响,如果大家都害怕冲击与影响,那这个世界永远像现在不变就行了,大家都好好的,待在自己的舒适区,社会丝毫没有创新与进步而言. 其实, USB Type-C 接口协议在三年前几个科技巨头公司就参与制定了协议,并答应要在自家的产品上推广它,但谁都怕一下子在自家产品上升级 USB