springframework.scheduling.quartz工作调度器使用(一):多定时任务共用quartz

2023-11-18

实现场景一:多个频率H1(5分钟)任务、H1(10分钟)任务 定时执行,且每个任务执行所需时间在频率时间段内

配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:task="http://www.springframework.org/schema/task"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
       "
	default-lazy-init="false">
	<bean id="configholder"
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
	</bean>
	<context:annotation-config />
	<tx:annotation-driven proxy-target-class="true" />

	<bean id="h1JsonFileService" class="com.hp.bon.omc.nms.core.service.JsonFileServiceH1">
		<property name="freq" value="H1" />
	</bean>
	<bean id="H1Job"
		class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject" ref="h1JsonFileService" />
		<property name="targetMethod" value="doIt" />
		<property name="concurrent" value="false" />
	</bean>

	<!-- H1频率,每5分钟一次: 440200017 任务 0 0,5,10,15,20,25,30,35,40,45,50,55 * * * ? -->
	<bean id="H1Trigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
		<property name="jobDetail" ref="H1Job" />
		<property name="cronExpression" value="0 0/5 * * * ?" />
	</bean>

    <bean id="h2JsonFileService" class="com.hp.bon.omc.nms.core.service.JsonFileServiceH2">
		<property name="freq" value="H2" />
	</bean>
	<bean id="H2Job"
		class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject" ref="h2JsonFileService" />
		<property name="targetMethod" value="doIt" />
		<property name="concurrent" value="false" /><!-- 关闭任务并行执行,采用 串行执行-->
	</bean>

	<!-- H2频率,每10分钟一次 -->
	<bean id="H2Trigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
		<property name="jobDetail" ref="H2Job" />
		<property name="cronExpression" value="0 0/10 * * * ?" />
	</bean>

	<bean name="H1SchedulerFactoryBean"
		class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<ref bean="H1Trigger" />
				<ref bean="H2Trigger" />
			</list>
		</property>
	</bean>
	
	 
</beans>

com.hp.bon.omc.nms.core.service.JsonFileServiceH1 为自定义类:(JsonFileServiceH2代码相同)

public class JsonFileServiceH1 {
	private static final Logger LOG = LoggerFactory.getLogger(JsonFileServiceH1.class);
	public void doIt(){
		try{
			doItReal();
		}catch(Exception e){
			LOG.error("doItReal() error", e);
		}
	}
	public void doItReal(){
		LOG.info("****doing*****");
	}
}

输出结果:

  5分钟时:      
[H1SchedulerFactoryBean_Worker-1]  ****doing*****
10分钟时:      
[H1SchedulerFactoryBean_Worker-1]  ****doing*****
[H2SchedulerFactoryBean_Worker-1]  ****doing*****


实现场景二:多个频率H1(5分钟)任务、H1(10分钟)任务 定时执行,但某个频率(如H1)内任务执行所需时间超过频率时间段

配置文件:同上,不变

com.hp.bon.omc.nms.core.service.JsonFileServiceH1 为自定义类:(JsonFileServiceH2代码不变)

public class JsonFileServiceH1 {
	private static final Logger LOG = LoggerFactory.getLogger(JsonFileServiceH1.class);
	public void doIt(){
		try{
			doItReal();
		}catch(Exception e){
			LOG.error("doItReal() error", e);
		}
	}
	public void doItReal() throws InterruptedException{
		for( int x = 1 ; x <= 10;x++){
			Thread.sleep(60*1000);//Sleep 1分钟
			LOG.info("****doing"+x+"*****");
		}
	}
}

输出结果:

5-9分钟时:      
[H1SchedulerFactoryBean_Worker-1]  ****doing1*****
[H1SchedulerFactoryBean_Worker-1]  ****doing2*****
[H1SchedulerFactoryBean_Worker-1]  ****doing3*****
[H1SchedulerFactoryBean_Worker-1]  ****doing4*****

10分钟时:      
[H1SchedulerFactoryBean_Worker-2]  ****doing1*****
[H2SchedulerFactoryBean_Worker-1]  ****doing*****

11-14分钟
[H1SchedulerFactoryBean_Worker-2]  ****doing2*****
[H1SchedulerFactoryBean_Worker-2]  ****doing3*****
[H1SchedulerFactoryBean_Worker-2]  ****doing4*****
......

 结论:1)每次 定时任务执行时,如果前次任务没有执行完成,当前任务会中断前任务执行过程。

          2)一个 SchedulerFactoryBean类,默认只会启动 10个_Worker,即org.quartz.threadPool.threadCount = 10(默认值),一旦启动的任务过多,只能等到空闲_Worker只才会执行。


springframework.scheduling.quartz 为 org.springframework.context.support-3.1.2.RELEASE包,源代码研待续。。。。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springframework.scheduling.quartz工作调度器使用(一):多定时任务共用quartz 的相关文章

  • Android开源框架之Fresco

    简介 Fresco是Facebook最新推出的一款用于Android应用中展示图片的强大图片库 可以从网络 本地存储和本地资源中加载图片 相对于ImageLoader 拥有更快的图片下载速度以及可以加载和显示gif图等诸多优势 是个很好的图
  • EhCache 说明 &项目实战实用 & 分布式缓存/缓存集群

    I EhCache 说明 EhCache 是一个纯Java的进程内缓存框架 具有快速 精干等特点 是Hibernate中默认的CacheProvider Ehcache是一种广泛使用的开源Java分布式缓存 主要面向通用缓存 Java EE
  • 处理高并发、大数据存储的网站技术架构

    本文转载自 https zhuanlan zhihu com p 24669514 大型网站技术架构剖析 高并发 大流量 40亿 PV page view 3 5亿 IP 高可用 高可用MySQL 7 24小时不间断运行 海量数据 用户分布
  • springBoot+scheduling实现多任务动态定时任务

    使用spring自带的scheduling定时调度任务相当于轻量级的Quartz 但是不支持分布式 若要实现分布式定时任务就得使用Quartz了 第一步 在入口类中声明定时任务 import org springframework boot
  • okhttp源码分析

    Okhttp介绍 由square公司贡献的一个处理网络请求的开源项目 是目前Android使用最广泛的网络框架 从Android4 4开始HttpURLConnection的底层实现采用的是okhttp 项目地址 https github
  • 开源框架若依实战Demo学习笔记

    若依是个不错的框架 下面是我用他写的一个简单demo 以后会在此基础上进行进一步的开发 下面是整合的过程 我在整合的过程中可谓是一波三折 大家如果不想走弯路 那么这篇文章将对你很有帮助 首先 项目代码地址先列出来 方便大家下载使用 这是整理
  • Heroku 上每分钟调度一个作业 Rails 3.1

    我想在 Heroku 上每分钟运行一个任务 以检查是否满足使某些用户任务超时的条件 我只能每小时运行一次 Heroku cron 作业 那么设置这样的定时任务的最佳方法是什么 我在 Heroku 上使用 Rails 3 1 从今天开始 您可
  • Google OR 工具 - 火车调度问题

    我试图解决的问题有点像这里的员工调度问题 https github com google or tools blob master examples python shift scheduling sat py 然而 有一些事情我被困住了
  • 如今,设置线程亲和性而不是将其留给操作系统的充分理由是什么?

    在这里搜索 线程亲和力 的答案 我看到很多人对此感兴趣 但除了可能获得稳定的 QueryPerformanceTimer 结果之外 没有什么理由 假设有一个现代操作系统和一个带有现代 4 6 核 CPU 的现代 2 4 插槽工作站 服务器类
  • 以低优先级启动进程(使用 Runtime.exec / ProcessBuilder.start)

    我需要在低优先级下启动一个 CPU 密集型系统进程 这样它就不会减慢我的服务器速度 我怎样才能在 Linux 上做到这一点 这与这个问题类似 使用 Runtime exec ProcessBuilder start 以低优先级启动 Java
  • 根据条件选择 OpenMP 编译指示

    我有一个想要优化的代码 它应该在各种线程中运行 在我的 for 循环中使用不同的调度技术运行一些测试后 我得出的结论是 最适合的方法是在只有一个线程时执行动态调度 否则进行引导 这在 openMP 中可能吗 更准确地说 我希望能够执行以下操
  • QEventLoop:获取安排事件的时间

    是否可以获取事件已安排到 QEventLoop 的时间 例如QCoreApplication事件循环 我遇到了主事件循环暂停的情况 当它重新激活时 事件被触发 我对事件添加到队列的时间感兴趣 这些事件不是自定义事件 而是系统 和其他 事件
  • PHP:运行计划作业(cron 作业)

    我的网络酒店上有一个网站 我想在其上运行一些计划任务 您会推荐哪些方法来实现这一目标 到目前为止 我想到的是在每个页面的顶部包含一个脚本 然后让该脚本检查是否该运行该作业 这只是我正在思考的一个简单例子 if alreadyDone 0 t
  • 使用 Windows 服务实现计划作业的最佳方式是什么

    我有一个偶尔在晚上运行的数据库作业 我需要一个 Windows 服务来定期轮询数据库 以便在 SQL 作业完成后做更多的工作 我正在寻找一个可靠的示例来编写一个调度程序 该调度程序可以优雅地失败而不会导致服务崩溃 只需将其设置为计划任务即可
  • 如何在执行一定次数后停止计划重复执行的 Runnable

    情况 我有一个可运行的 我有一个类 它使用 ScheduledExecutorService 来安排此 Runnable 执行固定延迟调度 http download oracle com javase 1 5 0 docs api jav
  • 如何设置 Quartz.NET 来安排电子邮件

    有两种解决方案Quartz server 2008 sln and 石英 2008 sln在下载的quartz NET 库中 现在我必须设置重复工作 数据库中会有一个表格 其中定义了所有时间表 例如每月的第一个星期五 每月 5 个 每个星期
  • 您如何实施 SCRUM 来单独工作? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在一个大型开源项目的开始阶段独自工作 希望利用 Scrum 的一些核心思想 方法来帮助管理我的时间 并继续专注于开发和部署早期的 可演示
  • 如何每天在特定时间触发 akka 调度程序?

    我创建了一个 Akka 的调度程序 每天在固定时间发送邮件 例如每天上午 6 00 那么如何称呼演员呢 我的意思是我应该使用什么逻辑 谢谢 只需计算现在和接下来的下午 6 点之间的差异 将其作为初始延迟 然后每 24 小时重复一次
  • Quartz.Net - 每 3 周周一、周二、周三

    我被 Quartz NET cron 触发器困住了 除了以下场景之外 我能够实现所有场景 每 X 周周一 周二 周三 我设法做到了这一点 0 31 15 MON 2 每个第二个星期一触发 它可以与0 31 15 MON 2 TUE 2 WE
  • 通过递归扩展 Prolog 目标?

    我 最终 实现了一些目标 这些目标将根据开始由 开始之后 and duration 然而 计划目标仅接受规定数量的任务 我想扩展计划目标的功能以接受单个列表并在计划时迭代该列表 不幸的是 我认为这将需要与can run and 冲突目标如下

随机推荐