Spring定时任务(Spring Task)(推荐@Scheduled)

博客介绍了项目开发中定时器的实现方式,包括Java自带的Timer、功能强大但配置复杂的Quartz,以及轻量级的Spring Task。还阐述了作业继承方式,推荐普通Java类方式。详细说明了Spring Task的配置和注解使用方式,最后提及Springboot定时任务的开启方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 定时器

项目开发中需要执行一些定时任务,比如在凌晨时候,更新一些新的信息,定时发送邮件等等

1.1. 实现方式

1.1.1. java.util.Timer
Java自带的java.util.Timer类,可以调度一个java.util.TimerTask任务。这种方式可以让程序按照某一个频度执行,但不能在指定的时间运行,一般用的比较少。
1.1.2. Quartz
使用Quartz,这是一个功能比较强大的调度器,可以让程序在指定的时间执行,也可以按照某一个频度执行,配置起来稍显复杂。
1.1.3. Spring Task
spring3.0以后自带的task,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单。

1.2 .作业继承方式

一种方式是作业类需要继承特定的作业类基类,如Quartz需要继承:
org.springframework.scheduling.quartz.quartzJobBean;
java.util.Timer中需要继承自java.util.TimerTask。
另外一种即是一种普通的java类,不需要继承任何基类。
推荐使用第二种方式

2. Spring Task使用方式

2.1 配置方式
2.1.1 spring.xml

 <!--配置定时任务-->
    <task:scheduled-tasks>
        <task:scheduled ref="job1" method="run" fixed-rate="5000"/>
    </task:scheduled-tasks>

job1

public class job1 {
    public void run(){
        System.out.println("job1....."+new Date());
    }
}

每隔五秒执行一次job1的run
在这里插入图片描述

2.1.2 spring.xml
克隆表达式

<task:scheduled-tasks>
        <task:scheduled ref="job1" method="run" cron="0/5 * * * * ?"/>
 </task:scheduled-tasks>

job1见2.1.1的
每隔五秒执行一次run方法(https://www.pppet.net/)
在这里插入图片描述
2.2 注解方式
我们会用到 @Scheduled注解,在每个方法上使用 @Scheduled(fixedRate = 2000)或者 @Scheduled(cron = “0-5 * * ? * *”),配置时间
spring.xml

<!--启动定时任务的注解驱动-->
  <task:annotation-driven/>

job2

@Component
public class Job2 {
    @Scheduled(fixedRate = 2000)
    public void run1(){
        System.out.println("job2....."+new Date());
    }
}

每两秒运行一次
在这里插入图片描述

3 quartz的使用

一般使用上面的spring task即可,不用quartz定时任务
3.1 导入依赖

  <dependency>
      <groupId>org.quartz-scheduler</groupId>
      <artifactId>quartz</artifactId>
      <version>2.3.2</version>
 </dependency>
 <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
      <version>5.3.2</version>
  </dependency>

3.2 spring.xml

	<!-- 线程池 -->
    <bean id="executor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
        <property name="corePoolSize" value="10" />
        <property name="maxPoolSize" value="100" />
        <property name="queueCapacity" value="500" />
    </bean>
    <!--FixedRate 定时任务 -->
    <bean id="quartzJob" class="com.wanmait.mavendemo.job.QuartzJob" />
    <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="quartzJob" />
        <property name="targetMethod" value="print" />
    </bean>


<!-- Cron   quartz-2.x 的配置  时间调度的两种写法 fixedRate和cron-->
    <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean" >
        <property name="jobDetail" ref="jobDetail" />
        <property name="cronExpression" value="0/5 * * * * ?" />
    </bean>
    <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
        <property name="jobDetail" ref="jobDetail"></property>
        <property name="startDelay" value="0" />
        <!-- 调度工厂实例化后,经过 0 秒 开始执行调度 -->
        <property name="repeatInterval" value="2000" />
        <!--2 秒调度一次 -->
    </bean>
    <!-- 调度 看你用哪个 两种选一种   -->
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <!--<ref bean="simpleTrigger" />-->
                <ref bean="cronTrigger"/>
            </list>
        </property>
        <property name="taskExecutor" ref="executor" />
    </bean>

真正项目时候两种配置写一种就可以了,而且一般也使用spring task
**3.3 QuartzJob **

public class QuartzJob {
    public void print()
    {
        System.out.println("quartzjob.........."+new Date());
    }
}

Springboot的定时任务

在启动类上加@EnableScheduling即可开启定时任务
做一个任务类,加一个@Component注解来被spring管理,再在方法上加@Scheduled(fixedRate = 2000)或者 @Scheduled(cron = “0-5 * * ? * *”)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值