Quartz.Net为开源的作业调度框架,使用方便,实现IJob接口,及相关配置,即可实现调度。

项目包安装:

install-package Quartz

install-package log4net

install-package Common.Logging.Log4Net1211(最新版为Common.Logging.Log4Net1213,但会出现“Unable to create instance of type Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter.”异常)

配置文件:

编辑App.config

 <?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="log4net" publicKeyToken="669e0ddf0bb1aa2a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.2.15.0" newVersion="1.2.15.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

log4net配置文件(log4net.config)

 <?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections> <log4net>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<!--日志路径-->
<param name= "File" value= "D:\QuartzLog\"/>
<!--是否是向文件中追加日志-->
<param name= "AppendToFile" value= "true"/>
<!--log保留天数-->
<param name= "MaxSizeRollBackups" value= ""/>
<!--日志文件名是否是固定不变的-->
<param name= "StaticLogFileName" value= "false"/>
<!--日志文件名格式为:--.log-->
<param name= "DatePattern" value= "yyyy-MM-dd&quot;.read.log&quot;"/>
<!--日志根据日期滚动-->
<param name= "RollingStyle" value= "Date"/>
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n %loggername" />
</layout>
</appender> <!-- 控制台前台显示日志 -->
<appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
<mapping>
<level value="ERROR" />
<foreColor value="Red, HighIntensity" />
</mapping>
<mapping>
<level value="Info" />
<foreColor value="Green" />
</mapping>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%n%date{HH:mm:ss,fff} [%-5level] %m" />
</layout> <filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="Info" />
<param name="LevelMax" value="Fatal" />
</filter>
</appender> <root>
<!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低) -->
<level value="all" />
<appender-ref ref="ColoredConsoleAppender"/>
<appender-ref ref="RollingLogFileAppender"/>
</root>
</log4net>
</configuration>

quartz配置文件(quartz.config)

 # You can configure your scheduler in either <quartz> configuration section
# or in quartz properties file
# Configuration section has precedence quartz.scheduler.instanceName = QuartzTest # configure thread pool info
quartz.threadPool.type = Quartz.Simpl.SimpleThreadPool, Quartz
quartz.threadPool.threadCount =
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 =
#quartz.scheduler.exporter.bindName = QuartzScheduler
#quartz.scheduler.exporter.channelType = tcp
#quartz.scheduler.exporter.channelName = httpQuartz

job配置信息(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> <!--TestJob测试 任务配置-->
<job>
<name>TestJob</name>
<group>Test</group>
<description>TestJob测试</description>
<job-type>ConsoleApplicationQuartz.TestJob,ConsoleApplicationQuartz</job-type>
<durable>true</durable>
<recover>false</recover>
</job>
<trigger>
<cron>
<name>TestJobTrigger</name>
<group>Test</group>
<job-name>TestJob</job-name>
<job-group>Test</job-group>
<start-time>--22T00::+:</start-time>
<cron-expression>/ * * * * ?</cron-expression>
</cron>
</trigger> </schedule>
</job-scheduling-data>

一、控制台项目:

创建Job类实现IJob接口

 using log4net;
using Quartz;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplicationQuartz
{
public sealed class TestJob : IJob
{
private readonly ILog _logger = LogManager.GetLogger(typeof(TestJob));
public void Execute(IJobExecutionContext context)
{
_logger.InfoFormat("TestJob测试");
}
}
}

Program主程序

 using log4net;
using Quartz;
using Quartz.Impl;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplicationQuartz
{
class Program
{
static void Main(string[] args)
{
log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config")); ILog log = LogManager.GetLogger(typeof(Program)); StdSchedulerFactory factory = new StdSchedulerFactory();
IScheduler _scheduler = factory.GetScheduler();
_scheduler.Start();
Console.WriteLine("Start..."); Console.Read(); _scheduler.Shutdown();
Console.WriteLine("end...");
Console.Read(); }
}
}

运行效果:

ConsoleApplicationQuartz.TestJob - TestJob测试
ConsoleApplicationQuartz.TestJobname2016-- ::, [QuartzTest_Worker-] INFO ConsoleApplicationQuartz.TestJob - TestJob测试
ConsoleApplicationQuartz.TestJobname2016-- ::, [QuartzTest_Worker-] INFO ConsoleApplicationQuartz.TestJob - TestJob测试
ConsoleApplicationQuartz.TestJobname2016-- ::, [QuartzTest_Worker-] INFO ConsoleApplicationQuartz.TestJob - TestJob测试
ConsoleApplicationQuartz.TestJobname2016-- ::, [QuartzTest_Worker-] INFO ConsoleApplicationQuartz.TestJob - TestJob测试
ConsoleApplicationQuartz.TestJobname2016-- ::, [QuartzTest_Worker-] INFO ConsoleApplicationQuartz.TestJob - TestJob测试
ConsoleApplicationQuartz.TestJobname2016-- ::, [QuartzTest_Worker-] INFO ConsoleApplicationQuartz.TestJob - TestJob测试
ConsoleApplicationQuartz.TestJobname2016-- ::, [QuartzTest_Worker-] INFO ConsoleApplicationQuartz.TestJob - TestJob测试
ConsoleApplicationQuartz.TestJobname2016-- ::, [QuartzTest_Worker-] INFO ConsoleApplicationQuartz.TestJob - TestJob测试
ConsoleApplicationQuartz.TestJobname2016-- ::, [QuartzTest_Worker-] INFO ConsoleApplicationQuartz.TestJob - TestJob测试
ConsoleApplicationQuartz.TestJobname2016-- ::, [] INFO

二、Windows服务程序

创建IJob任务实现类

 using log4net;
using Quartz;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace FD.ScheduleQuartz.WindowsServiceQuartz
{
public class TestJob : IJob
{
private static readonly ILog Logger = LogManager.GetLogger("TestJob");
public void Execute(IJobExecutionContext context)
{
string jobDes = context.JobDetail.Description;
Logger.Info(jobDes + "运行");
}
}
}

windows服务MainService主服务类

 using log4net;
using Quartz;
using Quartz.Impl;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks; namespace FD.ScheduleQuartz.WindowsServiceQuartz
{
public partial class MainService : ServiceBase
{
#region 字段
// 日志记录
private readonly ILog _logger;
// 调试器
private readonly IScheduler _scheduler;
#endregion public MainService()
{
InitializeComponent(); log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config")); _logger = LogManager.GetLogger(GetType());
StdSchedulerFactory factory = new StdSchedulerFactory();
_scheduler = factory.GetScheduler();
} protected override void OnStart(string[] args)
{
_scheduler.Start();
_logger.Info("服务启动");
} protected override void OnStop()
{
if (!_scheduler.IsShutdown)
_scheduler.Shutdown();
_logger.Info("服务停止");
} protected override void OnPause()
{
_scheduler.PauseAll();
base.OnPause();
} protected override void OnContinue()
{
_scheduler.ResumeAll();
base.OnContinue();
}
}
}

修改quartz_jobs.xml中配置

将job-type修改为windows服务项目中类型

<job-type>FD.ScheduleQuartz.WindowsServiceQuartz.TestJob,WindowsServiceQuartz</job-type>

创建Windows服务的ProjectInstaller,并设置相应的服务名称及显示名称,运行此服务账号类型(LocalSystem),启动此服务方式和时间设置为Manual

编码后:通过:C:\Windows\Microsoft.NET\Framework64\v4.0.30319\下的installUtil.exe安装Windows服务

如图:

启动服务,及停止服务后,得到log内容:

FD.ScheduleQuartz.WindowsServiceQuartz.MainService - 服务启动
FD.ScheduleQuartz.WindowsServiceQuartz.MainServicename2016-- ::, [QuartzTest_Worker-] INFO TestJob - TestJob测试运行
TestJobname2016-- ::, [QuartzTest_Worker-] INFO TestJob - TestJob测试运行
TestJobname2016-- ::, [QuartzTest_Worker-] INFO TestJob - TestJob测试运行
TestJobname2016-- ::, [QuartzTest_Worker-] INFO TestJob - TestJob测试运行
TestJobname2016-- ::, [QuartzTest_Worker-] INFO TestJob - TestJob测试运行
TestJobname2016-- ::, [QuartzTest_Worker-] INFO TestJob - TestJob测试运行
TestJobname2016-- ::, [QuartzTest_Worker-] INFO TestJob - TestJob测试运行
TestJobname2016-- ::, [QuartzTest_Worker-] INFO TestJob - TestJob测试运行
TestJobname2016-- ::, [QuartzTest_Worker-] INFO TestJob - TestJob测试运行
TestJobname2016-- ::, [QuartzTest_Worker-] INFO TestJob - TestJob测试运行
TestJobname2016-- ::, [QuartzTest_Worker-] INFO TestJob - TestJob测试运行
TestJobname2016-- ::, [] INFO FD.ScheduleQuartz.WindowsServiceQuartz.MainService - 服务停止
FD.ScheduleQuartz.WindowsServiceQuartz.MainServicename

Quartz.Net简单使用的更多相关文章

  1. 基于Quartz实现简单的定时发送邮件

    一.什么是Quartz Quartz 是一个轻量级任务调度框架,只需要做些简单的配置就可以使用:它可以支持持久化的任务存储,即使是任务中断或服务重启后,仍可以继续运行.Quartz既可以做为独立的应用 ...

  2. Quartz定时任务简单实例

    文章纲要: 初步搭建一个由Quartz为引擎集群的定时任务模块,功能为每隔30秒打印一条信息(Hello World!!!) 一.环境 Spring MVC Mevan Quartz 2.2.1 二. ...

  3. C#中Quartz的简单易懂定时任务实现

    作为一个优秀的开源调度框架,Quartz 具有以下特点: 强大的调度功能,例如支持丰富多样的调度方法,可以满足各种常规及特殊需求: 灵活的应用方式,例如支持任务和调度的多种组合方式,支持调度数据的多种 ...

  4. Quartz的简单使用

    一.Quartz 介绍 Quartz是Java领域最著名的.功能丰富的.开放源码的作业调度工具,几乎可以在所有的Java应用程序中集成--从小的单机应用到大的电子商务系统. Quartz可以用来执行成 ...

  5. Quartz SpringBoot 简单整合一下

    一次简单的代码整合记录. 数据库准备 如果是MySQL可能出现一些小问题.比如联合主键长度超限制,已经记录解决办法了. CREATE TABLE QRTZ_JOB_DETAILS ( SCHED_NA ...

  6. quartz 的简单使用

    0.依赖: <!-- 引入quartz对应的依赖 --> <dependency> <groupId>org.quartz-scheduler</groupI ...

  7. 使用Quartz Job 简单的做一个定时服务

    第一步:创建一个windows服务 第二步:通过NuGet 安装Quartz (我搜索了Quartz 关键字 安装了 ) 第三步 代码部分 任务类 如 多个任务 就多几个类 public class ...

  8. Quartz简单案例

    需求需要开发一个每天定时推送消息给微信用户,第一次接触quartz,简单案例 1. 先编辑要执行的任务 测试类代码 package com.wqq.test.quartz; import org.sp ...

  9. Quartz和Spring Task定时任务的简单应用和比较

    看了两个项目,一个用的是Quartz写的定时器,一个是使用spring的task写的,网上看了2篇文章,写的比较清楚,这里做一下留存 链接一.菠萝大象:http://www.blogjava.net/ ...

随机推荐

  1. 图解JVM执行引擎之方法调用

    一.方法调用 方法调用不同于方法执行,方法调用阶段的唯一任务就是确定被调用方法的版本(即调用哪一个方法),暂时还不涉及方法内部的具体运行过程.Class文件的编译过程中不包括传统编译器中的连接步骤,一 ...

  2. fineui刷新父页面

    protected override string AfterAddJS() { //TODO 重载这2个函数 可以控制新增和编辑之后执行的JS return AfterSaveJS_ReloadDa ...

  3. Java多线程 3 线程同步

    在之前,已经学习到了线程的创建和状态控制,但是每个线程之间几乎都没有什么太大的联系.可是有的时候,可能存在多个线程多同一个数据进行操作,这样,可能就会引用各种奇怪的问题.现在就来学习多线程对数据访问的 ...

  4. 无法对 索引 'IndexName' 执行 删除,因为它不存在,或者您没有所需的权限。

    先写结论: 语法:  DROP INDEX 表名.索引名 如果索引明明存在..却报标题上那个错..请直接去看是否是表名与库中的不一样.. 请一定去检查一下..别问我为什么这么说.. if exists ...

  5. TCP学习之四:传输协议

    参考学习张子阳大神的博客:http://www.cnblogs.com/JimmyZhang/category/101698.html     服务端接收到的数据可能是被截断或合并后的数据,需要协议来 ...

  6. 一些关于angularJS的自己学习和开发过程中遇到的问题及解决办法

    这篇文章也许会不定时更新,主要记录这段时间内自己遇到的angularjs学习开发的一些问题的解决办法.本文以摘抄为主,主要目的还是将自己遇到的困惑在各个地方查到的解决办法的汇总,给自己留个备忘吧. 1 ...

  7. CNN车型分类总结

    最近在做一个CNN车型分类的任务,首先先简要介绍一下这个任务. 总共30个类,训练集图片为车型图片,类似监控拍摄的车型图片,训练集测试集安6:4分,训练集有22302份数据,测试集有14893份数据. ...

  8. js 判断客户端浏览器

    var browser={ versions:function(){ var u = navigator.userAgent, app = navigator.appVersion; return { ...

  9. Collection小结

    Collection:

  10. $_SERVER 详情

    $_SERVER['HTTP_ACCEPT_LANGUAGE']//浏览器语言 $_SERVER['REMOTE_ADDR'] //当前用户 IP . $_SERVER['REMOTE_HOST'] ...