`
tuoni
  • 浏览: 29211 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java 定时任务总结一

阅读更多

 Java定时任务总结
 
 一.从技术上分类大概分为以下三种方式:
 
 1.Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务;
   说明:
    java.util.Timer定时器,实际上是个线程,定时执行TimerTask类
    一个TimerTask实际上就是一个拥有run方法的类,需要定时执行的代码放到run方法体内,TimerTask一般是以匿名类的方式创建。
 
 2.Java可以实现Runnable接口,这里不讲解,以后陆续补充;
   
 
 3.Spring3.0以后自带的task,可以看做一个轻量级的Quartz,它的实现方式如下:
   (1).Spring3.0 自带的作业调度(quartz)的两种业务处理方式
        a.org.springframework.scheduling.quartz.JobDetailFactoryBean
        b.org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean
        说明:Spring通过JobDetailBean/JobDetailFactoryBean,MethodInvokingJobDetailBean/MethodInvokingJobDetailFactoryBean实现Job的定义。
     后者更加实用,只需指定要运行的类,和该类中要运行的方法即可,Spring将自动生成符合Quartz要求的JobDetail
    
   (2).Spring3.0 自带的作业调度(quartz)的两种触发方式:
         a. org.springframework.scheduling.quartz.SimpleTriggerBean  触发器  每隔多长时间运行一次 比如:每隔10分钟运行一次
         b. org.springframework.scheduling.quartz.CronTriggerBean    调度器  每到指定时间则触发一次  比如:每天12:00运行一次
  
   (3).配置调度任务,开启调度
       org.springframework.scheduling.quartz.SchedulerFactoryBean
      
二.具体操作实现:

1.java.util.Timer :
    一些基本方法的说明:
    Timer timer = new Timer(true);
 // true 说明这个timer以daemon方式运行(优先级低,
 // 程序结束timer也自动结束),注意,javax.swing
 // 包中也有一个Timer类,如果import中用到swing包,
 // 要注意名字的冲突。

 TimerTask task = new TimerTask() {
  public void run() {
   // 每次需要执行的代码放到这里面。
  }
 };

 // 以下是几种调度task的方法:

 //timer.schedule(task, time);
 // time为Date类型:在指定时间频度执行一次。

 //timer.schedule(task, firstTime, period);
 // firstTime为Date类型,period为long
 // 从firstTime时刻开始,每隔period毫秒执行一次。

 //timer.schedule(task, delay);
 // delay 为long类型:从现在起过delay毫秒执行一次

 //timer.schedule(task, delay, period);
 // delay为long,period为long:从现在起过delay毫秒以后,每隔period
 // 毫秒执行一次。

 

package com.TimerWay.Timer;

import java.util.TimerTask;

public class TimerTaskJunit extends TimerTask {

	@Override
	public void run() {
		System.out.println("TimerTask1=========");
	}

}

 

package com.TimerWay.Timer;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;


public class Test {
	
	/**
	 * 从现在起过1000毫秒以后,每隔2000毫秒,执行一次TimerTaskJunit的Run方法
	 */
	public void test1(){
		Timer timer = new Timer();  
		timer.schedule(new TimerTaskJunit(), 1000, 2000);  
	}
	
	/**
	 * 每天中午11:00:00 执行定时任务,如果当前时间超过了11点,就明天执行11点执行任务
	 */
	public void test2(){
		final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		long period = 1000 * 60 * 24;//间隔执行时间  24分钟
		Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                Date now = new Date();
                System.out.println(sdf.format(now)+"\t helloworld");
            }
        },DateUtil.timeInMillis(), period);
	}
	
	public static void main(String[] args) {
		Test t = new Test();
		t.test1();
		//t.test2();
		
	}
}

 2.Spring3.0 自带的Quartz

    a.org.springframework.scheduling.quartz.JobDetailFactoryBean

   

<bean name="productDetail" class="com.TimerWay.quartz2.ProductDetail"/>


<bean name="runJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
		<property name="jobClass" value="com.TimerWay.quartz2.RunJob" />
		
		<!-- 属性注入  任务执行时 ,将属性注入到 jobClass对应Value类的属性 -->
		<property name="jobDataAsMap">
			<map>
				<entry key="productDetail" value-ref="productDetail" />
			</map>
		</property>
	</bean>



<!-- Simple Trigger, run every 5 seconds first trigger -->
	<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
		<!-- 任务 -->
		<property name="jobDetail" ref="runJob" />
		<!-- 频度  每10分钟做一次任务 -->
		<property name="repeatInterval" value="600000" />
		<!-- 待延迟之后,开始工作 -->
		<property name="startDelay" value="1000" />
	</bean>


<!-- 配置调度,启动调度任务 -->
	<bean id="schdulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="jobDetails">
			<list>
				<ref bean="runMeJob" />
			</list>
		</property>
		<property name="triggers">
			<list>
				<ref bean="simpleTrigger" />
			</list>
		</property>
		<!-- 
		<property name="triggers">
			<list>
				<ref bean="cronTrigger" />
			</list>
		</property>
		 -->
		
	</bean>

 

package com.TimerWay.quartz2;

import org.apache.log4j.Logger;


/**
 * 更新商城发货单的状态
 * @author daizhao
 *
 */
public class ProductDetail {
	
	private final static Logger log = Logger.getLogger(ProductDetail.class);
	
	public void product(){
		
		log.info("生产。。。。");
	}
}

 

说明:在这里我用的触发器是org.springframework.scheduling.quartz.SimpleTriggerFactoryBean,也可用

org.springframework.scheduling.quartz.CronTriggerFactoryBean,下面的例子,采用。

   b.org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean

  

<bean name="productDetail" class="com.TimerWay.quartz2.ProductDetail"/>
<!-- 会自动的生成JobDetailFactoryBean -->
	<bean id="runMeJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactor yBean">
		<!-- 要执行业务的Bean  --> 
		<property name="targetObject" ref="productDetail" /> 
		<!-- 执行业务的方法  -->
		<property name="targetMethod" value="product" /> 
	</bean> 

<!--Cron Trigger, run every 5 seconds  second trigger  类似Unix中的Crontab的脚步机制-->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
	<!-- 任务 -->
	<property name="jobDetail" ref="runJob" />
	<!-- 频度 -->
	<property name="cronExpression" value="0/5 * * * * ?" />
	</bean>

<!-- 配置调度,启动调度任务 -->
	<bean id="schdulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="jobDetails">
			<list>
				<ref bean="runMeJob" />
			</list>
		</property>
		<property name="triggers">
			<list>
				<ref bean="cronTrigger" />
			</list>
		</property>		
	</bean>

 说明:我解释一些,为什么我用这个JobDetailBean/JobDetailFactoryBean,MethodInvokingJobDetailBean/MethodInvokingJobDetailFactoryBean实现Job的定义,因为,有的时候,开发时,会遇到Spring自带的Quartz和Quartz包冲突的问题,异常如下:

 

Caused by: java.lang.IncompatibleClassChangeError: class org.springframework.scheduling.quartz.JobDetailBean has interface org.quartz.JobDetail as super class
 
Caused by: java.lang.IncompatibleClassChangeError: class org.springframework.scheduling.quartz.CronTriggerBean has interface org.quartz.CronTrigger as super class
 
Caused by: java.lang.IncompatibleClassChangeError: class org.springframework.scheduling.quartz.SimpleTrigger has interface org.quartz.SimpleTrigger as super class

所以,解决方式如下:

 

1.降低Quartz版本,降到1.X去。
2.升级Spring版本到3.1+,根据Spring的建议,将原来的**TriggerBean替换成**TriggerFactoryBean,例如CronTriggerBean 就可以替换成 CronTriggerFactoryBean,  SimpleTriggerBean可以替换成SimpleTriggerFactoryBean,JobDetailBean可以替换成JobDetailFactoryBean
替换之后问题解决。

我后续,还会补充,Spring的注解定时任务和JavaRunnable定时任务,今天先到这里

分享到:
评论

相关推荐

    基于C++开发的WEB服务器,支持C/C++、Python、Java等多语言混合开发WEB应用

    基于C++开发的WEB服务器,支持C/C++、Python、Java等多语言混合开发WEB应用

    基于STM8单片机的TM1615七段数码管驱动(模拟I2C).zip

    基于STM8单片机的编程实例,可供参考学习使用,希望对你有所帮助

    基于STM8单片机的电位器输入控制继电器输出实验.zip

    基于STM8单片机的编程实例,可供参考学习使用,希望对你有所帮助

    网络安全CTF靶场之rce-labs

    该靶场仅供学习使用!

    python爬虫豆瓣电影TOP250,以及数据化分析程序源代码+数据

    电影详情链接 图片链接 影片中文名 影片外国名 评分 评价人数 概况 相关信息 https://movie.douban.com/subject/1292052/ https://img2.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg 肖申克的救赎   The Shawshank Redemption 9.7 2529468 希望让人自由 导演: 弗兰克·德拉邦特 Frank Darabont   主演: 蒂姆·罗宾斯 Tim Robbins ... 1994   美国   犯罪 剧情 https://movie.douban.com/subject/1291546/ https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2561716440.jpg 霸王别姬 9.6 1880353 风华绝代 导演: 陈凯歌 Kaige Chen   主演: 张国荣 Leslie Cheung 张丰毅 ........

    汽车中间件市场调研报告:2023年全球汽车中间件市场销售额达到了78亿美元

    汽车中间件市场调研报告:2023年全球汽车中间件市场销售额达到了78亿美元 在数字化转型的浪潮中,汽车中间件作为连接硬件与软件的关键桥梁,正引领着汽车行业的新一轮变革。随着全球汽车产业的快速发展,中间件市场规模持续扩大,展现出前所未有的增长潜力。然而,面对复杂多变的市场环境和不断涌现的新技术,企业如何精准把握市场脉搏,实现可持续发展?本文将深入探讨全球及中国汽车中间件市场的现状、趋势及竞争格局,为您揭示咨询的重要性。 市场概况: 根据QYResearch(恒州博智)的统计及预测,2023年全球汽车中间件市场销售额达到了78亿美元(约7803百万美元),预计2030年将达到156亿美元(约15630百万美元),年复合增长率(CAGR)为10.3%(2024-2030)。这一数据不仅彰显了中间件市场的强劲增长动力,也预示着未来巨大的市场空间。 技术创新与趋势: 随着自动驾驶、车联网等技术的不断发展,汽车中间件正面临着前所未有的技术挑战与机遇。新一代中间件需要具备更高的实时性、更低的延迟以及更强的数据处理能力,以满足复杂多变的汽车应用场景。同时,云计算、大数据、人工智能等技术的融合应用,将进

    python语言mp3pl爬虫程序代码QZQ.txt

    python语言mp3pl爬虫程序代码QZQ

    小语种字体TTF文件转PNG图片的方法

    # 小语种字体TTF文件转PNG图片的方法 ## 准备工作 1. 下载python3.9,推荐3.6~3.9,几个依赖包在这个版本运行的好。 2. 下载 FontForge-mingw-w64 ,可自行下载,或从文末打包好的工具包直接使用。 3. 下载需要导出的字体ttf文件,最好先装在本机系统上。 ## 导出方法 1. 把 `tts2png2.py` 文件复制到软件的bin目录下。 2. 修改 `tts2png2.py` 文件中的字体路径,注意Windows用双斜杠。 3. 从bin目录打开终端(管理员模式启动)。 4. 运行脚本 `./ffpython .\tts2png2.py`。

    26页-基于AI人工智能的智慧校园综合解决方案AI+智慧校园综合解决方案.pdf

    在21世纪的科技浪潮中,人工智能(AI)无疑是最为耀眼的明星之一,它以惊人的速度改变着我们的生活、工作乃至整个社会的运行方式。而在人工智能的广阔领域中,大模型(Large Models)的崛起更是开启了智能技术的新纪元,引领着AI向更加复杂、高效、智能的方向发展。本文将深入探讨人工智能大模型的内涵、技术特点、应用领域以及对未来的影响。 一、人工智能大模型的内涵 人工智能大模型,顾名思义,是指具有庞大参数规模和数据处理能力的AI模型。这些模型通过深度学习算法,在海量数据上进行训练,能够学习到丰富的知识表示和复杂的模式识别能力。与传统的小型或中型模型相比,大模型在理解自然语言、生成高质量内容、进行跨模态信息处理等方面展现出前所未有的优势。它们不仅能够执行特定的任务,如图像识别、语音识别,还能进行创造性的工作,如文本生成、音乐创作,甚至在某些情况下展现出接近或超越人类的智能水平。 二、技术特点 海量数据与高效训练:大模型依赖于庞大的数据集进行训练,这些数据涵盖了广泛的主题和情境,使得模型能够学习到丰富的语义信息和上下文理解能力。同时,高效的训练算法和硬件加速技术,如TPU(Tensor Processing Unit)和GPU,使得大规模模型的训练成为可能。 自注意力机制与Transformer架构:许多领先的大模型采用了Transformer架构,特别是其自注意力机制,这种设计使得模型在处理序列数据时能够捕捉到长距离依赖关系,极大地提高了模型的表达能力和泛化能力。 多任务学习与迁移学习:大模型通常具备多任务学习的能力,即在一次训练中同时学习多个任务,这有助于模型学习到更通用的知识表示。此外,迁移学习使得这些模型能够轻松适应新任务,只需少量额外数据或微调即可。

    下垂控制-基于T型三电平逆变器的下垂控制,电压电流双闭环,采用LCL滤波,SPWM调制方式 1.提供simulink仿真源文件 2.提供下垂控制原理与下垂系数计算方法 3.中点平衡控制,电压电流双闭环

    下垂控制-基于T型三电平逆变器的下垂控制,电压电流双闭环,采用LCL滤波,SPWM调制方式 1.提供simulink仿真源文件 2.提供下垂控制原理与下垂系数计算方法 3.中点平衡控制,电压电流双闭环控制 4.提供参考文献

    一个仿大众点评、美团的城市选择器,使用如同Rx一样优雅,并且UI和城市数据可以自定义.zip

    城市选择器一个仿大众点评的城市快速选择器, 最少只需 一行 代码即可启动城市选择器, 支持页面样式修改,多元化自定义截屏 版本日志V0.4.6优化地理位置设置时有时会设置不成功问题修复其他若干问题修改UI默认主题色V0.4.5修改设置位置信息方式,由之前必须在打开页面之前获取位置信息改为允许用户在打开页面后设置位置信息,具体使用方式见 Step3简化配置项,不需要在AndroidManifest中再注册Activity,并默认隐藏titlebarV0.4.3修复更新数据库表结构后第一次进入会闪退问题V0.4.0数据库表结构修改,增加了高德地图citycode设置gps城市的api略有改动见 Step3V0.3.3紧急修复一个可能导致内存泄漏问题优化提高滑动检索效率隐藏下拉刷新labelV0.3.1在搜索框后面添加一个清空搜索框按钮修复搜索框中输入空格会搜索出全部城市问题修复搜索结果弹出框中文字在不同theme下显示不同颜色问题,现在已统一为黑色其他调用时参数合法性校验V0.3.0简化api调用形式,修改为Rx形式,见操作步骤

    慢性病大数据分析处理.zip

    慢性病大数据分析处理慢性病项目

    Multisim单片机资源单片机C语言程序设计实训100例

    Multisim单片机资源单片机C语言程序设计实训100例提取方式是百度网盘分享地址

    PMSM永磁同步电机最大转矩电流比MTPA控制仿真,弱磁控制仿真,前馈补偿仿真程序,详细解析教程文档 这是一份非常完美的仿真文件及详细教程,从仿真效果图看转速、电流及转矩跟随非常稳定 该算法架构包

    PMSM永磁同步电机最大转矩电流比MTPA控制仿真,弱磁控制仿真,前馈补偿仿真程序,详细解析教程文档。 这是一份非常完美的仿真文件及详细教程,从仿真效果图看转速、电流及转矩跟随非常稳定。 该算法架构包含如下模块: 1)SVPWM矢量控制模块 2)转速环PI调节器、电流环PI调节器; 3)MTPA调节器; 4)弱磁控制器; 5)前馈补偿; 一份该仿真的算法说明文档,每一步都有详细介绍如何搭建,包括环路参数怎么算,拿来做毕设或者学习都很方便; 几篇参考文献; 一篇作者自己写的算法总结,让你少走弯路; 两个视频;

    手绘卡通儿童人物幼儿园教学课件模板.pptx

    手绘卡通儿童人物幼儿园教学课件模板

    Simulink电动汽车仿真模型(包含行驶阻力模型,工作模式切模型,驾驶员模型,PID控制模块等,NEDC,CLTC工况仿真结果)东西很全

    Simulink电动汽车仿真模型(包含行驶阻力模型,工作模式切模型,驾驶员模型,PID控制模块等,NEDC,CLTC工况仿真结果)东西很全

    2-Perfect Backup v3.3.0 全功能备份神器,支持多种备份方式,免费使用,可商用

    是一款全功能的备份软件,支持增量备份、差异备份、完全备份和同步备份,帮助用户轻松保护关键文件。支持多种存储选项,包括本地硬盘、USB驱动器、网络文件夹、云存储和 FTP 服务器等。 【使用方法】: 1. 下载并安装 Perfect Backup。 2. 打开软件,选择备份类型(增量、差异、完全或同步)。 3. 指定源文件和目标存储位置。 4. 设置备份计划,选择备份频率。 5. 点击“开始备份”,执行备份任务。

    基于STM8单片机的光敏电阻模拟量ADC输入(带中断).zip

    基于STM8单片机的编程实例,可供参考学习使用,希望对你有所帮助

    HTML5实现好看的创意房屋设计公司网页源码.zip

    资源描述: HTML5实现好看的创意房屋设计公司网页源码,好看的创意房屋设计公司网页源码,创意房屋设计公司网页源码模板,HTML创意房屋设计公司网页源码,内置酷炫的动画,界面干净整洁,页面主题,全方位介绍内容,可以拆分多个想要的页面,可以扩展自己想要的,注释完整,代码规范,各种风格都有,代码上手简单,代码独立,可以直接运行使用。也可直接预览效果。 资源使用: 点击 index.html 直接查看效果

Global site tag (gtag.js) - Google Analytics