[C#][Quartz]帮助类
- 本文来自: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]帮助类的更多相关文章
- Quartz管理类
package com.sihuatech.project.task.manager; import java.text.ParseException; import org.quartz.CronT ...
- Quartz公共类,log4net 日志分目录 ,调度任务。
版本:Quartz 2.5 ,log4net 2.0.8 QuartzHelper namespace Job.Common { public class QuartzHelper { private ...
- 定时器quartz工具类
一.gradle配置 // https://mvnrepository.com/artifact/org.quartz-scheduler/quartz compile group: 'org.qua ...
- quartz测试类
package demo.mytest; import java.text.ParseException; import org.quartz.CronTrigger;import org.quart ...
- 两种流行Spring定时器配置:Java的Timer类和OpenSymphony的Quartz
1.Java Timer定时 首先继承java.util.TimerTask类实现run方法 import java.util.TimerTask; public class EmailReportT ...
- Quartz:定时任务工具类
Quartz:定时任务工具类 Quartz工具类 Quartz工具类 import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; ...
- Spring任务调度之Quartz
一.Quartz作业类的继承方式来讲,可以分为两类: 作业类需要继承自特定的作业类基类,如Quartz中需要继承自org.springframework.scheduling.quartz.Quart ...
- quartz与spring进行集成
上一篇将了quartz框架的使用,spring同样也提供了对quartz的集成.这次就尝试一下在spring中集成quartz. 要在spring中使用job,Trigger和Scheduler,就要 ...
- Quartz 入门详解
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简单或为运行十个,百个, ...
随机推荐
- Chrome程序及数据位置变更到非系统盘
Chrome浏览器在Windows系统上安装过程,没有设置安装位置的步骤,所以默认是安装在C盘的.并且,若Chrome作为主要浏览器使用,随着时间的积累,数据文件会非常多.增加系统盘的负荷. Wind ...
- spring mvc发送请求404,不能进入处理方法,也不报错
找了很久找不到原因,那多半是字段绑定出错了.如字段不能为空的如int,double,没传给了空:字段是int的,给了double形式的值(1.0)..这些都会使spring mvc自动绑定出错,而且不 ...
- linux下寻找段错误的方法
为了能够快速找到发生段错误的地方,记录以下两种方法. objdump和backtrace的配合使用 :https://www.cnblogs.com/jiangyibo/p/9507555.html ...
- Extend a root LVM partition online
There is also a quick remedy for the emergency situation when your root partition runs out of disk s ...
- 简单webpack plugin 开发
重要是学习下怎么开发webpack plugin,同时记录下 插件模型 webpack 是一个插件,可以是javascript class ,或者具名 class 定义apply 方法 指定一个绑定到 ...
- benthos v1 的一些新功能
主要从视频文件截取,暂时github 上还没有很全的相关文档 v1目标 config lint processor error 处理 subprocess processor awk processo ...
- MySQL插入,更新,删除数据
插入 单行插入 1.insert into 表名 values(col1_value,col2_value,...); 每个列必须提供一个值,如果没有值,要提供NULL值 每个列必须与它在表中定义的次 ...
- git merge 和 git merge --no-ff
根据这张图片可以看出 git merge –no-ff 可以保存你之前的分支历史.能够更好的查看 merge历史,以及branch 状态. git merge 则不会显示 feature,只保留单条分 ...
- java-环境安装及配置
需要安装的软件有: 1.Jdk1.8 2.Tomcat8 3.Eclipse Neon 4.Mysql 5.项目导入 1.JDK安装 1.1安装JDK 1.2配置环境变量 高级系统配置: 环境变量: ...
- mysql、MS SQL关于分页的sql查询语句 limit 和row_number() OVER函数
在做项目的时候需要些分页,用的数据库是MySQL,之前看到的参考例子是用MS SQL做的,在MS SQL.Oracle里面有ROW_NUMBER() OVER函数可以在数据库里对数据进行分组.百度后的 ...