Quartz.Net简单使用
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".read.log""/>
<!--日志根据日期滚动-->
<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简单使用的更多相关文章
- 基于Quartz实现简单的定时发送邮件
一.什么是Quartz Quartz 是一个轻量级任务调度框架,只需要做些简单的配置就可以使用:它可以支持持久化的任务存储,即使是任务中断或服务重启后,仍可以继续运行.Quartz既可以做为独立的应用 ...
- Quartz定时任务简单实例
文章纲要: 初步搭建一个由Quartz为引擎集群的定时任务模块,功能为每隔30秒打印一条信息(Hello World!!!) 一.环境 Spring MVC Mevan Quartz 2.2.1 二. ...
- C#中Quartz的简单易懂定时任务实现
作为一个优秀的开源调度框架,Quartz 具有以下特点: 强大的调度功能,例如支持丰富多样的调度方法,可以满足各种常规及特殊需求: 灵活的应用方式,例如支持任务和调度的多种组合方式,支持调度数据的多种 ...
- Quartz的简单使用
一.Quartz 介绍 Quartz是Java领域最著名的.功能丰富的.开放源码的作业调度工具,几乎可以在所有的Java应用程序中集成--从小的单机应用到大的电子商务系统. Quartz可以用来执行成 ...
- Quartz SpringBoot 简单整合一下
一次简单的代码整合记录. 数据库准备 如果是MySQL可能出现一些小问题.比如联合主键长度超限制,已经记录解决办法了. CREATE TABLE QRTZ_JOB_DETAILS ( SCHED_NA ...
- quartz 的简单使用
0.依赖: <!-- 引入quartz对应的依赖 --> <dependency> <groupId>org.quartz-scheduler</groupI ...
- 使用Quartz Job 简单的做一个定时服务
第一步:创建一个windows服务 第二步:通过NuGet 安装Quartz (我搜索了Quartz 关键字 安装了 ) 第三步 代码部分 任务类 如 多个任务 就多几个类 public class ...
- Quartz简单案例
需求需要开发一个每天定时推送消息给微信用户,第一次接触quartz,简单案例 1. 先编辑要执行的任务 测试类代码 package com.wqq.test.quartz; import org.sp ...
- Quartz和Spring Task定时任务的简单应用和比较
看了两个项目,一个用的是Quartz写的定时器,一个是使用spring的task写的,网上看了2篇文章,写的比较清楚,这里做一下留存 链接一.菠萝大象:http://www.blogjava.net/ ...
随机推荐
- UML大战需求分析--阅读笔记01
本次阅读的书籍是<UML大战需求分析>,看了前两章的内容:1 大话UML,2绞尽脑汁的需求分析.这两章内容关联不大,分开描述. 第一章:大话UML 本章主要概述UML是什么,有什么内容.U ...
- NC凭证接口(Java发送流和处理返回结果)
问题描述: 金融行业在系统模块分为财务和业务两个系统,我公司是负责业务模块系统,NC公司负责财务系统.但是财务有时候需要生成凭证,这时候就涉及业务模块了,我方就需要写NC凭证接口.这时候就需要三方交互 ...
- 语言模型kenlm的训练及使用
一.背景 近期研究了一下语言模型,同事推荐了一个比较好用的工具包kenlm,记录下使用过程. 二.使用kenlm训练 n-gram 1.工具介绍:http://kheafield.com/code/k ...
- Input输入框输入银行卡号自动空格
input输入框是表格中用都最多的,像输入手机,密码,银行卡号的,很多对于输入银行卡号是没有处理的,比如这样~~ 看起来是不是一团乱麻,, 眼睛瞬间一片漆黑~ 如果是这样,会不会好很多呢~~ 其实逻 ...
- Linux开机自动登录(文本模式)
• Linux系统启动登录过程 以RedHat/CentOS为例,Linux系统Level3模式下从启动到登录的整个过程大致如下: 1> 加载BIOS信息:包含了CPU/显卡/内存/硬盘/网卡等 ...
- Gedit 解决中文显示乱码问题
详细请参考:http://wiki.ubuntu.org.cn/Gedit%E4%B8%AD%E6%96%87%E4%B9%B1%E7%A0%81 具体原因是Gedit的默认编码设置没有添加中文编码所 ...
- 关于JavaScript设计模式(一)
以后都在简书写文章了,所以这个转载我在简书中写的.地址这里 http://www.jianshu.com/p/c7b3c2c148c5
- java从基础知识(九)I/O
java中的流可以从不同的角度进行分类 按流的方向:输入流.输出流(注意这里的输入(read).输出是相对于程序而言的(writer),个人认为从读.写角度理解更为直观) 按处理数据单位:字节流.字符 ...
- iOS如何彻底避免数组越界
我们先来看看有可能会出现的数组越界Crash的地方: ? 1 2 3 4 5 6 7 - (void)tableView:(UITableView *)tableView didSelectRowAt ...
- 使用VS2010编译Qt 5.6.1过程记录
由于Qt官方发布的Qt 5.6.1二进制安装包没有对应VS2010版本的,而我的电脑上只安装了VS2010,因此只能自己编译. 本文记录本人的编译安装过程,以及其中遇到的一些问题. 本文使用VS201 ...