以编码方式应用Spring-quartz调度器

Quartz 2.2.1学习笔记 (二) Jobs、JobDetail、JobDataMap Jobs与JobDetails正如第一篇文章看到的那样,实现一个Job是非常简单的,只需要完成execute()方法就行了。 那么Jobs与JobDetails有什么关系呢?简而言之,Job是对任务的一个具体实现;谁执行了这个任务呢?这就需要JobDetail来实现,所以JobDetail就是Job的一个具体实例;如9点上语文课是一个具体任务,而刘老师在9点上语文课就是这个任务的一个具体实例。 阅读详情

注意,quartz 1.x与quartz 2.x相比发生了较大变化,其中jobDetail等类与旧版本相比使用方法不一样的。

使用spring3.2、quartz 2.17

package com.ja.hch.web.sms;

import java.util.List;

import org.apache.log4j.Logger;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.config.Task;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.ja.hch.service.sms.SmsService;
import com.ja.hch.service.sms.impl.SmsServiceImpl;
import com.sun.org.apache.xalan.internal.xsltc.compiler.sym;

@DisallowConcurrentExecution
public class SmsTempletQuartzJob implements Job {
	private static final Logger LOG = Logger.getLogger(SmsTempletQuartzJob.class);
	
	@Override
	public void execute(JobExecutionContext context) throws JobExecutionException {
		try {
			System.out.println("任务运行...");
			LOG.info("短信模板发短信任务运行...");
			
			String sms = (String) context.getMergedJobDataMap().get("sms");
			List<String> sms2PhoneList = (List<String>) context.getMergedJobDataMap().get("sms2PhoneList");
			System.out.println("任务名称: [" + sms + "]\t" + sms2PhoneList);
			WebApplicationContext wac =(WebApplicationContext) context.getMergedJobDataMap().get("wac");
			// 在这里执行任务...
			SmsService service = (SmsService) wac.getBean("smsServiceImpl");
			service.getSmsContent(sms);
			service.sendSms(sms2PhoneList,sms);
			//Thread.sleep(1000 * 9000);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}


package com.ja.hch.web.sms;

import java.util.List;

import jodd.util.StringUtil;

import org.apache.log4j.Logger;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.StdSchedulerFactory;

public class SmsTempletQuartzManager {
	private static final Logger LOG = Logger.getLogger(SmsTempletQuartzManager.class);
	private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory();
	public static final String JOB_NAME = "jobName";
	public static final String JOB_GROUP_NAME = "jobGroupName";
	public static final String TRIGGER_NAME = "triggerName";
	public static final String TRIGGER_GROUP_NAME = "triggerGroupName";

	public static String createCronSchedule(String sendMethod, String sendDate) {
		String time = "";
		if (StringUtil.isBlank(sendMethod) || StringUtil.isBlank(sendDate)) {
			time = "";
		} else if ("everyday".equalsIgnoreCase(sendMethod)) {// 每天执行
			time = "0 0 " + sendDate + " ? * *" ;//每天sendDate点触发;
		}
		return time;
	}

	/**
	 * @Description: 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名
	 * 
	 * @param jobName
	 *            任务名
	 * @param cls
	 *            任务
	 * @param time
	 *            时间设置,参考quartz说明文档
	 * 
	 */
	public static void addJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName, String time, String smsContent, List<String> sms2PhoneList) {
		if(StringUtil.isBlank(time)){
			LOG.error("添加一个短信模板定时任务失败;cron表达式错误");
			return;
		}
		try {
			Scheduler sched = gSchedulerFactory.getScheduler();
			JobDetail jobDetail = JobBuilder.newJob(SmsTempletQuartzJob.class).withIdentity(jobName, jobGroupName).build();
			jobDetail.getJobDataMap().put("sms", smsContent);// 短信内容
			jobDetail.getJobDataMap().put("sms2PhoneList", sms2PhoneList);// 手机号码

			// 表达式调度构建器
			CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(time);
			// 按新的表达式构建一个新的trigger
			CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerName, triggerGroupName).withSchedule(scheduleBuilder).build();
			sched.scheduleJob(jobDetail, trigger);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * @Description: 修改一个任务的触发时间
	 * 
	 * @param triggerName
	 * @param triggerGroupName
	 * @param time
	 */
	public static void modifyJobTime(String triggerName, String triggerGroupName, String time) {
		if(StringUtil.isBlank(time)){
			LOG.error("修改一个短信模板定时任务失败;cron表达式错误");
			return;
		}
		try {
			Scheduler sched = gSchedulerFactory.getScheduler();
			TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
			CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerKey);
			if (trigger == null) {
				return;
			}
			String oldTime = trigger.getCronExpression();
			if (!oldTime.equalsIgnoreCase(time)) { // 修改时间
				// 表达式调度构建器
				CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(time);
				// 按新的cronExpression表达式重新构建trigger
				trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
				// 重启触发器
				sched.rescheduleJob(triggerKey, trigger);
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * @Description: 移除一个任务
	 * 
	 * @param jobName
	 * @param jobGroupName
	 * @param triggerName
	 * @param triggerGroupName
	 */
	public static void removeJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName) {
		try {
			Scheduler sched = gSchedulerFactory.getScheduler();
			JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
			TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
			sched.pauseTrigger(triggerKey);// 停止触发器
			sched.unscheduleJob(triggerKey);// 移除触发器
			sched.deleteJob(jobKey);// 删除任务
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * @Description:启动所有定时任务
	 */
	public static void startJobs() {
		try {
			Scheduler sched = gSchedulerFactory.getScheduler();
			if (!sched.isStarted()) {
				sched.start();
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * @Description:关闭所有定时任务
	 */
	public static void shutdownJobs() {
		try {
			Scheduler sched = gSchedulerFactory.getScheduler();
			if (!sched.isShutdown()) {
				sched.shutdown();
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
}


调用方法
String JOB_NAME = SmsTempletQuartzManager.JOB_NAME + "_" + TMP_ID;
				String JOB_GROUP_NAME = SmsTempletQuartzManager.JOB_GROUP_NAME + "_" + TMP_ID;
				String TRIGGER_NAME = SmsTempletQuartzManager.TRIGGER_NAME + "_" + TMP_ID;
				String TRIGGER_GROUP_NAME = SmsTempletQuartzManager.TRIGGER_GROUP_NAME + "_" + TMP_ID;
				SmsTempletQuartzManager.addJob(JOB_NAME, JOB_GROUP_NAME, TRIGGER_NAME, TRIGGER_GROUP_NAME, SmsTempletQuartzManager.createCronSchedule(SEND_METHOD,SEND_DATE), TMP_CONTENT, sms2PhoneList);
				SmsTempletQuartzManager.startJobs();


Springboot Quartz定时任务的动态调度使用,实战详解 前言 用到过Quartz定时任务框架的,第一眼看到Quartz就肯定会想起,调度工厂JobFactory、触发器Trigger、任务实例Job。 那么该篇,就会结合实战案例来一步一步让大家都了解,怎么玩弄这个Quartz框架,能实现 所谓的动态调度。 内容: 1.随项目启动即运行的 定时任务 2.动态触发的定时任务 ,包括: 随时创建新的定时任务; 随时执行指定的某个定时任务; 随时暂停指定的某个定时任务; 随时重启指定的某个定时任务; 随时删除指定的某个定时任务; 随时查看指定的.. 阅读详情

相关推荐

从零构建eSIM RSP服务:云原生架构与GSMA合规实践

本文详细阐述了从零开始构建一个符合GSMA SAS-SM安全标准的云原生eSIM RSP服务的完整路径。内容涵盖云原生基础设施选型、容器化部署、GSMA标准接口集成,并重点分享了通过SAS-SM安全审计的实战经验与避坑指南,为物联网及智能设备企业自建可控的远程SIM配置服务提供了系统性的解决方案。

weixin_29322553的博客 458

基于SpringBoot+Vue+Quartz构建分布式任务调度系统

在我们的日常开发中,各种大型系统的开发少不了任务调度,简单的单机任务调度已经满足不了我们的系统需求,复杂的任务会让程序猿头疼, 所以急需一套专门的任务管理系统帮助我们去管理定时任务,本课程采用时下最火的技术架构,SpringBboot2.0+Vue.js+Quartz2.2完成一个复杂任务的管理系统,通过该系统可以管理我们日常各种任务,包括单任务,复杂拓扑结构任务等等。本课程带大家实现一个任务调度系统,该系统可以直接用到生产环境,其商业价值极高。该系统是一个完整可用的系统,可以满足大部分的任务调度管理,同时有任务输出监控,开发人员可以实时查看任务执行情况,非常的强大。当然大家可以根据自己公司的情况继续扩展相关功能。学完该课程,大家可以熟练掌握、深入理解和使用SpringBoot,Quartz,Vue.js等技术。课程所用到的开发环境开发工具:IDEA、WebStorm课程包含的技术:SpringBoot2.0.2.RELEASEMaven、JPA、Quartz2.2.3多线程、队列Vue.JS、Webpack、Nodejs等企业一线架构师讲授,代码在老师的指导下企业可以复用,提供企业解决方案。  版权归作者所有,盗版将进行法律维权。 

RexUniNLU零样本通用自然语言理解:nlp_deberta_rex-uninlu_chinese-base模型实战解析

本文深入解析了RexUniNLU零样本通用自然语言理解模型(nlp_deberta_rex-uninlu_chinese-base)的实战应用。通过详细的环境配置、模型加载及实战案例,展示了该模型在零样本场景下的强大能力,如实体识别和复杂关系抽取,显著提升NLP任务效率。

weixin_29088655的博客 250

Quartz - 基础篇

Job定义:实现业务逻辑的任务接口。Job接口非常容易实现,只有一个execute方法,类似TimerTask的run方法,在里面编写业务逻辑。 Ps:group:任务所在的组。默认值:DEFAULT。 // 可以通过 jobDetail 的 getKey() 方法来获取相关信息: jobDetail.getKey().getName();//获取名称 jobDetail...

1078

基于ST32 DAC7311数模转换器驱动代码及电路设计完整版

基于ST32的DAC7311模数转换器的电路设计及驱动代码完整版

qq_39626643的博客 3718

trae CN 配置ida的mcp教程

本文介绍了在TraeCN中配置IDA Pro MCP服务的完整步骤:1)准备IDA Pro 9.0+和Python 3.11+环境;2)安装MCP服务端并配置插件;3)生成MCP配置文件;4)在TraeCN中添加HTTP类型MCP服务(默认端口13337);5)测试连接。重点说明了HTTP配置方式的操作流程,包括手动启动服务、正确填写JSON配置等关键环节。

2401_87915504的博客 1955

quartus中文乱码!

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma...

qq_45024274的博客 4023

Jetson Orin Nano - SONY imx415 camera驱动开发

基于英伟达 Jetson orin nano 平台 imx415 camera驱动开发

hinewcc的博客 3241

热部署与定时任务冲突问题解决方案

定时任务与热部署冲突彻底解决

傲宇苍穹 723

CMOS 图像传感器——Skipping 和 Binning 模式

Skipping 和 Binning 模式

沧海一升的博客 6003

习题加餐4. 冒险者工会

这个问题通过贪心算法解决,展示了贪心算法在解决一些优化问题中的强大能力。关键在于如何识别贪心选择的性质,并通过数学证明确保这种方法能够达到全局最优解。通过对问题的深入理解和逻辑推理,我们可以设计出有效的算法来解决问题,同时也需要注意代码实现中的细节,如排序和双指针的使用,以确保算法的效率和正确性。贪心算法的应用这个问题展示了贪心算法在实际问题中的应用。贪心算法通过在每一步选择当前最优的解决方案,期望最终达到全局最优解。该问题中,每次选择能力最接近但足以完成最难任务的冒险者,就是贪心选择的体现。

tang7mj的博客 1349

【quartz】从数据库中读取配置实现动态定时任务

实现方式 1、定时任务表实体 2、反射调用scheduleJob中定义的方法 3、创建正常状态下的job执行工厂 4、若一个方法一次执行不完下次轮转时则等待改方法执行完后才执行下一次操作 5、创建需要运行的定时任务类 6、SpringBean工厂工具类 7、其他用到的工具类 字符串工具类 日志工具类 数据分析常量类 接口返回参数类 其中ResultEnum类如下: 8、sql语句 注释的很

qq_37634156的博客 5005

基于 PID 算法的 STM32 步进电机高精度位置控制系统设计与实现(工业自动化应用)

硬件层面:选用 STM32F103C8T6+A4988 + 欧姆龙编码器的组合,兼顾工业可靠性与成本,接线需注意强弱电分离和信号抗干扰;软件层面:核心为位置式 PID 闭环控制,Mermaid 流程图清晰展现 “采集 - 运算 - 驱动” 的闭环逻辑,代码模块化易移植;性能层面:无负载定位误差≤±1 脉冲,带载误差≤±3 脉冲,满足工业自动化高精度位置控制需求。

weixin_42300449的博客 194

quatzy获取参数强转异常,devtools类加载机制问题

目的是实现热部署,这样在重启的时候只需要释放掉restartClassLoad加载的class文件也就是自己编写的对象。很明显这里findClass(name)先从自身加载,加载不到再通过base加载。熟悉spring的你肯定又猜到了,没错就是这个devtools依赖惹的祸。先从自身查找,没有的话再去父类查找的加载顺序破坏了双亲委派机制。jdk自带的一些class就不用重新加载了,实现了快速部署。此时默认你了解jdk的类加载机制包括双亲委派机制,猜到了吗,他们的加载器不一致。2.使用同一个类加载器加载。..

weixin_46264060的博客 354

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

quartz工作遇见问题

quartz自动调度任务遇见问题 1、使用中文时,会出现乱码问题,无法通过名称和组找到对应的任务 2、调用立即运行方法时,数据库创建tigger但是却不执行。来回倒腾确认可能是oralce数据库某个地方阻塞了任务调度。 目前通过修改org.quartz.jobStore.c...

chuanlianzhen3340的博客 424

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

quartz编码方式添加Job和Trigger

// 获取调度对象 Scheduler scheduler = (Scheduler) SpringContextUtil.getBean("scheduler"); String jobName = "testJob"; String trigName = "testTrigger"; // 添加Job JobBuilder jb =JobBuilder.newJob(TestJob...

alan3258的专栏 588

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【常见错误】Quartz常见错误

1.集群之后把其中一个Quartz服务停了,其他的也不接手工作  问题描述 集群之后,A节点执行了大多数任务,B节点大部分时间处于空闲,停掉A节点,B节点也不会接手工作。  解决方式 修改Quartz的配置,将每个节点的org.quartz.scheduler.instanceId设置为不同的值,或者都设置为AUTO。另外org.quartz.jobStore.isClustered属性必...

weixin_33725515的博客 2911

开发中常见的中文乱码原因

  在开发中,我们常常遇到中文乱码的问题,比如: &amp;浏览器中看到的 Jsp/Servlet 页面中的汉字成了 ’?’      &amp;浏览器中看到的 Servlet 页面中的汉字都成了乱码     &amp;Jsp/Servlet 页面无法显示 GBK 汉字。 &amp;Jsp/Servlet 不能接收 form 提交的汉字。 &amp;JSP/Servlet 数...

u014419512的专栏 400

基于编码配置方式整合Spring boot + Spring batch + Quartz

前面一节中已经介绍了基于xml配置方式整合Spring boot + Spring batch + Quartz ,本节介绍基于编码配置方式整合Spring boot + Spring batch + Quartz。具体spring batch和quartz的使用请看其它参考,下面进行整合。 案例:定时,在距当前5s后,每隔3s执行一次job任务,job任务是读取User.txt文件中内容,并把...

u010502101的博客 2949

Quartz入门

文章目录1、Quartz简介及应用场景pom依赖:2、Quartz简单触发器 SimpleTrigger介绍3、Quartz表达式触发器CronTirgger介绍4、Quartz中参数传递5、Spring task Vs Quartz 1、Quartz简介及应用场景 Quartz介绍 任务调度框架“Quartz”是OpenSymphony开源组织在Job scheduling领域又一个开源项目...

weixin_43977846的博客 294

springboot 整合quartz (二):jobDataMap和trigger

为什么80%的码农都做不了架构师?>>> ...

weixin_34410662的博客 495

quartz 遇到的问题

quartz 踩过的坑:1. Caused by: org.quartz.JobPersistenceException: Couldn't store job: FUNCTION ××××.EMPTY_BLOB does not exist [See nested exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorExc

公众号:AI前沿侦探 1万+

QuartzManager 定时器管理

QuartzManager 定时器管理

wyyl1的专栏 6791

任务调度框架Quartz用法指南

项目中遇到一个,需要客户自定任务启动时间 的需求。以往都是在项目中直接硬编码一些定时器,趁着这次机会将quartz的相关知识记录下来。moreQuartz是开源组织在领域又一个开源项目,完全由Java开发,可以用来执行定时任务,类似于。...

科技互联网领域深度探索者,乐于分享与写作。 919

基于RAMJobStore开发出现的几个问题

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33895604的博客 334
上一篇: 判断win系统是否UEFI模式办法
下一篇: 互联网时间同步地址
cg_program
博客等级 码龄19年 245粉丝 147原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值