c#quartz触发_C#中Quartz的简单易懂定时任务实现

作为一个优秀的开源调度框架,Quartz 具有以下特点:

强大的调度功能,例如支持丰富多样的调度方法,可以满足各种常规及特殊需求;

灵活的应用方式,例如支持任务和调度的多种组合方式,支持调度数据的多种存储方式;

分布式和集群能力,Terracotta 收购后在原来功能基础上作了进一步提升。

另外,作为 Spring 默认的调度框架,Quartz 很容易与 Spring 集成实现灵活可配置的调度功能。

quartz调度核心元素:

Scheduler:任务调度器,是实际执行任务调度的控制器。在spring中通过SchedulerFactoryBean封装起来。

Trigger:触发器,用于定义任务调度的时间规则,有SimpleTrigger,CronTrigger,DateIntervalTrigger和NthIncludedDayTrigger,其中CronTrigger用的比较多,本文主要介绍这种方式。CronTrigger在spring中封装在CronTriggerFactoryBean中。

Calendar:它是一些日历特定时间点的集合。一个trigger可以包含多个Calendar,以便排除或包含某些时间点。

JobDetail:用来描述Job实现类及其它相关的静态信息,如Job名字、关联监听器等信息。在spring中有JobDetailFactoryBean和 MethodInvokingJobDetailFactoryBean两种实现,如果任务调度只需要执行某个类的某个方法,就可以通过MethodInvokingJobDetailFactoryBean来调用。

Job:是一个接口,只有一个方法void execute(JobExecutionContext context),开发者实现该接口定义运行任务,JobExecutionContext类提供了调度上下文的各种信息。Job运行时的信息保存在JobDataMap实例中。实现Job接口的任务,默认是无状态的,若要将Job设置成有状态的,在quartz中是给实现的Job添加@DisallowConcurrentExecution注解(以前是实现StatefulJob接口,现在已被Deprecated),在与spring结合中可以在spring配置文件的job detail中配置concurrent参数。

我这里简单记录使用过程及代码:

1:首先引用Quartz组件

2:using Quartz;using Quartz.Impl;

注:在本地新建一个控制台项目,将以下代码copy过去即可用,只需要重写Execute方法即可。Quartz3.0及以上的版本是采用的异步,3.0以下的版本没有采用异步,使用方法是一样的

主函数入口文件:

using BackgroundTask.job;

using log4net;

using Quartz;

using Quartz.Impl;

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace BackgroundTask

{

class Program

{

private static readonly ILog _log = LogManager.GetLogger(typeof(Program));

private static readonly string tiggerName = "TestJobTrigger";

private static readonly string gropName = "TestJobTriggerGrop";

private static readonly string jobName = "TestJob";

//从工厂中获取一个调度器实例化

private static IScheduler scheduler = null;

static void Main(string[] args)

{

Console.WriteLine("开始任务....");

_log.Debug("开始任务....");

Start();

}

private static async void Start()

{

//从工厂中获取一个调度器实例化

scheduler = await StdSchedulerFactory.GetDefaultScheduler();

await scheduler.Start();

//创建一个作业

IJobDetail job1 = JobBuilder.Create()

.WithIdentity(jobName, gropName)

.UsingJobData("key","value")// 传递参数 在Execute方法中获取(以什么类型值传入,取值就用相应的类型方法取值)

.Build();

// 创建触发器

ITrigger trigger1 = TriggerBuilder.Create()

.WithIdentity(tiggerName, gropName)

.StartNow() //现在开始

.WithSimpleSchedule(x => x //触发时间,10秒一次。

.WithIntervalInSeconds(10)

.RepeatForever()) //不间断重复执行

.Build();

await scheduler.ScheduleJob(job1, trigger1); //把作业,触发器加入调度器。

Console.ReadKey();

// 清除任务和触发器

ClearJobTrigger();

}

///

/// 清除任务和触发器

///

private static void ClearJobTrigger()

{

TriggerKey triggerKey = new TriggerKey(tiggerName, gropName);

JobKey jobKey = new JobKey(jobName, gropName);

if (scheduler != null)

{

scheduler.PauseTrigger(triggerKey);

scheduler.UnscheduleJob(triggerKey);

scheduler.DeleteJob(jobKey);

scheduler.Shutdown();// 关闭

}

}

}

}

实现IJob 接口的任务文件

using log4net;

using Quartz;

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace BackgroundTask.job

{

public class TestJob : IJob

{

private readonly ILog _log = LogManager.GetLogger(typeof(TestJob));

///

/// 测试作业

///

///

///

public async Task Execute(IJobExecutionContext context)

{

JobDataMap dataMap = context.JobDetail.JobDataMap;

string k = dataMap.GetString("key");//获取参数(可根据传递的类型使用GetInt、GetFloat、GetString.....)

_log.Debug("run TestJob debug");

_log.Error("run TestJob error");

_log.Info("run TestJob info");

// 在这里处理你的任务

}

}

}

基于spring的quartz定时框架,实现简单的定时任务功能

在项目中,经常会用到定时任务,这就需要使用quartz框架去进行操作. 今天就把我最近做的个人主页项目里面的定时刷新功能分享一下,很简单. 首先需要配置一个配置文件,因为我是基于spring框架的,所 ...

基于Spring的最简单的定时任务实现与配置(一)

朋友的项目中有点问题.他那边是Spring架构的,有一个比较简单的需要定时的任务执行.在了解了他的需求之后,于是提出了比较简单的Spring+quartz的实现方式. 注意本文只是讨论,在已搭建完毕的 ...

springboot整合Quartz实现动态配置定时任务

前言 在我们日常的开发中,很多时候,定时任务都不是写死的,而是写到数据库中,从而实现定时任务的动态配置,下面就通过一个简单的示例,来实现这个功能. 一.新建一个springboot工程,并添加依赖 & ...

Spring+Quartz实现动态添加定时任务

发布时间:2018-12-03   技术:spring4.0.2+quartz2.2.1   概述 在最近工作中,由于涉及到定时任务特别多,而这些工作又是由下属去完成的,在生成环境中经常会出现业务逻辑 ...

使用Quartz.net来执行定时任务

Quartz.net使用方法:http://www.cnblogs.com/lizichao1991/p/5707604.html 最近,项目中需要执行一个计划任务,组长就让我了解一下Quartz.n ...

springboot和quartz整合实现动态定时任务(持久化单节点)

Quartz是一个完全由java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制,它支持定时任务持久化到数据库,从而避免了重启服务器时任务丢失,支持分布式多节点,大大的 ...

基于Spring的最简单的定时任务实现与配置(二)

接上一篇,原本我以为我实现的方式很简单了,在准备写(一)的时候,就去查了查别人是怎么实现定时任务的.不查还好,这一查,发现还有更简单的.所以就会有这篇文章. 本文主要是讨论,在完成Spring 项目搭 ...

使用spring+quartz配置多个定时任务

Spring被用在了越来越多的项目中, quartz也被公认为是比较好用的定时器设置工具, 在这里通过一个demo说明如何使用spring和quartz配置多个定时任务. 环境: eclipse + ...

如何在Spring Boot 中动态设定与执行定时任务

本篇文章的目的是记录并实现在Spring Boot中,动态设定与执行定时任务. 我的开发项目是 Maven 项目,所以首先需要在 pom.xml 文件中加入相关的依赖.依赖代码如下所示:

随机推荐

Winform控件WebBrowser与JS脚本交互

1)在c#中调用js函数 如果要传值,则可以定义object[]数组. 具体方法如下例子: 首先在js中定义被c#调用的方法: function Messageaa(message) {       ...

[源码]String StringBuffer StringBudlider(1String部分)

String     /** The value is used for character storage. */     private final char value[];  /** Th ...

html5实战2

JSON的parse()和stringfy()方法

1.JSON.parse; 作用:将JavaScript对象表示法的JSON字符串转换为对象(字符串转对象). 语法:JSON.parse(text [, reviver]) text 必选. 一个有 ...

ORACLE SQL 分组

select max(cost),suppliercode from tel_bill where period = '2014005' group by suppliercode;select * ...

基于Emgu cv的图像拼接(转)

分类: 编程 C# Emgu cv Stitching 2012-10-27 11:04 753人阅读 评论(1) 收藏 举报 在新版本的Emgu cv中添加了Emgu.CV.Stitching,这极 ...

IOS 图片转换二进制 二进制转换为图片

//类方法 图片 转换为二进制 +(NSData *)Image_TransForm_Data:(UIImage *)image { NSData *imageData = UIImageJPEGRe ...

July 02nd. 2018, Week 27th. Monday

Bad times make a good man. 艰难困苦出能人. Bad times make a good man, and hard times create strong men, but ...

oracle分区表彻底删除的办法,处理删不掉的不规则表名

Oracle分区表彻底删除的办法当对一个不再使用的分区表进行drop后,查询user_tab_partitions视图发现出现如下不规则的分区表表名:SQL> select distinct t ...

css实现梯形

使用伪元素before和after分别在矩形元素前后加三角形或者直接设置border 使用3d旋转矩形,使之看起来像矩形

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值