Quartz定时任务帮助类

using Quartz;
using Quartz.Impl;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CRM.ThirdAPITools.QuartzHelper
{
/// <summary>
/// Quartz定时任务帮助类: Quartz表达式设计器:http://cron.qqe2.com/
/// </summary>
public class QuartzHelper
{
// Fields
private static object oLock = new object();
private static Dictionary<string, QuartzKey> quartzCache = new Dictionary<string, QuartzKey>();
private const string QuartzHelperScheulerName = "QuartzHelperScheulerName";
private static IScheduler sched = null;
private static ISchedulerFactory sf = null;
// Methods
static QuartzHelper()
{
NameValueCollection props = new NameValueCollection();
props.Add("quartz.scheduler.instanceName", "QuartzHelperScheulerName");
sf = new StdSchedulerFactory(props);
sched = sf.GetScheduler();
}
/// <summary>
/// 关闭
/// </summary>
public static void Close()
{
GetScheduler().Shutdown(true);
}
/// <summary>
/// 删除
/// </summary>
/// <param name="jobKey"></param>
public static void Close(object jobKey)
{
if (jobKey is JobKey)
{
GetScheduler().DeleteJob(jobKey as JobKey);
}
}
/// <summary>
/// 指定日期执行
/// </summary>
/// <param name="action">调用的方法</param>
/// <param name="date">指定日期</param>
/// <param name="dataMap">传输数据映射</param>
/// <param name="jobName">任务名称</param>
/// <returns></returns>
public static QuartzKey ExecuteAtDate(Action<Dictionary<string, object>> action, DateTime date, Dictionary<string, object> dataMap = null, string jobName = null)
{
return Start(action, delegate (TriggerBuilder p)
{
p.WithCronSchedule(BuilderCronExpression(date));
}, dataMap, jobName);
}
/// <summary>
/// 按表达式执行:
/// Quartz表达式设计器:http://cron.qqe2.com/
/// </summary>
/// <param name="action">调用的方法</param>
/// <param name="cronExpression">表达式</param>
/// <param name="dataMap">传输数据映射</param>
/// <param name="jobName">任务名称</param>
/// <returns></returns>
public static QuartzKey ExecuteAtTime(Action<Dictionary<string, object>> action, string cronExpression, Dictionary<string, object> dataMap = null, string jobName = null)
{
return Start(action, delegate (TriggerBuilder p)
{
p.WithCronSchedule(cronExpression);
}, dataMap, jobName);
}
/// <summary>
/// 间隔执行
/// </summary>
/// <param name="action">调用的方法</param>
/// <param name="interval">时间间隔</param>
/// <param name="dataMap">传输数据映射</param>
public static void ExecuteInterval(Action<Dictionary<string, object>> action, TimeSpan interval, Dictionary<string, object> dataMap = null)
{
Action<TriggerBuilder> action2 = null;
lock (oLock)
{
if (action2 == null)
{
action2 = p => p.WithSimpleSchedule(p1 => p1.WithInterval(interval));
}
Start(action, action2, dataMap, null);
}
}
/// <summary>
/// 获取调度名称
/// </summary>
/// <returns></returns>
public static IScheduler GetScheduler()
{
ISchedulerFactory factory = new StdSchedulerFactory();
return factory.GetScheduler("QuartzHelperScheulerName");
}
/// <summary>
/// 任务调度是否开始
/// </summary>
/// <returns></returns>
public static bool IsStart()
{
return ((GetScheduler() != null) && GetScheduler().IsStarted);
}
/// <summary>
/// DateTime转为Quartz表达式
/// </summary>
/// <param name="date"></param>
/// <returns></returns>
public static string BuilderCronExpression(DateTime date)
{
string cron = string.Empty;
cron = string.Format("{0} {1} {2} {3} {4} ?", date.Second, date.Minute, date.Hour, date.Day, date.Month);
return cron;
}
/// <summary>
/// 启用调度任务
/// </summary>
/// <param name="action">方法</param>
/// <param name="action2">构建的出发实例</param>
/// <param name="dataMap">传输数据映射</param>
/// <param name="jobName">任务名称</param>
/// <returns></returns>
private static QuartzKey Start(Action<Dictionary<string, object>> action, Action<TriggerBuilder> action2, Dictionary<string, object> dataMap, string jobName)
{
QuartzKey key = new QuartzKey();
if (jobName != null)
{
if (quartzCache.ContainsKey(jobName))
{
key = quartzCache[jobName];
}
else
{
quartzCache.Add(jobName, key);
}
}
jobName = jobName ?? Guid.NewGuid().ToString("D");
string group = "group_" + jobName;
string name = "trigger_" + jobName;
IJobDetail jobDetail = JobBuilder.Create(typeof(QuartzJob)).WithIdentity(jobName, group).Build();
TriggerBuilder builder = TriggerBuilder.Create().WithIdentity(name, group);
action2(builder);
ITrigger trigger = builder.Build();
if (quartzCache.ContainsKey(jobName))
{
quartzCache[jobName].JobKey = jobDetail.Key;
quartzCache[jobName].TriggerKey = trigger.Key;
quartzCache[jobName].Logs.Add(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 调度任务已经启动。");
}
jobDetail.JobDataMap.Add("dataMap", dataMap);
jobDetail.JobDataMap.Add("action", action);
jobDetail.JobDataMap.Add("jobName", jobName);
jobDetail.JobDataMap.Add("quartzCache", quartzCache);
sched.ScheduleJob(jobDetail, new Quartz.Collection.HashSet<ITrigger> { trigger }, true);
sched.Start();
return key;
}
}
public class QuartzJob : IJob
{
// Methods
public void Execute(IJobExecutionContext context)
{
Dictionary<string, object> dictionary = context.JobDetail.JobDataMap["dataMap"] as Dictionary<string, object>;
string key = context.JobDetail.JobDataMap["jobName"] as string;
Dictionary<string, QuartzKey> dictionary2 = context.JobDetail.JobDataMap["quartzCache"] as Dictionary<string, QuartzKey>;
try
{
(context.JobDetail.JobDataMap["action"] as Action<Dictionary<string, object>>)(dictionary);
if (dictionary2.ContainsKey(key))
{
dictionary2[key].Logs.Add(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 任务执行成功。");
}
}
catch (Exception exception)
{
if (dictionary2.ContainsKey(key))
{
dictionary2[key].Logs.Add(exception.Message);
}
}
}
}
public class QuartzKey
{
// Methods
public QuartzKey()
{
this.Logs = new List<string>();
}

// Properties
public JobKey JobKey { get; set; }

public List<string> Logs { get; set; }

public TriggerKey TriggerKey { get; set; }
}
}

原文地址:https://www.cnblogs.com/Andy-Blog/p/10114942.html

时间: 2024-10-12 15:15:40

Quartz定时任务帮助类的相关文章

Spring quartz定时任务service注入问题

今天想单元测试一下spring中的quartz定时任务,一顿折腾,到最后总是发现job类里注入的service为null.一开始还以为spring的配置问题,各种找原因,最后还是确定是没有注入. 就去网上搜搜吧.也找出来一些眉目.简单的理解这个原因是job是在quartz中实例化出来的,不受spring的管理.所以就导致注入不进去了.参考这个文章 http://www.tuicool.com/articles/Qjyamu 找着试试的态度,就按照文章里说的.new一个类 public class

Quartz.NET管理类

最近做项目设计到Quartz.NET,写了一个Quartz.NET管理类,在此记录下. 1 public class QuartzManager<T> where T : class,IJob 2 { 3 #region 变量 4 private static ISchedulerFactory schedulerFactory = new StdSchedulerFactory(); //scheduler工厂 5 private static String JOB_GROUP_NAME =

Spring Quartz定时任务不准时执行

1. 前言 也是前段时间工作上遇到过这样的问题:quartz定时任务没有在预期的时间执行.后来研究了下quartz的机制,查明了原因,这里做个记录和分享. 2. 原因解释 先看一下spring quartz的大致机制或者说原理.quartz任务由一个主线程和线程池中的多个具体的工作线程构成. 主线程是QuartzSchedulerThread, 主要负责获取具体的定时任务和该任务执行的时间(比如可以通过cron expression 得到时间),并分发任务给线程池. 具体的任务由线程池中的工作线

Quartz定时任务

Quartz是纯Java开发的工作任务调度框架,可以与各种Java框架配合使用,也可以独立运行.一般在项目中实现定时任务. 根据官方的描述Quartz可以支持,一个.多个乃至万个定时任务,个人不太敢这么尝试,如果那么多定时任务的话,性能实在怕拖累了.不过也可以看出Quartz对自己的性能是很有自信的. 本文讲解在Spring环境下以注解的方式如何实现Quartz,用后发现这个简单的实在不像话,哪像一个拥有如此强大功能的框架的配置过程啊,简直是傻瓜型的.  在spring.xml文件中增加一行配置

对quartz定时任务的初步认识

今天就谈一谈我前两天自学的quartz定时任务吧,我对quartz定时任务的理解,就是可以设定一个时间,然后呢,在这个时间到的时候,去执行业务逻辑,这是我的简单理解,接下来看代码是如何实现的,首先有两种实现的方式,一种是通过代码实现,另一种是通过配置文件实现,我建议使用配置文件配置的方式实现定时任务,毕竟以后有什么变化,只需要改配置文件就可以了,不需要改代码,重新编译,重新部署. 先来讲一下第一种纯代码实现的定时任务. 第一步需要先下载所必须的jar包,我使用的jar包是: 第二步,写一个类实现

Quartz定时任务学习(二)web应用/Quartz定时任务学习(三)属性文件和jar

web中使用Quartz 1.首先在web.xml文件中加入 如下内容(根据自己情况设定) 在web.xml中添加QuartzInitializerServlet,Quartz为能够在web应用中使用,提供了一个QuartzInitializerServlet和一个QuartzInitializerListener,用于在加载web应用时,对quartz进行初始化. <servlet> <servlet-name> QuartzInitializer </servlet-na

Java spring quartz 定时任务

首先,需要导入quartz 的jar包 ① applicationContext.xml <!-- 轮询任务 --> <import resource="classpath:/conf/quartz/ctmanage-schedule.xml" /> ② ctmanage-schedule.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&q

Spring整合Quartz定时任务 在集群、分布式系统中的应用(Mysql数据库环境)

Spring整合Quartz定时任务 在集群.分布式系统中的应用(Mysql数据库环境) 转载:http://www.cnblogs.com/jiafuwei/p/6145280.html 单个Quartz实例能给予你很好的Job调度能力,但它不能满足典型的企业需求,如可伸缩性.高可靠性满足.假如你需要故障转移的能力并能运行日益增多的 Job,Quartz集群势必成为你应用的一部分了.使用 Quartz 的集群能力可以更好的支持你的业务需求,并且即使是其中一台机器在最糟的时间崩溃了也能确保所有的

SpringBoot整合Quartz定时任务 的简单实例 2

(1)什么是Quartz?(2)Quartz的特点:(3)Quartz专用词汇说明:(4)Quartz任务调度基本实现原理: 接下来看下具体的内容: (1)什么是Quartz? Quartz是一个完全由Java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制.Quartz允许开发人员根据时间间隔来调度作业.它实现了作业和触发器的多对多的关系,还能把多个作业与不同的触发器关联.简单地创建一个org.quarz.Job接口的Java类. (2)Quartz的特点: 作