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 ...
随机推荐
- Android Studio用上Visual Studio Android Emulator
背景介绍 第一次接触Android官方的AVD(Android Virtual Device)时你可能会吐槽又慢又丑,不要紧,微软作为新晋安卓阵营最佳开发商,其实也为我们准备了一个脱胎于Windows ...
- ssh-正向与反向代理
常用参数 栗子 实战 常用参数 -N 告诉SSH客户端,这个连接不需要执行任何命令.仅仅做端口转发 -C 表示压缩数据传输 -f 告诉SSH客户端在后台运行 -q Quiet mode. 安静模式,忽 ...
- CentOS-Docker安装phpMyAdmin(MySQL的web客户端)
注:phpMyAdmin是一款MySQL的web客户端,还是很直观且好用的,所以推荐给你~ 下载镜像 $ docker pull phpmyadmin/phpmyadmin 运行镜像 1.无指定固定数 ...
- PHP严格类型检查模式
前言 PHP默认情况下是弱类型校验模式,在php7下declare新增了strict_types指令,通过设置strict_types的值(1或者0),1表示严格类型校验模式,作用于函数调用和返回语句 ...
- NAT444技术简介
嘛,最近老师布置了一道题目与NAT444技术相关,遂收集一波相关资料. 首先来一波名词解释: ICP:网络内容服务商(Internet Content Provider) BRAS:宽带远程接入服务( ...
- ms17-010 永恒之蓝漏洞复现(CVE-2017-0143)
0x01 首先对目标机的开放端口进行探测,我们可以使用探测神器nmap 发现开放的445端口,然后进行下一步的ms17-010的漏洞验证 0x02 打开MSF美少妇神器,用search命令搜索ms17 ...
- vue(17)vue-route路由管理的安装与配置
介绍 Vue Router 是 Vue.js官方的路由管理器.它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌.包含的功能有: 嵌套的路由/视图表 模块化的.基于组件的路由配置 路由参 ...
- 「BZOJ 2956」模积和
「BZOJ 2956」模积和 令 \(l=\min(n,m)\).这个 \(i\neq j\) 非常不优雅,所以我们考虑分开计算,即: \[\begin{aligned} &\sum_{i=1 ...
- python04篇 文件操作(二)、集合
一.文件操作(二) 1.1 利用with来打开文件 # with open ,python 会自动关闭文件 with open('a.txt', encoding='utf-8') as f: # f ...
- mindmaster导出markdown文档
mindmaster支持多终端同步,10M免费云空间对于免费用户来说够用了,又给我的IPad增加了生产力,赞! 每次在写文章之前我都会先用mindmaster的思维导图把结构写好,然后根据结构大纲写文 ...