Quartz 实现同一辅助类 重复开启多任务
前言:
最近做一个项目,需要用到定时任务,第一就想到了Quartz,然后很开心的就实现了功能,但是后来发现一个问题,如果需要开启多个定时任务,需要写多个辅助类,而辅助类里面的功能基本差不多,这是我就想
能不能用一个类开启多个定时任务,通过参数设定不同的参数,定时任务做不同的事情。说干就干。
1. 构建统一的创建Job的方法,代码如下
private static void GenerateJob<T>(string subkey, DateTimeOffset startTimeUtc, string id, string cronExpression) where T : IJob
{
Type t = typeof(T);
string name = t.Name + "-" + subkey;
IJobDetail job = JobBuilder.Create<T>()
.WithIdentity(name, "group_Job")
.StoreDurably(true)
.RequestRecovery(true)
.Build();
job.JobDataMap.Put(job.Key.Name.ToString(), id);
ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create()
.WithIdentity(name, "group_trigger")
.StartNow()
.WithCronSchedule(cronExpression, x => x.InTimeZone(TimeZoneInfo.Local))
.Build();
IJobListener jobListener = new JobTaskListener(name);
IMatcher<JobKey> matcher = KeyMatcher<JobKey>.KeyEquals(job.Key);
sched.ListenerManager.AddJobListener(jobListener, matcher);
sched.ScheduleJob(job, trigger);
}
通过不同的key构间和开启不同的Job,然后通过 job.JobDataMap.Put("id", id); 向定时任务传递参数,指定单独需要做的事情,
2.循环创建 定时任务
string ConsumerJobTime = "0/1 * * * * ?";//每秒执行一次
ISchedulerFactory sf = new StdSchedulerFactory(Config);
sched = await sf.GetScheduler(cts.Token);
DateTimeOffset startTimeUtc = DateBuilder.NextGivenSecondDate(null, 15);
JobStoreModel storeModel = new JobStoreModel();
for (int id = 0; id <= 3; id++)
{
GenerateJob<ConsumerJob>("ConsumerJob"+ id.ToString(), startTimeUtc, id.ToString(), ConsumerJobTime);
await sched.Start(cts.Token);
}
await sched.Start(cts.Token);
3.复用的辅助类,接收特定参数,执行特定任务。
public Task Execute(IJobExecutionContext context)
{
return System.Threading.Tasks.Task.Factory.StartNew(() =>
{
string id = context.JobDetail.JobDataMap.GetString("id");
Job(id);
});
}
public void Job(string id)
{
Console.WriteLine(id + ":时间" + DateTime.Now.ToString());
}
结果输出:
完美解决,不用傻兮兮的构建重复的辅助类,这就是典型的面向对象思维了。
Quartz 实现同一辅助类 重复开启多任务的更多相关文章
- php重复开启session
虽然不知道 自己怎么就在一个后台系统页面中重复开启了session, 但是为了避免重复开始session的问题,可以使用: if (!session_id()) session_start(); 以上 ...
- Spring的quartz定时器同一时刻重复执行二次的问题解决
最近用Spring的quartz定时器的时候,发现到时间后,任务总是重复执行两次,在tomcat或jboss下都如此. 打印出他们的hashcode,发现是不一样的,也就是说,在web容器启动的时候, ...
- 解决在JS中阻止定时器“重复”开启问题、Vue中定时器的使用
1.问题描述 在一些需求开发中.需要设定软件提供服务的时间段(营业时间).这时可以选择定时器来实现.可以选择让定时器每隔一段时间检测当前时间是否在服务时间.到达服务时间.进入服务状态.未到服务时间.进 ...
- C# 防止程序多开(重复开启)
Mutex(mutual exclusion,互斥)是 .Net Framework 中提供跨多个线程同步访问的一个类.它非常类似了 Monitor 类,因为他们都只有一个线程能拥有锁定.而操作系统能 ...
- Spring的quartz定时器重复执行二次的问题解决
Spring的quartz定时器同一时刻重复执行二次的问题解决 最近用Spring的quartz定时器的时候,发现到时间后,任务总是重复执行两次,在tomcat或jboss下都如此. 打印出他们的ha ...
- 如何用C++操作无线网卡开启共享热点WiFi?
首先需要笔记本具备AP热点功能,记得写好的程序必须用管理员身份运行. 准备工作需要先做好 //查看是否支持的承载网络 netsh wlan show drivers //设置网络模式为allow ne ...
- C#基于Quartz.NET实现任务调度并部署Windows服务
一.Quartz.NET介绍 Quartz.NET是一个强大.开源.轻量的作业调度框架,是 OpenSymphony 的 Quartz API 的.NET移植,用C#改写,可用于winform和asp ...
- 集群式Quartz定时任务框架实践
在日常开发汇总,经常会遇到需要定时任务的场景,简单的,可以使用Spring的定时任务调度框架,也可以使用Quartz.无论使用哪种,都需要解决一个问题,那就是集群问题.一般情况下,定时任务能且仅能运行 ...
- Ubuntu 18.04/18.10快速开启Google BBR的方法
说明:Ubuntu 18.04改变挺大的,内核直接升到了正式版4.15,而BBR内核要求为4.9,也就是说满足了,所以我们不需要换内核就可以很快的开启BBR,这里简单说下方法. 提示:Ubuntu 1 ...
随机推荐
- 2.QT浏览器控件设置“透明颜色”
使用样式表或者设置背景颜色,使用 background-color:transparent 但,使用透明的颜色是不可行的: QColor(255,0,0,0)
- 解决List遍历删除元素提示ConcurrentModificationException
JDK1.8提供新的API ===> removeIf public static void main(String[] args) { List<String> list = ...
- UI自动化学习笔记- UnitTest单元测试框架详解
一.UnitTest基本使用 1. UnitTest框架 1.1 什么是框架 说明: 框架英文单词frame 为解决一类事情的功能集合 1.2什么是UnitTest框架 概念:UnitTest是pyt ...
- SpringBoot:springboot整合eureka报错 Unable to start embedded Tomcat
报错信息: org.springframework.context.ApplicationContextException: Unable to start web server; nested ex ...
- buu yxx
一.这题是南邮的题,异性相吸改编过来的,不过那题有给提示,这题没有233 不过做法确是一样的,winhex打开 直接异或,做法是一样的,直接对应的异或就可以了 a="lovelovelove ...
- java基础---设计模式(2)
结构型模式 出处:https://blog.csdn.net/zhangerqing/article/details/8239539 一.适配器模式 适配器模式将某个类的接口转换成客户端期望的另一个接 ...
- 如何修改Windows 11 任务栏大小
1.首先Win+R输入regedit打开注册表编辑器 2.进入注册表编辑器后,在地址栏中输入: HKEY_CURRENT_USER\Software\Microsoft\ Window ...
- 阿里云PTS分享-用性能测试工具JMeter实现基于供应链业务上对于WebSocket 协议的压测
性能测试PTS(Performance Testing Service)是面向所有技术相关背景人员的云化性能测试工具,孵化自阿里内部平台.有别于传统工具的繁复,PTS以互联网化的交互,面向分布式和云化 ...
- python 列表指导式
>>> a=[page for page in range(10)]>>> print (a)[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>& ...
- springMVC-9-异常处理器和拦截器
异常解析器: 用于统一处理 servlet 中的异常; 拦截器: 用于统一处理业务中需要统一处理的页面(比如登录判断等), 可抽取出来统一处理. 我们一般需要在每个页面都通过在session中寻找有无 ...