本文来自:http://www.cnblogs.com/pengze0902/p/6128558.html
/// <summary>
/// 任务处理帮助类
/// </summary>
public class QuartzHelper
{
public QuartzHelper() { } public QuartzHelper(string quartzServer, string quartzPort)
{
Server = quartzServer;
Port = quartzPort;
} /// <summary>
/// 锁对象
/// </summary>
private static readonly object Obj = new object(); /// <summary>
/// 方案
/// </summary>
private const string Scheme = "tcp"; /// <summary>
/// 服务器的地址
/// </summary>
public static string Server { get; set; } /// <summary>
/// 服务器的端口
/// </summary>
public static string Port { get; set; } /// <summary>
/// 缓存任务所在程序集信息
/// </summary>
private static readonly Dictionary<string, Assembly> AssemblyDict = new Dictionary<string, Assembly>(); /// <summary>
/// 程序调度
/// </summary>
private static IScheduler _scheduler; /// <summary>
/// 初始化任务调度对象
/// </summary>
public static void InitScheduler()
{
try
{
lock (Obj)
{
if (_scheduler != null) return;
//配置文件的方式,配置quartz实例
ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
_scheduler = schedulerFactory.GetScheduler();
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
} /// <summary>
/// 启用任务调度
/// 启动调度时会把任务表中状态为“执行中”的任务加入到任务调度队列中
/// </summary>
public static void StartScheduler()
{
try
{
if (_scheduler.IsStarted) return;
//添加全局监听
_scheduler.ListenerManager.AddTriggerListener(new CustomTriggerListener(), GroupMatcher<TriggerKey>.AnyGroup());
_scheduler.Start(); //获取所有执行中的任务
List<TaskModel> listTask = TaskHelper.GetAllTaskList().ToList(); if (listTask.Count > )
{
foreach (TaskModel taskUtil in listTask)
{
try
{
ScheduleJob(taskUtil);
}
catch (Exception e)
{
throw new Exception(taskUtil.TaskName,e);
}
}
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
} /// <summary>
/// 启用任务
/// <param name="task">任务信息</param>
/// <param name="isDeleteOldTask">是否删除原有任务</param>
/// <returns>返回任务trigger</returns>
/// </summary>
public static void ScheduleJob(TaskModel task, bool isDeleteOldTask = false)
{
if (isDeleteOldTask)
{
//先删除现有已存在任务
DeleteJob(task.TaskID.ToString());
}
//验证是否正确的Cron表达式
if (ValidExpression(task.CronExpressionString))
{
IJobDetail job = new JobDetailImpl(task.TaskID.ToString(), GetClassInfo(task.AssemblyName, task.ClassName));
//添加任务执行参数
job.JobDataMap.Add("TaskParam", task.TaskParam); CronTriggerImpl trigger = new CronTriggerImpl
{
CronExpressionString = task.CronExpressionString,
Name = task.TaskID.ToString(),
Description = task.TaskName
};
_scheduler.ScheduleJob(job, trigger);
if (task.Status == TaskStatus.STOP)
{
JobKey jk = new JobKey(task.TaskID.ToString());
_scheduler.PauseJob(jk);
}
else
{
List<DateTime> list = GetNextFireTime(task.CronExpressionString, );
foreach (var time in list)
{
LogHelper.WriteLog(time.ToString(CultureInfo.InvariantCulture));
}
}
}
else
{
throw new Exception(task.CronExpressionString + "不是正确的Cron表达式,无法启动该任务!");
}
} /// <summary>
/// 初始化 远程Quartz服务器中的,各个Scheduler实例。
/// 提供给远程管理端的后台,用户获取Scheduler实例的信息。
/// </summary>
public static void InitRemoteScheduler()
{
try
{
NameValueCollection properties = new NameValueCollection
{
["quartz.scheduler.instanceName"] = "ExampleQuartzScheduler",
["quartz.scheduler.proxy"] = "true",
["quartz.scheduler.proxy.address"] =string.Format("{0}://{1}:{2}/QuartzScheduler", Scheme, Server, Port)
}; ISchedulerFactory sf = new StdSchedulerFactory(properties); _scheduler = sf.GetScheduler();
}
catch (Exception ex)
{
throw new Exception(ex.StackTrace);
}
} /// <summary>
/// 删除现有任务
/// </summary>
/// <param name="jobKey"></param>
public static void DeleteJob(string jobKey)
{
try
{
JobKey jk = new JobKey(jobKey);
if (_scheduler.CheckExists(jk))
{
//任务已经存在则删除
_scheduler.DeleteJob(jk); }
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
} /// <summary>
/// 暂停任务
/// </summary>
/// <param name="jobKey"></param>
public static void PauseJob(string jobKey)
{
try
{
JobKey jk = new JobKey(jobKey);
if (_scheduler.CheckExists(jk))
{
//任务已经存在则暂停任务
_scheduler.PauseJob(jk);
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
} /// <summary>
/// 恢复运行暂停的任务
/// </summary>
/// <param name="jobKey">任务key</param>
public static void ResumeJob(string jobKey)
{
try
{
JobKey jk = new JobKey(jobKey);
if (_scheduler.CheckExists(jk))
{
//任务已经存在则暂停任务
_scheduler.ResumeJob(jk);
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
} /// <summary>
/// 获取类的属性、方法
/// </summary>
/// <param name="assemblyName">程序集</param>
/// <param name="className">类名</param>
private static Type GetClassInfo(string assemblyName, string className)
{
try
{
assemblyName = FileHelper.GetAbsolutePath(assemblyName + ".dll");
Assembly assembly = null;
if (!AssemblyDict.TryGetValue(assemblyName, out assembly))
{
assembly = Assembly.LoadFrom(assemblyName);
AssemblyDict[assemblyName] = assembly;
}
Type type = assembly.GetType(className, true, true);
return type;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
} /// <summary>
/// 停止任务调度
/// </summary>
public static void StopSchedule()
{
try
{
//判断调度是否已经关闭
if (!_scheduler.IsShutdown)
{
//等待任务运行完成
_scheduler.Shutdown(true);
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
} /// <summary>
/// 校验字符串是否为正确的Cron表达式
/// </summary>
/// <param name="cronExpression">带校验表达式</param>
/// <returns></returns>
public static bool ValidExpression(string cronExpression)
{
return CronExpression.IsValidExpression(cronExpression);
} /// <summary>
/// 获取任务在未来周期内哪些时间会运行
/// </summary>
/// <param name="CronExpressionString">Cron表达式</param>
/// <param name="numTimes">运行次数</param>
/// <returns>运行时间段</returns>
public static List<DateTime> GetNextFireTime(string CronExpressionString, int numTimes)
{
if (numTimes < )
{
throw new Exception("参数numTimes值大于等于0");
}
//时间表达式
ITrigger trigger = TriggerBuilder.Create().WithCronSchedule(CronExpressionString).Build();
IList<DateTimeOffset> dates = TriggerUtils.ComputeFireTimes(trigger as IOperableTrigger, null, numTimes);
List<DateTime> list = new List<DateTime>();
foreach (DateTimeOffset dtf in dates)
{
list.Add(TimeZoneInfo.ConvertTimeFromUtc(dtf.DateTime, TimeZoneInfo.Local));
}
return list;
} public static object CurrentTaskList()
{
throw new NotImplementedException();
} /// <summary>
/// 获取当前执行的Task 对象
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public static TaskModel GetTaskDetail(IJobExecutionContext context)
{
TaskModel task = new TaskModel(); if (context != null)
{ task.TaskID = Guid.Parse(context.Trigger.Key.Name);
task.TaskName = context.Trigger.Description;
task.RecentRunTime = DateTime.Now;
task.TaskParam = context.JobDetail.JobDataMap.Get("TaskParam") != null ? context.JobDetail.JobDataMap.Get("TaskParam").ToString() : "";
}
return task;
}
}

[C#][Quartz]帮助类的更多相关文章

  1. Quartz管理类

    package com.sihuatech.project.task.manager; import java.text.ParseException; import org.quartz.CronT ...

  2. Quartz公共类,log4net 日志分目录 ,调度任务。

    版本:Quartz 2.5 ,log4net 2.0.8 QuartzHelper namespace Job.Common { public class QuartzHelper { private ...

  3. 定时器quartz工具类

    一.gradle配置 // https://mvnrepository.com/artifact/org.quartz-scheduler/quartz compile group: 'org.qua ...

  4. quartz测试类

    package demo.mytest; import java.text.ParseException; import org.quartz.CronTrigger;import org.quart ...

  5. 两种流行Spring定时器配置:Java的Timer类和OpenSymphony的Quartz

    1.Java Timer定时 首先继承java.util.TimerTask类实现run方法 import java.util.TimerTask; public class EmailReportT ...

  6. Quartz:定时任务工具类

    Quartz:定时任务工具类 Quartz工具类 Quartz工具类 import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; ...

  7. Spring任务调度之Quartz

    一.Quartz作业类的继承方式来讲,可以分为两类: 作业类需要继承自特定的作业类基类,如Quartz中需要继承自org.springframework.scheduling.quartz.Quart ...

  8. quartz与spring进行集成

    上一篇将了quartz框架的使用,spring同样也提供了对quartz的集成.这次就尝试一下在spring中集成quartz. 要在spring中使用job,Trigger和Scheduler,就要 ...

  9. Quartz 入门详解

    Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简单或为运行十个,百个, ...

随机推荐

  1. 小米4c刷LineageOS

    注意,本文仅限于小米4c,其他手机仅可参考步骤.如下rom,su,gapps包的下载都是小米4c的,深刷miflash也仅适用于小米手机.准备工作:请自行备份好手机内的个人资料. 电脑环境,usb驱动 ...

  2. [动态差分+二维前缀和][小a的轰炸游戏]

    链接:https://ac.nowcoder.com/acm/contest/317/E来源:牛客网 题目描述 小a正在玩一款即时战略游戏,现在他要用航空母舰对敌方阵地进行轰炸 地方阵地可以看做是n× ...

  3. HashMap的四种遍历方法,及效率比较(简单明了)

    https://yq.aliyun.com/ziliao/210955 public static void main(String[] args) { HashMap<Integer, Str ...

  4. 直面Java 第002期

    . Java和C++同为面向对象语言,Java和C++主要区别有哪些?双方个有哪些优缺点? 解: C++ 被设计成主要用在系统性应用程序设计上的语言,对C语言进行了扩展.对于C语言这个为运行效率设计的 ...

  5. 【HAOI2008】圆上的整点

    数学题 原题:平面上有一个圆, 圆心坐标为(0,0),半径为n. 问圆周上有多少个整点. 整点的定义即x,y坐标均为整数的点. 这根本就是一道数学题,注意是数学题,不是数论,数学! 纯粹就看魔性变公式 ...

  6. day 60 Bootstrip学习

    图标地址 http://fontawesome.io/icons/ 图标用法地址 http://fontawesome.io/examples/ 实现代码 <!DOCTYPE html> ...

  7. day43 数据库学习egon的博客 索引

    一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句 ...

  8. 使用k8s && minio 进行 postgres 数据库自动备份

      通过k8s 的定时任务job,我们可以方便的进行定时任务应用的开发,通过minio s3 兼容的cloud native 存储 我们可以方便的通过http 请求进行数据文件的备份,以下简单演示下如 ...

  9. buckaroo 去中心化的c++包管理工具

    buckaroo 是一款去中心化的c++ 包管理工具,使用上,类似yarn(nodejs),cargo (rust) ,使用buckaroo 我们可以很容易集成一个大规模的项目 支持以下特性 直接从G ...

  10. Linux期末复习题

    版权声明: https://blog.csdn.net/u014483914/article/details/36622451 1.More和less命令的差别         More命令通经常使用 ...