spring quartz 实现动态任务

Java Spring Quartz 实现动态定时任务指南 在分布式系统中,定时任务是常见且重要的组成部分。Java Spring Quartz 提供了一种灵活的方式来创建、管理和执行定时任务,它尤其以支持动态添加和调度任务而闻名。动态定时任务的概念是指可以在运行时创建、修改或删除定时任务,而无需重启应用程序或修改代码。在了解了Java Spring Quartz动态定时任务的基础概念之后,深入探索Quartz框架,它是构建定时任务应用的基石。 阅读详情
不介绍这两个框架了 。。。
介绍一下采用的环境
spring 4
quartz 2.2.1
首先配置applicationContext.xml

<!--验证只需要配置一个调度器>
 <bean id="scheduler" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">


接下来 贴一下代码

自定义任务类
public class ScheduleJob {
/** 任务id */
    private String jobId;
 
    /** 任务名称 */
    private String jobName;
 
    /** 任务分组 */
    private String jobGroup;
 
    /** 任务状态  1启用  2暂停  3删除*/
    private String jobStatus;
 
    /** 任务运行时间表达式 */
    private String cronExpression;
 
    /** 任务描述 */
    private String desc;

public String getJobId() {
return jobId;
}

public void setJobId(String jobId) {
this.jobId = jobId;
}

public String getJobName() {
return jobName;
}

public void setJobName(String jobName) {
this.jobName = jobName;
}

public String getJobGroup() {
return jobGroup;
}

public void setJobGroup(String jobGroup) {
this.jobGroup = jobGroup;
}

public String getJobStatus() {
return jobStatus;
}

public void setJobStatus(String jobStatus) {
this.jobStatus = jobStatus;
}

public String getCronExpression() {
return cronExpression;
}

public void setCronExpression(String cronExpression) {
this.cronExpression = cronExpression;
}

public String getDesc() {
return desc;
}

public void setDesc(String desc) {
this.desc = desc;
}
}


//接口类(dubbo RPC 服务)
public interface  ShopQuartzService {
/**
 * 开启一个任务(如果存在 更新执行计划)
 * @param timeExpression 时间表达式 参照linux 定时任务
 * @param interfacename 接口的类名称
 * @param methodname 方法的名称
 */
public  void addQuartz(final String timeExpression,final String interfacename,final String methodname)throws Exception;

/**
 * 暂停一个定时任务
 * @param interfacename
 * @param methodname
 */
public  void  pauseJob(final String interfacename,final String methodname);
/**
 * 恢复一个定时任务
 * @param interfacename
 * @param methodname
 */
public  void   resumeJob(final String interfacename,final String methodname);
/**
 * 删除一个定时任务
 * @param interfacename
 * @param methodname
 */
public  void   deleteJob(final String interfacename,final String methodname);
/**
 * 判断是否存在
 * @param interfacename
 * @param methodname
 */
public   boolean  existJob(final String interfacename,final String methodname);
/**
 * 删除一个定时任务
 * @param interfacename
 * @param methodname
 */
public  String  existJobGetstatu(final String interfacename,final String methodname);
}



//实现类
public class  ShopQuartzimpl implements ShopQuartzService{
private static final Log log = LogFactory.getLog( ShopQuartzimpl.class );  
//所有任务的的状态类
static ClassPathXmlApplicationContext context=null;
static Scheduler scheduler=null;
//初始化容器
static{
context= new ClassPathXmlApplicationContext( new String[] { "META-INF/spring/applicationContextqa.xml" });
context.start();
scheduler=(Scheduler) context.getBean("schedulerFactoryBean");
}
public static void init(String  CronExpression,String jobname){
ScheduleJob job = new ScheduleJob();
job.setJobId(jobname);
job.setJobName(jobname);
job.setJobGroup(StaticUtil.jobprefix);
job.setJobStatus("1");
job.setCronExpression(CronExpression);
job.setDesc("shop定时任务");
try {
addJob(job);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
 * 添加任务
 * @param scheduleJob
 */
public static void addJob(ScheduleJob scheduleJob)throws Exception {
StaticUtil.jobMap.put(scheduleJob.getJobGroup() + "-" + scheduleJob.getJobName(), scheduleJob);
}
/**
 * 
 * @param timeExpression 时间表达式 参照linux 定时任务
 * @param interfacename 接口的类名称
 * @param methodname 方法的名称
 */
public  void addQuartz (final String timeExpression,final String interfacename,final String methodname)throws Exception{
String  jobname=interfacename+"-"+methodname;
init(timeExpression,jobname);
if(StaticUtil.jobMap.size()>0){
ScheduleJob job=StaticUtil.jobMap.get("shop-"+interfacename+"-"+methodname);
 
TriggerKey triggerKey = TriggerKey.triggerKey(job.getJobName(), job.getJobGroup());
 
//获取trigger,即在spring配置文件中定义的 bean id="myTrigger"
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
System.err.println(triggerKey);
 
//不存在,创建一个
if (null == trigger) {
Object object =  context.getBean(interfacename);
MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
             jobDetail.setTargetObject(object);
             jobDetail.setTargetMethod(methodname);
             jobDetail.setName(jobname);
             jobDetail.setConcurrent(false);
             jobDetail.setGroup(StaticUtil.jobprefix);
             jobDetail.afterPropertiesSet();
             
//表达式调度构建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression());
 
//按新的cronExpression表达式构建一个新的trigger
trigger = TriggerBuilder.newTrigger().withIdentity(job.getJobName(), job.getJobGroup()).withSchedule(scheduleBuilder).build();
scheduler.scheduleJob(jobDetail.getObject(),trigger);
updateQuartzState(interfacename, methodname, "1");
} else {
// Trigger已存在,那么更新相应的定时设置
//表达式调度构建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression());
 
//按新的cronExpression表达式重新构建trigger
trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
//按新的trigger重新设置job执行
scheduler.rescheduleJob(triggerKey, trigger);
}
}
} 


/**
 * 暂停一个定时任务
 * @param interfacename
 * @param methodname
 */
@Override
public void pauseJob(final String interfacename,final String methodname) {
JobKey jobKey=getJobKey(interfacename, methodname);
if(null!=jobKey&&!jobKey.equals("")){
try {
scheduler.pauseJob(jobKey);
updateQuartzState(interfacename, methodname, "2");
} catch (SchedulerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

/**
 * 恢复一个定时任务
 * @param interfacename
 * @param methodname
 */
@Override
public void resumeJob(final String interfacename,final String methodname) {
JobKey jobKey=getJobKey(interfacename, methodname);
if(null!=jobKey&&!jobKey.equals("")){
try {
scheduler.resumeJob(jobKey);
updateQuartzState(interfacename, methodname, "1");
} catch (SchedulerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

/**
 * 删除一个定时任务
 * @param interfacename
 * @param methodname
 */
@Override
public void deleteJob(final String interfacename,final String methodname) {
JobKey jobKey=getJobKey(interfacename, methodname);
if(null!=jobKey&&!jobKey.equals("")){
try {
scheduler.deleteJob(jobKey);
updateQuartzState(interfacename, methodname, "3");
} catch (SchedulerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
 * 判断是否存 查询的定时任务
 */
@Override
public boolean existJob(String interfacename, String methodname) {
// TODO Auto-generated method stub
 boolean exit=false;
 //用户提供jkey
 String jkey=StaticUtil.jobprefix+"-"+interfacename+"-"+methodname;
 
 //判断任务是否注册过
 if(null!=StaticUtil.jobMap&&StaticUtil.jobMap.size()>0){
 exit= StaticUtil.jobMap.containsKey(jkey);
   }
return exit;
}
/**
 * 查询是否存在 存在返回状态
 */
@Override
public String existJobGetstatu(String interfacename, String methodname) {
// TODO Auto-generated method stub
 String jobstate="";
 //用户提供jkey
 String jkey=StaticUtil.jobprefix+"-"+interfacename+"-"+methodname;
 
 //判断任务是否注册过
 if(null!=StaticUtil.jobMap&&StaticUtil.jobMap.size()>0){
 if(StaticUtil.jobMap.containsKey(jkey)){
 
 jobstate=StaticUtil.jobMap.get(jkey).getJobStatus();
 
 };
   }
return jobstate;
}
/**
 * 获取作业jobkey
 * @param interfacename
 * @param methodname
 * @return
 */
public  static JobKey  getJobKey(String interfacename,String methodname){
 JobKey jobKey=null;
 //用户提供jkey
 String jkey=StaticUtil.jobprefix+"-"+interfacename+"-"+methodname;
 
 //获取jobKey
 if(null!=StaticUtil.jobMap&&StaticUtil.jobMap.size()>0){
  jobKey= JobKey.jobKey(StaticUtil.jobMap.get(jkey).getJobName(),StaticUtil.jobMap.get(jkey).getJobGroup());
   }
return jobKey;
}

/**
 * 获取作业jobkey
 * @param interfacename
 * @param methodname
 * @return
 */
public  static void  updateQuartzState(String interfacename,String methodname,String state){
//用户提供jkey
 String jkey=StaticUtil.jobprefix+"-"+interfacename+"-"+methodname;
 
if(null!=StaticUtil.jobMap&&StaticUtil.jobMap.size()>0){
if(null!=StaticUtil.jobMap.get(jkey)){
StaticUtil.jobMap.get(jkey).setJobStatus(state);
}
}
}

@Autowired
public static void main(String[] args) throws Exception {
new ShopQuartzimpl().addQuartz("0/5 * * * * ?", "MyTask", "performActionA");
new ShopQuartzimpl().addQuartz("0/1 * * * * ?", "MyTask", "performActionA");
}
}



//公共资源类
public class StaticUtil {
 //所有任务的集合类
 static Map<String, ScheduleJob> jobMap = new HashMap<String, ScheduleJob>();
 //工作组前缀
 static final String jobprefix="xxxx";

}
01 AUTOSAR CP标准文档阅读指南 阅读详情

相关推荐

[Ethernet in CANoe]4--CANoe工程中SOME/IP报文的详细介绍(二)

介绍了SOME/IP报文的SD报文(ServiceDiscovery),本片文章开始继续介绍SOME/IP报文。

汽车ECU自动化测试 1115

spring+quartz,动态注册job

Spring+Quartz的整合有很多例子,此处不提整合; 若配置固定的job,常常使用MethodInvokingJobDetailFactoryBean,也不错, 可问题的根源在于 这个类没实现 Serializable接口, 导致了将job信息存入数据库中时,它不工作了, 这是诱因之一. 以下是文章的主要内容. 前提及目标 1.job信息存入数据库 2.可给项目添加

MONKEYK 6601

三维模型转变为点云模型的好工具——CloudCompare使用小记

普通三维模型能够直观地展示物体的三维全貌,但是在一些场合需要将三维模型变为相应的点云模型进行展示,而使用激光雷达等传感器采集到的点云信息往往只能反应模型表面的情况,或是使用PCL库中的可执行文件进行转换,这两种操作较为麻烦。笔者最近就遇到了这样一个情况,找到了一个名叫CloudCompare(CC)的软件,能够支持将多种文件格式的三维模型转变为点云模型。以下将本人在使用过程中所使用到的一些操作简记下来供朋友们和将来的自己参考。 一、下载 CloudCompare是一款免费软件,其可以在CloudComp

hdlwyt的博客 2万+

quartz实现动态定时任务

我们在开发中经常需要定时任务,比如定期去更新一些信息到文档中整理,删除等,那么我们就需要部署一个quartz的增删改查,实现对任务,以及信息的操作。实现持续一个月,每天0点打印信息如下。接下来我会讲解各种对象的作用。

大白猫的博客 1935

机器学习模型——非线性回归

升维是一种常用的处理非线性问题的方法,它通过将原始数据从低维空间映射到高维空间来增强模型的表达能力。我们可以看出,二维数据用一维直线很难去很好的拟合。升维里的degree设置的不易过大,否则容易造成维度灾难。升维后,拟合的线与原数据比较符合。将非线性问题转换为线性问题。

qq_60688380的博客 1422

LDPC码译码原理——概率公式推导

怎么说呢,一直以来都想写一下博客。近半年多来我一直在学习LDPC码译码上的东西,主要是在FPGA实现上的,所以这次想写一些关于这方面的内容,包括译码的原理、仿真以及实现。(当然是基于准循环LDPC码上实现的)不过呢,我写这个的初衷是为了让初学者理解入门用的,而不是在大牛面前班门弄斧,有错误之处欢迎大家批评指正。不知道会不会有人一开始像我一样,为了学好LDPC码,先去好好了解其它的诸如RS码或者是卷...

stand_by_me123的博客 2万+

分布式环境下Quartz集群配置(附真实生产案例)

解决分布式定时任务难题,本文详解Java定时任务Quartz集群配置方法,涵盖ZooKeeper协调、数据库锁机制与高可用部署方案,适用于电商、金融等场景,保障任务精准执行不重复,值得收藏。

SimSolve的博客 745

高光谱知识(1)-高光谱成像技术的理解

系列文章目录 高光谱技术可以获得待观测目标或场景的连续单色光谱图像,并通过空间维(x, y)数据和光谱维(λ)数据共同组成三维观测数据立方体,从而为研究人员提供探测目标或场景中的每一个点的空间和光谱特征细节。这种兼具相机的高分辨成像能力和光谱仪的高光谱分辨能力使得高光谱被广泛应用于测绘遥感、目标识别、环境监测与评估、临床影像诊断、过程监控等任务中,并在地理、空间、海洋、气候、大气、农业、植被、生态、医药、安防、制造与色度等多个领域中发挥巨大作用。 文章目录系列文章目录前言一、按获取数据的过程划分二、按照光

Echo_Code的博客 1万+

基于quartz的动态任务

quartz是一个提供定时任务的框架。任务可以直接配置在配置文件之中或者数据库里,这种无法修改的任务可以叫做静态任务,而这次写的是怎么创建动态任务,可以在项目运行中对定时任务进行创建、修改、删除等操作。 我这里是基于spring框架搭建的quartz系统。spring配置文件中配置了SchedulerFactoryBean工厂类,用于生成Scheduler对象。<bean id="schedule

shjhhc的博客 908

UG\NX二次开发 获取三平面交点

//如果返回值不为0 则此三个面没交点 int three_faces_point(tag_t tagFace1, tag_t tagFace2, tag_t tagFace3, double *dou_x, double *dou_y, double *dou_z)

王牌飞行员_里海的博客 675

python实现DoIP基本通信(收发报文)

python实现DoIP基本通信(收发报文)

天赐好车的博客 898

springboot quartz 动态配置_springboot集成quartz实现动态任务调度

quartz是一个开源的作业调度框架,本文就是介绍下springboot框架下继承quartz的一些使用示例首先我们需要添加quartz的spring-boot-starter-quartz依赖org.springframework.bootspring-boot-starter-quartz我们需要做一些配置。quartz提供了基于内存(MEMORY)和基于jdbc的两种任务存储方式。具体的配置...

weixin_39517868的博客 260

Ubuntu-22.04安装VMware虚拟机并安装Windows10

最近在研究虚拟机,主要集中在KVM、Virtualbox和VMware这三种虚拟机上。前面我已经研究了前两种虚拟机的安装和使用方式,这篇文章介绍3兄弟中最后一个虚拟机安装和使用方式。Virtualbox虚拟机安装和使用KVM虚拟机安装和使用相比于前两种,VMware的安装方式最麻烦,但是综合体验下来我感觉流畅度最好。如果你确实有在Linux上使用VMware虚拟机的需求,那不妨跟着我看下去吧。1、gcc版本和内核版本一定要匹配上,否则会出各种错误。

jiexijihe945的博客 4118

quartz spring 实现动态定时任务

源码:http://chuhanzhi.com/?p=45 点击最下方链接即可下载   在实际项目应用中经常会用到定时任务,可以通过quartz和spring的简单配置即可完成,但如果要改变任务的执行时间、频率,废弃任务等就需要改变配置甚至代码需要重启服务器,这里介绍一下如何通过quartz与spring的组合实现动态的改变定时任务的状态的一个实现。 参考文章:http://www.me...

HelloWorld 1200

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Spring+Quartz 实现任务动态管理监控

Spring+Quartz实现任务动态管理监控 环境:Quartz2.2.3+Spring4.0 配置文件很简单,只需要一个配置就可以了,注入一个FactoryBean. &lt;!-- 任务工厂,注入需注入scheduler --&gt; &lt;bean id="schedulerFactoryBean"class="org.springf...

听半的曲的博客 7249

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java 动态任务_Spring MVC Quartz 动态任务实现方式

1.项目结构这篇文章是对上篇文章《Spring Boot Quartz 动态任务实现方式》的稍作变动, 但最终实现效果是一致的。持久层变动:Spring Boot使用spring data jpa, Spring MVC 使用 Mybatis2.Mavenxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation=...

weixin_42519565的博客 335

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Spring+Quartz实现动态添加定时任务

【1】.配置定时器                   doAutoJob                        0 0 0 * * ?      //如果全部定时任务都要动态生成,可以只配置这一个即可                      【2】.定时器工具类 /**  *  *  * Description: 计时器工

蓝 1万+

spring quartz动态实现对任务的增删改查

        最近在做项目的时候用到了定时任务,而且用到的地方比较多,如果用配置文件配置的话,感觉不太方便,调整任务的执行方式也十分麻烦,因此,我采用了动态添加的方式,将定时任务保存在数据库中,这样既可以方便定时任务的添加,有能够随时改变、关闭定时任务。      定时任务的主要实现逻辑是在初始化完spring之后初始化定时任务,添加、修改定时任务时,调用相应的方法去修改定时任务不多说,直接上核...

csdn_sunlighting的博客 1533

Spring quartz定时器动态多任务实现

<br />  项目中经常会碰到需要定时执行的任务,并且需要执行什么任务,以及任务执行的时间都由用户自定义的需求。quartz是比较常用的定时器工具,并且在spring框架中也已经做了很好的集成,所以在以spring+hibernate+struts的主流架构中,我们可以采用quartz来做定时器任务的解决方案,下面,我们来看下如何在项目中使用quartz来做动态多任务定时器功能。<br />      1.简单单任务定时器的spring配置<br />view plaincopy to clipboard

争做优秀java技术博客! 1万+

java spring 定时任务_详解Spring整合Quartz实现动态定时任务

本篇文章主要介绍了详解Spring整合Quartz实现动态定时任务,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。最近项目中需要用到定时任务的功能,虽然spring 也自带了一个轻量级的定时任务实现,但感觉不够灵活,功能也不够强大。在考虑之后,决定整合更为专业的Quartz来实现定时任务功能。普通定时任务首先,当然是添加依赖的jar文件,我的项目是maven管理的,以下的我项目的依赖:org....

weixin_42514005的博客 709

Quartz动态改变Cron表达式,来实现动态执行Spring定时任务

Quartz定时器非常强大,但是有时候我们想要不重就能动态的改变Cron表达式的值。 这样我们可以在配置文件中(当然数据库也可以)配置一个表达式的值。 每次想改变表达式的值的时候手动修改配置文件中的表达式,实现动态表达式。

jianging2009的博客 9138

Spring 整合 Quartz 实现动态定时任务(附demo)

最近项目中需要用到定时任务的功能,虽然Spring 也自带了一个轻量级的定时任务实现,但感觉不够灵活,功能也不够强大。在考虑之后,决定整合更为专业的Quartz来实现定时任务功能。普通定时任务首先,当然是添加依赖的jar文件,我的项目是maven管理的,以下的我项目的依赖:<dependencies> <dependency> <groupId>org.springframe

糖糖糖糖糖先森 6万+

Quartz任务调度[Spring+Quartz结合]_实现任务的动态添加、修改和删除

Git地址:https://git.oschina.net/Bla/Quartz.git 项目框架图 下面开始贴代码了,不过先贴数据库^^ -- Create table Oracle数据库 create table QUARTZ_SCHEDULEJOB...

chidewang0569的博客 441

Python并发编程实战:多线程、多进程与异步IO核心指南

并发编程是现代软件开发的核心概念,它通过允许多个任务同时执行来提升程序效率。其原理基于操作系统提供的进程、线程等抽象,以及协程等用户态轻量级并发模型。在Python中,这一技术价值尤为突出,能有效解决I/O密集型任务的阻塞问题,并利用多核CPU处理计算密集型任务。无论是构建高并发的Web服务、开发高效的数据爬虫,还是优化AI推理流水线,掌握并发技术都是提升应用性能的关键。本文聚焦于Python的并发模型与同步原语,通过大量实战代码,系统讲解多线程、多进程及asyncio的应用场景与最佳实践,帮助你设计出稳定

weixin_34095889的博客 416

Spring Boot中使用Quartz实现动态定时任务

在企业级应用开发中,定时任务是一个常见的需求场景。Quartz作为Java领域最著名的开源任务调度框架,提供了强大而灵活的任务调度能力。本文将结合实际项目经验,介绍如何在Spring Boot项目中整合Quartz实现动态定时任务的管理。Quartz是一个功能丰富的开源作业调度库,可以集成到几乎任何Java应用程序中。Scheduler:调度器,负责管理所有任务Job:任务接口,定义需要执行的工作JobDetail:任务详情,包含任务的描述和属性Trigger:触发器,定义任务执行的时间规则。

stjiayc的博客 403

java定时器quartz实例_Spring+Quartz实现动态添加定时任务

一、准备工作1.java环境搭建,具体参考包中的webapp/resources/doc/平台开发环境安装Guide_V1.0.docx文档2.使用源码中的webapp/resources/doc/init.sql初始化表结构及数据t_timetask 任务表t_timetask_log 任务运行日志3.数据库连接配置在cloud_parent中的pom.xml中,数据库名称ffxl_cloud,...

weixin_32019219的博客 1194
上一篇: 删除kafka 的topic
下一篇: tomcat 管理工具 lambdaprobe
rtnull
博客等级 码龄16年 5粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值