Spring定时任务

在日常生活中,我们会用到很多定时任务,比如学校上课每隔一个小时打一次铃;企业中,每一天清晨生成昨天的报表,等等。
Quartz是非常好的任务调度框架,他可以与J2se和J2EE应用程序结合

Quartz的使用

Quartz有三个核心概念:调度器、任务和触发器
任务就是需要定时执行的任务;
触发器就是触发任务,使任务执行;
调度器负责调度各个任务,当到达某个时刻或过了特定的时间,触发器就会启动了,特定的任务就会执行。概念相对应的类和接口有:
1. JobDetail: 望文生义就是描述任务的相关情况
2. Trigger: 描述出发Job执行的时间触发规则。有SimpleTrigger和CronTrigger两个子类代表两种方式,一种是每隔多少分钟小时执行,则用SimpleTrigger;另一种是日历相关的重复时间间隔,如每天凌晨,每周星期一运行的话,通过Cron表达式便可定义出复杂的调度方案。
3. Scheduler: 代表一个Quartz的独立运行容器,Trigger和JobDetail要注册到Scheduler中才会生效,也就是让调度器知道有哪些触发器和任务,才能进行按规则进行调度任务。

xml配置JobDetail通过 MethodInvokeJobDetailFactoryBean实现(熟悉)

实现定时任务需要导的包
在这里插入图片描述

在开启任务之前,先做好一些准备工作;
所谓定时任务,得现有任务,才能定时,所以先建一个任务类MyJob.java

public class MyJob {
     public void sendMail() {
          System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss" + "开始执行任务").format(new Date()));
     }
}

创建好任务类后,它仅仅只是一个类,并不是一个任务,要想让他成为真正可执行的任务,就需要给这个类创建一个对象,给它设一个定时器对象;一看到创对象就要想到IOC容器,所以需要在配置文件中声明任务对象;并把它放入JobDetail中,用于描述任务,于是就需要配置JobDetail,让定时任务知道,执行哪个任务,里面有两个参数,一个是目标对象targetObject,一个是目标方法targetMethod

声明任务类对象后,要把它放入触发器对象中,就需要创建一个触发器对象,触发器对象中要表明触发哪个任务, 以及遵循什么样的时间规则;
触发器声明好后,就需要放入调度器中进行任务调度;
由以上的分析可以得到配置文件的写法:以下为配置文件;这些文件都是写死的,不需要刻意去理解每一个类是什么,记住就行;

<bean id="myJob" class="com.young.bean.MyJob"></bean>


<!-- 配置JobDetail 让定时任务知道要执行  myJob里面的哪一个方法-->
<bean id="jobDetail" 
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean" >
     <property name="targetObject" ref="myJob"></property>
     <property name="targetMethod" value="sendMail"></property>
</bean>

<!-- 配置trigger触发器 -->
<bean id="cronTriggerFactoryBean" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
     <!-- 注入任务 -->
     <property name="jobDetail" ref="jobDetail"></property>
     <!-- 注入时间规则,执行时间,每隔5s执行一次 -->
     <property name="cronExpression" value="0/5 * * * * ?"></property>
</bean>

<!-- 声明调度器 -->
<bean id="springJobSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
     <property name="triggers">
          <ref bean="cronTriggerFactoryBean"/>
     </property>
</bean>

xml配置JobDetail通过JobDetailBean实现(推荐)

大致与第一种放一样,任务类需要继承QuartzJobBean类,并实现它的方法

public class MyJob extends QuartzJobBean{
     @Override
     protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException {
          System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss" + "开始执行任务").format(new Date()));
     }
}

只不过第JobDetail的实现方式不一样而已,所以只需要修改配置文件即可;
JobDetail通过JobDetailBean实现的方式,不要单独声明任务类对象;这种方式配置的JobDetai有两个参数,一个是jobClass,顾名思义就是任务类的路径,另一个是durability,即是否重复执行,定时任务如果只执行一次,则设为false,如果需要多次执行,则设为true;
配置文件中的其他部分都是一样的

<bean id="jobDetail" 
class="org.springframework.scheduling.quartz.JobDetailFactoryBean" >

     <property name="jobClass" 
value="com.young.bean.MyJob"></property>

     <property name="durability" value="true"></property>

</bean>



<!-- 配置trigger触发器 -->
<bean id="cronTriggerFactoryBean" 
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
     <!-- 注入任务 -->
     <property name="jobDetail" ref="jobDetail"></property>
     <!-- 注入时间规则,执行时间,每隔5s执行一次 -->
     <property name="cronExpression" value="0/5 * * * * ?"></property>
</bean>

<!-- 声明调度器 -->
<bean id="springJobSchedulerFactoryBean" 
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
     <property name="triggers">
          <ref bean="cronTriggerFactoryBean"/>
     </property>
</bean>

注解实现定时任务(重点,因为最简单)

创键任务类

@Component
@EnableScheduling // 启动定时任务(有了这个注解,和配置文件中的<task:annotation-driven/>功能一样,有了它就不用在配置文件中写这条语句了)
public class SendEmail {
     @Scheduled(cron="0/5 * * * * ? ")
     public void headFile() {
          System.out.println("给小美发送邮件");
          System.out.println("===");
     }
     @Scheduled(cron="0/3 * * * * ? ")
     public void write() {
         System.out.println("往后余生都是你");
     }
}

介绍一下上面的流程:
@Component的作用是创建对象,它创建了任务对象
创建任务对象后,@EnableScheduling启动定时任务,
@Scheduled设定了方法执行的间隔时间;其括号的值是cron表达式,代表定时的方式
这些都有了,就只需要扫描类中的注解即可
配置文件如下:

<context:component-scan base-package="com.young.bean"></context:component-scan>

测试:
测试只需加载配置文件即可

public class Test {
     public static void main(String[] args) {
          ApplicationContext app = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
     }
}

cron表达式

cron表达式表示需要间隔的时长,比如每隔5秒钟执行一次,每隔一年执行一次等等;
这个表达式不用特意去研究怎么写,因为可以生成;
点击这个网址就可以看到cron表达式生成器了:http://cron.qqe2.com/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值