前言:

最近做一个项目,需要用到定时任务,第一就想到了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 实现同一辅助类 重复开启多任务的更多相关文章

  1. php重复开启session

    虽然不知道 自己怎么就在一个后台系统页面中重复开启了session, 但是为了避免重复开始session的问题,可以使用: if (!session_id()) session_start(); 以上 ...

  2. Spring的quartz定时器同一时刻重复执行二次的问题解决

    最近用Spring的quartz定时器的时候,发现到时间后,任务总是重复执行两次,在tomcat或jboss下都如此. 打印出他们的hashcode,发现是不一样的,也就是说,在web容器启动的时候, ...

  3. 解决在JS中阻止定时器“重复”开启问题、Vue中定时器的使用

    1.问题描述 在一些需求开发中.需要设定软件提供服务的时间段(营业时间).这时可以选择定时器来实现.可以选择让定时器每隔一段时间检测当前时间是否在服务时间.到达服务时间.进入服务状态.未到服务时间.进 ...

  4. C# 防止程序多开(重复开启)

    Mutex(mutual exclusion,互斥)是 .Net Framework 中提供跨多个线程同步访问的一个类.它非常类似了 Monitor 类,因为他们都只有一个线程能拥有锁定.而操作系统能 ...

  5. Spring的quartz定时器重复执行二次的问题解决

    Spring的quartz定时器同一时刻重复执行二次的问题解决 最近用Spring的quartz定时器的时候,发现到时间后,任务总是重复执行两次,在tomcat或jboss下都如此. 打印出他们的ha ...

  6. 如何用C++操作无线网卡开启共享热点WiFi?

    首先需要笔记本具备AP热点功能,记得写好的程序必须用管理员身份运行. 准备工作需要先做好 //查看是否支持的承载网络 netsh wlan show drivers //设置网络模式为allow ne ...

  7. C#基于Quartz.NET实现任务调度并部署Windows服务

    一.Quartz.NET介绍 Quartz.NET是一个强大.开源.轻量的作业调度框架,是 OpenSymphony 的 Quartz API 的.NET移植,用C#改写,可用于winform和asp ...

  8. 集群式Quartz定时任务框架实践

    在日常开发汇总,经常会遇到需要定时任务的场景,简单的,可以使用Spring的定时任务调度框架,也可以使用Quartz.无论使用哪种,都需要解决一个问题,那就是集群问题.一般情况下,定时任务能且仅能运行 ...

  9. Ubuntu 18.04/18.10快速开启Google BBR的方法

    说明:Ubuntu 18.04改变挺大的,内核直接升到了正式版4.15,而BBR内核要求为4.9,也就是说满足了,所以我们不需要换内核就可以很快的开启BBR,这里简单说下方法. 提示:Ubuntu 1 ...

随机推荐

  1. 重新整理 .net core 实践篇————网关[三十六]

    前言 简单整理一下网关. 正文 在介绍网关之前,介绍一下BFF,BFF全称是Backend For Frontend,它负责认证授权,服务聚合,目标是为前端提供服务. 说的通透一点,就是有没有见过这种 ...

  2. 关于XXE漏洞

    XXE漏洞 0x01.xxe是什么 介绍 XXE 之前,我先来说一下普通的 XML 注入,这个的利用面比较狭窄,如果有的话应该也是逻辑漏洞 1.1xml定义 XML用于标记电子文件使其具有结构性的标记 ...

  3. 台达PLC开发笔记(二):台达PLC设置主机通讯参数为RTU并成功通讯

    前言   前面使用485和网口与台达成功建立通讯,但是485是使用用的ASICC模式,多数情况下是使用RTU模式提升通讯效率.   下载安装台达ISPSoft软件   官网下载地址:https://d ...

  4. Vue 动态组件和异步组件

    基础案例 动态组件切换类比"bilibili-个人中心"的横向菜单切换不同的标签页的功能. 在Vue中可以使用 component 标签,并加一个特殊的属性(attribute) ...

  5. Docker:docker搭建redis一主多从集群(配置哨兵模式)

    角色 实例IP 实例端口 宿主机IP 宿主机端口 master 172.19.0.2 6382 192.168.1.200 6382 slave01 172.19.0.3 6383 192.168.1 ...

  6. Redis:Java链接redis单节点千万级别数据 写入,读取 性能测试

    本文是对Redis 单节点,针对不同的数据类型,做插入行测试. 数据总条数为:10058624 环境说明:             Redis 未做任何优化, 单节点    (服务器上, 内存64G) ...

  7. 资源:Git快速下载路径

    Git快速下载地址: 地址:https://npm.taobao.org/mirrors/git-for-windows/

  8. IDEA部署了项目,其他页面可以正常访问,但访问tomcat的localhost:8080却出现404

    解决方案 点击Edit Configurations 点击右边的加号, 把目录放在你tomcat目录下的ROOT目录.之后就可以正常运行了

  9. C语言:输出数字各个位的数字及和

    #include <stdio.h> int main() { char sh[13][5]={"个","十","百",&quo ...

  10. MQTT 4 ——MQTT的Spring Mvc 配置接收字节流数据

    本篇记录一下MQTT整合Spring Mvc配置直接收发字节流数据 设备方是纯C开发,并且为了交互数据的安全,将传送的数据用了AES CBC进行了加密. 接下来正常方便做法应该是 将加密后的字节流转换 ...