quartz - 有状态的Job

Quartz—有状态的job和无状态的job 如果使用了Quartz,当然在一个系统中绝不仅仅是一个job那么简单,如果同一个job同一时刻运行,可能会造成重复入库的情况。所以我们希望多线程时,能够控制同一时刻相同job只能有一个正在执行。 有时候job执行频率很小,然后在这么短的时间内该job还没结束,结果另一线程再次启用同一job下的方法,这样可能会造成重复的情况,希望在前一个此job结束后再进行下一次调用。 其实据说很简单,就是在detail的参数里加上一句话就行了,把这个job设置成有状态的job。 记得有一个问题, 阅读详情

Quartz,每次执行job,job永远是全新的对象,但是,如果job实现org.quartz.StatefulJob接口,而不是job接口.

此时JobDetail的JobDataMap将会共享一个对象。

注意:

当实现有状态接口,StatefulJob时,只有JobDetail的JobDataMap是共用的,其他的,比如,Job本身,Trigger等,仍然每次执行

的时候是全新的对象。所以,只有JobDetail的JobDataMap是共用的,其他的trigger.getJobDataMap(),context.getMergedJobDataMap(),等这些JobDataMap,任然是全新的

 

以下引用文档:

使用有状态的 Job

当你需要在两次 Job 执行间维护状态的话,Quartz 框架为此提供了 org.quartz.StatefulJob 接口。StatefulJob 接口仅仅是扩展了 Job 接口,未加入新的方法。你只需要通过使用与 Job 接口相同的 execute() 方法简单的实现 StatefulJob接口即可。假如你有已存在的 Job 类,你所有要做的只是改变 Job 的接口为 org.quartz.StatefulJob。

Job 和 StatefulJob 在框架中使用中存在两个关键差异。首先,JobDataMap 在每次执行之后重新持久化到 JobStore 中。这样就确保你对 Job 数据的改变直到下次执行仍然保持着。
 

改变有状态 Job 的 JobDataMap

你可以在有状态 Job 中简单的通过 map 的 put() 方法来修改 JobDataMap.已存在的任何数据会被新的数据覆盖掉。你也能对无状态的 Job 这么做,但是因为对于无状态 Job 来说,JobDataMap 不会持久化,所以数据不会保存下来。对于 Trigger 和 JobExecutionContext 上的 JobDataMap 的数据修改也是没能保存下来的。


另 一个无状态和有状态 Job 重大区别就是:两个或多个有状态的 JobDetail 实例不能并发执行。说的是你创建并注册了一个有状态 JobDetail 到 Scheduler 上。你还建立了两个 Trigger 来触发这个 Job:一个每五分钟触发,另一个也是每五分钏触发。假如这两个 Trigger 试图在同一时刻触发 Job,框架是不允许这种事情发生的。第二个 Trigger 一直会被阻塞直到第一个结束。

这就产生了处理 JobDataMap 存储的需求了。因为 JobDataMap 的存储是伴随着 JobDetail 的,而 JobDetail 定义了 Job 实例,所以线程安全性问题必须纳入到我们考虑的范畴。同一时刻只能由一个线程去运行并更新 JobDataMap 存储。然而,由于在第一个 Trigger 有机会更新存储之前第二个就会试图执行 Job,所以数据有可能会出错。甚至可能的话还会第二个 Trigger 先于第一个执行完成(依赖于你的 Job 所做的事情),这时就可能会出现奇怪的结果。

因为这些区别,在你使用 StatefulJob 时可要谨慎了。当你需要避免并发执行一个 Job 时,那么有状态 Job 就是你最简单的筹码了。在 J2EE 的世界里,有状态一词已经引起了一些负面影响,但对于 Quartz 却非如此。

Quartz——有状态的job和无状态的job 如果使用了Quartz,当然在一个系统中绝不仅仅是一个job那么简单,如果同一个job同一时刻运行,可能会造成重复入库的情况。所以我们希望多线程时,能够控制同一时刻相同job只能有一个正在执行。           有时候job执行频率很小,然后在这么短的时间内该job还没结束,结果另一线程再次启用同一job下的方法,这样可能会造成重复的情况,希望在前一个此job结束后再进行下一次调用。   阅读详情

相关推荐

从SAR信号到洪涝地图:基于Sentinel-1数据的水体快速提取实战

本文详细介绍了如何利用Sentinel-1 SAR数据快速提取水体信息并生成洪涝地图的实战方法。通过预处理五部曲和SDWI指数计算,结合具体案例展示了SAR技术在洪涝灾害应急监测中的高效性和准确性,为救援决策提供关键支持。

weixin_29201313的博客 464

Quartz 有状态的JobDataMap

Quartz,每次执行job,job永远是全新的对象,但是,如果job实现org.quartz.StatefulJob接口,而不是job接口. 此时JobDetail的JobDataMap将会共享一个对象。 注意: 当实现有状态接口,StatefulJob时,只有JobDetail的JobDataMap是共用的,其他的,比如,Job本身,Trigger等,仍然每次执行 的时候是全新的对象。...

weixin_30838873的博客 376

H3C-V7防火墙配置SSL VPN IP资源典型案例(华三)

H3C-V7防火墙配置SSL VPN IP资源典型案例(华三)

m0_68265458的博客 5170

Quartz中的Job和StatefulJob

在定时任务Quartz中如果要创建一个Job,可以实现Job或者StatefulJob,那Job和StatefulJob的区别是什么呢?? Job:普通的任务,或者说无状态的任务,在JobDetail执行之后,不会记录状态 StatefulJob:继承自Job,由于在定义时添加了@PersistJobDataAfterExecution注释,所以是有状态的任务,在Schedule执行完trig...

江湖一屌丝,人间一屁民! 1317

CST周期边界仿真:揭秘频率选择表面(FSS)单元设计全流程

本文详细解析了CST周期边界仿真在频率选择表面(FSS)单元设计中的应用全流程。从理论基础到工程实践,涵盖了求解器选择、几何建模、边界设置、端口优化等关键步骤,并提供了常见问题排查指南。通过CST仿真技术,工程师能够高效预测FSS的电磁特性,为实际应用提供可靠的设计依据。

weixin_30571465的博客 360

远程桌面项目

远程桌面项目

weixin_41560737的博客 1934

Quartz引擎中的Job 和 StatefulJob

今天将activiti相关代码重新整理时发现,流程自己的activitiExecutor实现了一个过时的接口:StatefulJob。为了不显示那个黄色波浪线,我给改成了继承项目中统一的job子类。 一切看似完美。 但是当运行流程时,发现节点竟然被多线程执行了!!一个节点创建了10次。。。理想的是节点逐步进行才对。 思考了一天,其实是摸鱼了一天。发现了问题。嗯。。改成原来的StatefulJ...

cm1031的博客 4115

不同网段共享打印机的方法

不同网段怎么共享打印机,跨路由怎么共享打印机

weixin_44686104的博客 1万+

Quartz1.6有状态JOB碰到的棘手问题既解决方案

       关于Quartz,我想不要多做介绍了,凡是接触JAVA调度的都会知道这个开源的调度框架.本文就重点说下Quartz中有状态JOB的使用心得.因为我感觉国内的有状态JOB相关的资料比较少,所以在此提供一部分个人的一点经验.主要是针对使用quartz1.6的有状态JOB可能出现的一个棘手问题.       1.关于有状态JOB(StatefulJob)   网上有很多关于有状态...

For_Dream 384

YOLOv11改进策略【Neck】| arXiv 2025 分层多头注意力HMHA 子空间拆分提多样 + 通道重排降冗余,强化目标检测精度

HMHA(Hierarchical Multi-Head Attention,分层多头注意力)旨在解决传统多头注意力(MHA)在图像恢复任务中的核心缺陷——特征冗余。传统MHA将通道均匀拆分给各个头,导致不同头学习的子空间信息相似,进而出现多头关注同一区域、忽略退化区域修复的问题,限制了模型的特征表达能力。HMHA通过“分层子空间拆分+通道重排序”策略,让每个头学习差异化、互补的上下文特征,从根源上缓解冗余,提升图像恢复任务中对复杂退化场景的特征捕捉能力。

Limiiiing的博客 779

猿创征文|Qt 文件和目录应用讲解【QCoreApplication】【QFile、QFileInfo】【QTemporaryDir和QTemporaryFile】【QDir】【QFileSyste】

Qt 文件和目录精准讲解【QCoreApplication】【QFile、QFileInfo】【QTemporaryDir和QTemporaryFile】【QDir】【QFileSyste】【QFileDialog】 第一章 QCoreApplication类 第一节 QCoreApplication常用函数方法 第二节 QCoreApplication举例 第二章 QFile类 第一节 静态函数方法 第二节 成员函数方法 第三章 QFileInfo类 第一节 常用函数方法 第四章 QDir类

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 942

mysql有状态无状态_Quartz框架(五)— 有状态的job和无状态job

Job中有一个StatefulJob子接口,代表着有状态的任务,该接口是一个没有方法的标签接口,其目的就是让Quartz知道任务的类型,以便采用不同的执行方案。/*** @deprecated use DisallowConcurrentExecution and/or PersistJobDataAfterExecution annotations instead.** @author Jame...

weixin_35725821的博客 447

【动态导通电阻】GaN HEMT动态导通电阻的精确测量

2023年7月,瑞士洛桑联邦理工学院的Hongkeng Zhu和Elison Matioli在《IEEE Transactions on Power Electronics》期刊发表文章,提出了一种稳态测量方法,用于研究氮化镓(GaN)高电子迁移率晶体管(HEMT)的动态导通电阻(Ron)。实验结果显示,商业GaN器件在稳态下的动态Ron变化显著,稳定时间可达数分钟且与电压相关。传统的脉冲测量方法由于测试时间不足,可能导致结果不准确。该

荷塘阅色 1376

Quartz有状态的job

package com.lz.quartz.job; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.PersistJobDataAfterExecution; import java.time.In...

luzhensmart的专栏 1051

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Quartz Job耗时太久问题

前端时间由于工作需要研究了下QUARTZ这个调度器,在网上看了蛮多的资料,其中说 的最少最不明白的就是关于QUARTZ的有状态和无状态的 JOB,QUARTZ是怎么处理的,网友们基本上都是说有状态的JOB时,当这次任务没有完成,而下次触发的时间又来了时,都认为是挂起,等待,要考虑很 复杂的情况,本人看了QUARTZ的源码的实现方案,现将QUARTZ的实现机制描述如下:  QUARTZ的有

Just Do It ——张俊永 6416

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Quartz任务调度Job有无状态

有状态的job和无状态的job @PersistJobDataAfterExecution注解的使用 有状态的job可以理解为多次Job调用期间可以持有一些状态信息,这些状态信息存储在JobDataMap中,而默认的无状态job每次调用时都会创建一个新的jobDataMap 添加count的setter和getter方法 public Integer getCount() { return...

小徐的博客 1519

efm32 入门.pdf

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

Quartz教程 - 4Job

首先从 JobDataMap 中获取到 count,然后修改 count 的值,然后重新将 count 的值保存到 JobDataMap 中,这样下一次任务执行的时候,就可以获取到更新后的值。为什么要每次创建一个新的对象呢,因为可能任务执行比较久,一次任务没执行完,下一次任务就开始执行的问题,如果使用的是同一个对象,就可能存在并发问题。注解,让任务串行执行,否则当前任务没有执行完成,下一次任务执行的时候,通过 JobDataMap 获取到的值是没有被更新的。注解,上一次执行完成,才会执行下一次任务。

山石岐渡的博客 1367

关于QUARTZ有状态任务全面解析

[size=medium]前端时间由于工作需要研究了下QUARTZ这个调度器,在网上看了蛮多的资料,其中说的最少最不明白的就是关于QUARTZ的有状态和无状态的 JOB,QUARTZ是怎么处理的,网友们基本上都是说有状态的JOB时,当这次任务没有完成,而下次触发的时间又来了时,都认为是挂起,等待,要考虑很复杂的情况,本人看了QUARTZ的源码的实现方案,现将QUARTZ的实现机制描述如下: ...

pengrongxin的专栏 723

java steafuljob,quartz 多线程如何规避同一时刻执行同一JOB两个或两个以上

前面我们已经介绍了quartz的用法,主要是用于定时操作但是我们发现如果同一个job同一时刻运行,可能造成重复入库的情况。所以我们会有这样的需求 :希望多线程时,能够控制同一时刻相同JOB只能有一个在执行。原因是由于我的执行频率是每30秒,然而有可能30后该JOB还没结素,结果另一线程再次启用同一JOB下的方法,我希望在前一个此JOB结束后再进行下一次调用其实很简单,我们只要在detail的参数里...

weixin_39683526的博客 455

Quartz定时任务学习(六)作业

<br />org.quartz.Job 接口<br /> <br />把 Quartz 作用到 Java 类上唯一要做的就是让它实现 org.quartz.Job 接口。你的 Job 类可以实现任何其他想要的接口或继承任何需要的基类,但是它自己或是它的超类必须实现这个 Job 接口。这个 Job 接口只定义了单个方法:<br />public void execute(JobExecutionContext context) throws JobExecutionException;<br /><br /

飘飘悠悠 7783
上一篇: mysql - 索引,in,or等优化
下一篇: quartz - 宕机后的设置
Prometheus_xiao
博客等级 码龄9年 3粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值