.NET 任务调度Quartz系列(1)——自建定时任务
在我们平时项目中经常会遇到定时任务,比如定时同步数据,定时备份数据,定时统计数据等,定时任务我们都知道使用Quartz.net,此系列写的也是Quartz,但是在此之前,我们先用其他方式做个简单的定时任务进行入门。
首先呢,我们现在自己先写一个简单的定时循环任务,话不多说,直接上代码:
第一步:创建项目,新建一个类库:我们命名为TaskBase
第二部:添加一个抽象基础类BaseMonitor:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace TaskBase
{
/// <summary>
/// 监测基础抽象类
/// </summary>
public abstract class BaseMonitor
{ protected System.Threading.Thread _thread;
/// <summary>
/// 监控时间间隔(毫秒)
/// </summary>
public virtual int Interval { get; set; } public virtual string Name { get; set; }
/// <summary>
/// 监控器状态
/// </summary>
public virtual TaskState State { get; set; }
public BaseMonitor(string name)
{
Name = name;
_thread = new System.Threading.Thread(BaseRun);
_thread.IsBackground = true;//获取或设置一个值,该值指示某个线程是否为后台线程
_thread.Start();
State = TaskState.运行;
}
private void BaseRun()
{
while (State==TaskState.运行)
{
try
{
Run();
System.Threading.Thread.Sleep(Interval);
}
catch (Exception ex)
{
State = TaskState.异常;
PCore.Log.LogTextHelper.WriteErrorLog(this.GetType().Name + "监控出现错误,此监视器已暂停!", ex);
}
}
}
protected virtual void Run()
{ }
}
}
(代码中PCore.Log.LogTextHelper.WriteErrorLog 是一个写文本日志的方法,可自行写个此方法。)
注:此定时任务基础类 是用 System.Threading.Thread 实现,其中 TaskState为一个枚举来表示任务的状态:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace TaskBase
{
public enum TaskState
{
未开始=,
运行=,
暂停=,
异常=
}
}
第三部:添加一个继承BaseMonitor的TestMontior类,代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace TaskBase
{
public class TestMontior:BaseMonitor
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="name">检测器名称</param>
public TestMontior(string name) : base(name)
{
}
/// <summary>
/// 监控时间间隔(毫秒)
/// </summary>
public override int Interval
{
get
{
return GlobalConfig.TestMonitorInterval;
}
}
public override string Name
{
get
{
return base.Name;
} set
{
base.Name = value;
}
} public override TaskState State
{
get
{
return base.State;
} set
{
base.State = value;
}
}
protected override void Run()
{
PCore.Log.LogTextHelper.WriteLog("TestMontitor监测器正在监测");
}
}
}
注:TestMontior 相当于我们的Job,代码中 GlobalConfig是我定义的一个全局参数类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace TaskBase
{
public static class GlobalConfig
{
public static int TestMonitorInterval
{
get { return * ; }
} public static List<BaseMonitor> Monitor = new List<BaseMonitor>();
}
}
创建完成之后就是这个样子:

定时任务的基础类库已经创建完毕,下面我们来看怎么使用它。
第四部:在WEB中使用:创建一个WEB MVC项目,引用TaskBase,然后在Global.asax中添加以下代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing; namespace WebTaskTest
{
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles); TaskBase.GlobalConfig.Monitor.Add(new TaskBase.TestMontior("测试监控器Test"));//注册定时任务 }
}
}
运行WEB站点,查看日志如下:

可以看到一秒钟执行一次 ,因为我们在GlobalConfig.TestMonitorInterval设置的就是一秒钟。
下面我们看如何在windows server中如何使用:
创建一个WindowsServerTest类库,引用TaskBse,添加一个windows服务:
using Quartz;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks; namespace WindowsServerTest
{
partial class TestService : ServiceBase
{
public TestService()
{
InitializeComponent();
} protected override void OnStart(string[] args)
{
try
{
// TODO: 在此处添加代码以启动服务。
PCore.Log.LogTextHelper.WriteLog("OnStart:Test服务开始..."); TaskBase.GlobalConfig.Monitor.Add(new TaskBase.TestMontior("测试监控器Test"));//注册监视器 }
catch (Exception ex)
{
PCore.Log.LogTextHelper.WriteErrorLog("出错了",ex);
}
} protected override void OnStop()
{ // TODO: 在此处添加代码以执行停止服务所需的关闭操作。
PCore.Log.LogTextHelper.WriteLog("OnStop:Test服务结束...");
}
protected override void OnPause()
{
PCore.Log.LogTextHelper.WriteLog("OnPause:Test服务暂停...");
}
protected override void OnContinue()
{
PCore.Log.LogTextHelper.WriteLog("OnContinue:Test服务继续...");
}
}
}
关于windows服务的安装卸载可自行百度,再此不多哔哔了。
安装好服务开始后,我们查看下日志如下:

此节中我们简单做了一个定时任务,下章我们将进行Quartz.net任务框架的介绍。(源代码会跟随后面的例子一并上传),请继续关注以后章节。
.NET 任务调度Quartz系列(1)——自建定时任务的更多相关文章
- spring 任务调度quartz
简单记录一下spring任务调度quartz的例子 首先添加包 quartz-2.2.3.jar 然后写个简单的TestJob类 package com.job; import java.util.D ...
- c/c++ 模板与STL小例子系列<一 >自建Array数组
c/c++ 模板与STL小例子系列 自建Array数组 自建的Array数组,提供如下对外接口 方法 功能描述 Array() 无参数构造方法,构造元素个数为模板参数个的数组 Array(int le ...
- Storm编程入门API系列之Storm的定时任务实现
概念,见博客 Storm概念学习系列之storm的定时任务 Storm的定时任务,分为两种实现方式,都是可以达到目的的. 我这里,分为StormTopologyTimer1.java 和 Sto ...
- Storm概念学习系列之storm的定时任务
不多说,直接上干货! 至于为什么,有storm的定时任务.这个很简单.但是,这个在工作中非常重要! 假设有如下的业务场景 这个spoult源源不断地发送数据,boilt呢会进行处理.然后呢,处理后的结 ...
- 【优化技术专题】「温故而知新」基于Quartz系列的任务调度框架的动态化任务实现分析
不提XXLJOB或者其他的调度框架,就看我接触的第一个任务调度框架Quartz(温故而知新) Quartz的动态暂停 恢复 修改和删除任务 实现动态添加定时任务,先来看一下我们初步要实现的目标效果图, ...
- 定时组件quartz系列<三>quartz调度机制调研及源码分析
quartz2.2.1集群调度机制调研及源码分析引言quartz集群架构调度器实例化调度过程触发器的获取触发trigger:Job执行过程:总结:附: 引言 quratz是目前最为成熟,使用最广泛的j ...
- 定时组件quartz系列<一>模拟定时组件小程序
一.核心概念 Quartz的原理不是很复杂,只要搞明白几个概念,然后知道如何去启动和关闭一个调度程序即可. 1.Job表示一个工作,要执行的具体内容.此接口中只有一个方法void execute(Jo ...
- 任务调度 QUARTZ
任务调度在目前的JAVA应用程序中运用的十分普遍,故掌握QUARTZ是必备的技能 闲话少说,上官网:http://www.quartz-scheduler.org/ 下载最新1.80资源包 commo ...
- 分布式任务调度——quartz + spring + 数据库
项目中使用分布式并发部署定时任务,多台跨JVM,按照常理逻辑每个JVM的定时任务会各自运行,这样就会存在问题,多台分布式JVM机器的应用服务同时干活,一个是加重服务负担,另外一个是存在严重的逻 ...
随机推荐
- android笔记:BroadcastReceiver
android允许应用程序自由地发送和接收广播. 广播是通过Intent进行数据传递的.接收广播则通过Broadcast Receiver(广播接收器)实现. 广播分为:标准广播和有序广播. 标准广播 ...
- 42. Trapping Rain Water (Array,stack; DP)
Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...
- Intersection(Check)
Intersection http://poj.org/problem?id=1410 Time Limit: 1000MS Memory Limit: 10000K Total Submissi ...
- Web服务器和应用服务器简介
通俗的讲,Web服务器传送页面使浏览器可以浏览,然而应用程序服务器提供的是客户端应用程序可以调用(call)的方法(methods).确切一点,你可以说:Web服务器专门处理HTTP请求(reques ...
- Python 安装路径, dist-packages 和 site-packages 区别
Stack Overflow's answer 译: dist-packages is a Debian-specific convention that is also present in its ...
- js回车、ESC、F2按钮事件
<script type="text/javascript" language=JavaScript charset="UTF-8"> docume ...
- MongoDb进阶实践之四 MongoDB查询命令详述
一.引言 上一篇文章我们已经介绍了MongoDB数据库的最基本操作,包括数据库的创建.使用和删除数据库,文档的操作也涉及到了文档的创建.删除.更新和查询,当然也包括集合的创建.重命名和删除.有了这些基 ...
- zeromq学习记录(二)天气更新服务器使用ZMQ_SUB ZMQ_PUB
/************************************************************** 技术博客 http://www.cnblogs.com/itdef/ ...
- Picard Tools
Picard Tools - By Broad Institute http://broadinstitute.github.io/picard/command-line-overview.html ...
- 2018软工项目UML设计(团队)
团队信息 队名:火箭少男100 本次作业课上成员 短学号 名 本次作业博客链接 2507 俞辛(临时队长) https://www.cnblogs.com/multhree/p/9821080.htm ...