`
tuoni
  • 浏览: 28564 次
  • 性别: 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定时任务,今天先到这里

分享到:
评论

相关推荐

    java定时任务,每天定时执行任务demo

    总结来说,这个Java定时任务示例展示了如何利用`java.util.Timer`和`TimerTask`来创建一个每天定时执行的任务,并通过监听器和配置文件来控制任务的启动和停止。这为开发者提供了灵活的定时任务管理方式,适应了各种...

    java定时任务的实现方式

    总结来说,Java定时任务的实现主要有两种常见途径:一是使用Java自带的`Timer`类,适合简单的定时需求,但不适用于复杂的调度场景;二是借助第三方库如Quartz,提供了更强大的任务调度能力,可以满足复杂的企业级...

    java轻松实现—定时任务

    总结来说,Java实现定时任务有多种方法,其中在Web应用中使用监听器和`TimerTask`是一种常见的方式。这种方式易于理解和实现,但可能不适合复杂的定时需求。对于更复杂的需求,可以考虑使用`...

    Quartz--JAVA定时任务\Java应用:Java调度任务和Spring Quartz (1)

    Java定时任务是应用程序中不可或缺的一部分,它允许程序在特定时间执行特定操作,无需用户干预。在JDK 1.3及以后的版本中,`java.util.Timer`类提供了基础的定时任务支持。不过,`Timer`类的功能相对有限,无法精确...

    java定时任务小例子

    Java定时任务是编程中常见的一种需求,用于在特定时间或间隔执行特定的代码逻辑。在这个“java定时任务小例子”中,我们可以看到两个关键文件:`TimerTest.java`和`DoTask.java`,它们分别代表了定时器的任务调度和...

    java动态管理定时任务

    总结来说,通过Spring和Quartz的整合,我们可以构建一个强大的定时任务管理系统,不仅可以方便地创建和调度任务,还能根据业务需求进行动态管理,同时保证任务的稳定性和持久性。这在企业级应用中有着广泛的应用价值...

    Java定时执行某个任务

    `Timer`适合简单的定时任务,而`ScheduledExecutorService`更适合复杂的需求,如多线程环境和高并发场景。选择哪种方式取决于具体的应用场景和性能需求。在实际开发中,理解并熟练掌握这两种方法能帮助我们编写出...

    java quartz 定时任务

    总结起来,这个项目利用Quartz库和Cron表达式,为Java应用程序提供了一种强大而灵活的定时任务解决方案。开发者可以根据需求定义Cron表达式,创建各种复杂的调度策略,确保任务在正确的时间执行。通过深入理解Quartz...

    定时任务(java)

    总结起来,Java语言提供了多种实现定时任务的方式,从基础的`Timer`到强大的Spring `@Scheduled`和Quartz库,开发者可以根据项目的具体需求选择合适的工具。理解并熟练掌握这些工具,将有助于在实际工作中更高效地...

    java 定时执行任务

    Java定时执行任务是Java开发中常见的一种需求,用于在特定时间点或按照预设周期执行某段代码。在Java中,有两种主要的方式来实现定时任务:Java.util.Timer类和java.util.concurrent包下的ScheduledExecutorService...

    java网上爬虫和定时任务

    总结一下,Java网上爬虫结合Quartz定时任务可以实现高效、自动化的网页数据抓取。通过选择合适的HTTP客户端和HTML解析库,我们可以构建出灵活的爬虫。同时,Quartz的定时任务功能让我们能够按照预定的时间间隔执行...

    Java定时执行任务的三种方法

    Java定时执行任务是Java开发中常见的一种需求,用于在特定时间执行特定的代码逻辑,例如数据备份、统计分析等。本文将详细介绍Java中三种常见的定时任务实现方式:`java.util.Timer`、`ServletContextListener`以及...

    java定时器定时调用任务

    总结来说,Java定时器是通过`Timer`和`TimerTask`类实现的,它们提供了基础的定时任务调度功能。在Servlet环境中,我们可以利用监听器或Servlet的初始化方法来整合定时器。然而,对于更复杂的定时需求,建议使用`...

    3类java定时任务代码

    总结来说,这些代码示例涵盖了使用`Timer`和`ScheduledExecutorService`两种不同方式来实现Java定时任务,以及可能的自定义任务监听器`TaskListener`。通过学习和理解这些代码,开发者可以更好地理解和应用Java的...

    JAVA项目服务器启动时自启动指定的Servlet,并定时执行任务

    在Java Web开发中,我们经常需要在服务器启动时自动加载特定的Servlet,并让它们执行一些初始化操作或定时任务。这通常涉及到对Web应用的配置文件`web.xml`以及Servlet类本身的编程。以下将详细讲解如何实现这个功能...

    Springboot中使用数据库配置定时任务

    `ScheduledTask`是一个自定义的Java Bean,它包含定时任务的详细信息,如cron表达式、任务名称、执行的bean方法等: ```java public class ScheduledTask { private String name; private String cronExpression;...

    java定时关机小程序

    总结起来,Java定时关机小程序的核心技术包括Java的定时任务处理、操作系统命令的调用,以及可能的图形用户界面设计。理解这些知识点对于开发类似的应用或扩展其他自动化任务非常有帮助。通过学习和实践,你可以创建...

    关于 spring 里的定时任务设置

    1. 基于Java Timer API的定时任务: 在上述示例中,我们看到了如何使用Spring结合Java Timer API来创建定时任务。首先,自定义了一个`SayHelloTask`类,继承自`TimerTask`,并在`run()`方法中定义了具体要执行的任务...

    spring动态配置定时任务

    总结起来,Spring动态配置定时任务的关键在于:1) 使用`@Scheduled`或`TaskScheduler`来调度任务;2) 将定时任务配置存储在数据库中,以便于管理和动态更新;3) 设计服务类以响应数据库的变更,及时调整任务的执行...

    java 定时任务 quartz

    Java定时任务Quartz是一个强大且灵活的框架,能够处理复杂的调度需求。通过与Spring的集成,我们可以利用Spring的依赖注入和管理功能,轻松地在企业级应用中实现定时任务。理解Quartz的工作原理和配置方式,对于提升...

Global site tag (gtag.js) - Google Analytics