Spring中的定时器

最近项目中使用到了定时器的功能,在每天凌晨,如果内存中存有数据,将会把内存中的数据刷入数据库中。

从任务调度的触发时机来分,主要是针对作业使用的触发器,有一下两种:

(1)每隔指定时间触发一次,在Quartz中对应的触发器为:org.springframework.scheduling.quartz.SimpleTriggerBean

(2)每到指定时间触发一次,在Quartz中对应的调度器为:org.springframework.scheduling.quartz.CronTriggerBean

1.java中的定时器  Timer

使用java中的java.util.Timer工具类,这个类允许调度一个java.util.TimeTask任务。

(1)每隔指定时间触发一次

<pre name="code" class="java">java.util.Timer timer;
timer = new Timer(false);//如果为true,这个线程是一个守护线程,如果调用几个timer.schedule()方法,则只有第一个被执行,后面几个会被屏蔽,如果把这个参数设置为false,后面的调用才能生效。
java.util.TimerTask  task = new java.util.TimerTask()
{
     public void run()
  {
     //flush();要操作的方法
  }
};
java.util.Date time = new java.util.Date();
long delay = 2000;
long period = 5000;
//启动定时任务,立即执行一次并退出
timer.schedule(task,time);
//启动定时任务,立即执行一次,然后每隔两秒执行一次
timer.schedule(task,time,delay);
//启动定时任务,从现在起过两秒执行一次然后退出
timer.schedule(task,delay);
//启动定时任务,从现在起过两秒以后,每隔五秒执行一次
timer.schedule(task,delay,period);

 
第一个参数是要操作的方法,第二个参数是要设定延迟的时间,第三个参数是周期的设定,每隔多长时间执行该操作。 

使用这几行代码以后,Timer本身会每隔5分钟调用一次flush方法,不需要自己启动线程。Timer本身也是多线程同步的,多个线程可以共用一个Timer,不需要外部同步代码。

使用这种方式可以使程序按照某一个频度执行,但不能再指定的时间运行。

(2)每到指定时间触发一次

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class Timerc {

	 static int count = 0;
	    
	    public static void showTimer() {
	        TimerTask task = new TimerTask() {
	            @Override
	            public void run() {
	                ++count;
	                System.out.println("时间=" + new Date() + " 执行了" + count + "次"); // 1次
	            }
	        };

	        //设置执行时间
	        Calendar calendar = Calendar.getInstance();
	        int year = calendar.get(Calendar.YEAR);
	        int month = calendar.get(Calendar.MONTH);
	        int day = calendar.get(Calendar.DAY_OF_MONTH);//每天
	        //定制每天的17:00:00执行,
	        calendar.set(year, month, day, 19, 00, 00);
	        Date date = calendar.getTime();
	        Timer timer = new Timer();
	        System.out.println(date);
	        
	        int period = 1 * 3600 * 1000;
	        //每天的date时刻执行task,每隔一小时重复执行
	        timer.schedule(task, date, period);
	        //每天的date时刻执行task, 仅执行一次
	        //timer.schedule(task, date);
	    }

	    public static void main(String[] args) {
	        showTimer();
	    }
}

2. 使用Quartz

这是一个功能强大的调度器,可以让程序在指定时间执行,也可以按照某一个频度执行。

用法:

(1)作业类继承自特定的基类

org.springframework.scheduling.quartz.QuartzJobBean

第一步:定义作业类

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
public class Job1 extends QuartzJobBean {

private int timeout;
private static int i = 0;
//调度工厂实例化后,经过timeout时间开始执行调度
public void setTimeout(int timeout) {
this.timeout = timeout;
}

/**
* 要调度的具体任务
*/
@Override
protected void executeInternal(JobExecutionContext context)
throws JobExecutionException {
  System.out.println("定时任务执行中…");
}
}
第二步:spring配置文件中配置作业类JobDetailBean

<bean name="job1" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="com.gy.Job1" />
<property name="jobDataAsMap">
<map>
<entry key="timeout" value="0" />
</map>
</property>
</bean>
说明:org.springframework.scheduling.quartz.JobDetailBean有两个属性,jobClass属性即我们在java代码中定义的任务类,jobDataAsMap属性即该任务类中需要注入的属性值。

第三步:配置作业调度的触发方式(触发器)

Quartz的作业触发器有两种,分别是

org.springframework.scheduling.quartz.SimpleTriggerBean

org.springframework.scheduling.quartz.CronTriggerBean

第一种SimpleTriggerBean,只支持按照一定频度调用任务,如每隔30分钟运行一次。

配置方式如下:

<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="job1" />
<property name="startDelay" value="0" /><!-- 调度工厂实例化后,经过0秒开始执行调度 -->
<property name="repeatInterval" value="2000" /><!-- 每2秒调度一次 -->
</bean>
第二种CronTriggerBean,支持到指定时间运行一次,如每天12:00运行一次。

配置方式如下:

<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="job1" />
<!—每天12:00运行一次 -->
<property name="cronExpression" value="0 0 12 * * ?" />
</bean>


第四步:配置调度工厂

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTrigger" />
</list>
</property>
</bean>
说明:该参数指定的就是之前配置的触发器的名字。

第五步:启动应用,即将工程部署到tomcat或其他容器。

(2)作业类不继承特定基类

3. Spring3.0以后自带的Task

可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单的多,除Spring相关的包外不需要额外的包,并且支持注解和配置文件两种形式。


参考:

http://www.cnblogs.com/wyqtomorrow/archive/2007/04/28/730978.html

http://gong1208.iteye.com/blog/1773177    2.2和3的两种方式详细介绍。

http://m.oschina.net/blog/148424   spring注入方式quartz定时调用处理的代码实现

http://blog.sina.com.cn/s/blog_6d0730c70100y9gf.html


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring框架,有多种方式可以实现定时任务调度。以下是Spring内置的定时器实现方式: 1. 使用`@Scheduled`注解:在需要执行定时任务的方法上添加`@Scheduled`注解,并配置相应的定时任务表达式。例如: ```java import org.springframework.scheduling.annotation.Scheduled; public class MyScheduledTask { @Scheduled(cron = "0 0 0 * * ?") // 每天凌晨执行 public void myTask() { // 执行定时任务的逻辑 } } ``` 2. 实现`SchedulingConfigurer`接口:创建一个类实现`SchedulingConfigurer`接口,并重写`configureTasks`方法,用于配置定时任务。例如: ```java import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.SchedulingConfigurer; import org.springframework.scheduling.config.ScheduledTaskRegistrar; @Configuration @EnableScheduling public class MyTaskConfig implements SchedulingConfigurer { @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { // 配置定时任务 taskRegistrar.addCronTask(() -> { // 执行定时任务的逻辑 }, "0 0 0 * * ?"); // 每天凌晨执行 } } ``` 3. 使用XML配置:在Spring的XML配置文件使用`<task:scheduled>`标签来配置定时任务。例如: ```xml <beans xmlns:task="http://www.springframework.org/schema/task"> <task:scheduler id="myScheduler" pool-size="10" /> <task:scheduled ref="myTaskBean" method="myTask" cron="0 0 0 * * ?" /> <bean id="myTaskBean" class="com.example.MyTaskBean" /> </beans> ``` 这些是Spring内置的一些定时任务调度的实现方式,根据项目的需求和个人偏好,选择适合的方式来实现定时任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值