定时器配置

本文介绍了Spring中两种定时器的配置方法,包括基于Java Timer和Quartz。通过示例展示了如何在Spring中配置定时任务,详细阐述了各自的启动方式和触发策略。同时,对Quartz的CronTriggerBean进行了解析,提供了Cron表达式的常见示例。

Spring定时器,主要有两种实现方式,包括Java Timer定时和Quartz定时器!

 

1.Java Timer定时

首先继承java.util.TimerTask类实现run方法

package com.land;

import java.util.Date;
import java.util.TimerTask;


public class TimerTest extends  TimerTask  {

 @Override
 public void run() {
  // TODO Auto-generated method stub
  System.out.println("TimerTest"+(new Date()).toString());

 }

}

Spring配置

<bean id="TimerTest"      class="com.land.TimerTest">
</bean>

<bean id="TimerTestTask"     class="org.springframework.scheduling.timer.ScheduledTimerTask">
    <!-- wait 10 seconds before starting repeated execution -->
    <property name="delay" value="10000" /><!-- 启动后的延迟时间-->
    <!--间隔时间-->
    <property name="period" value="72000" />
    <property name="timerTask" ref="TimerTest" />
</bean>


<bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean">
   <property name="scheduledTimerTasks">
       <list>
           <!-- see the example above -->
           <ref bean="TimerTestTask" />
       </list>
   </property>
</bean>

 

2.Quartz定时器

首先继承QuartzJobBean类实现executeInternal方法
public class SchedulerTest   extends QuartzJobBean{

 @Override
 protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException {
  // TODO Auto-generated method stub
  //System.out.println("-----------");
  System.out.println("1111111"+(new Date()).toString());
 }

}

-------------------------------------------

public class SchedulerTest2   extends QuartzJobBean{

 @Override
 protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException {
  // TODO Auto-generated method stub
  //System.out.println("-----------");
  System.out.println("22222222"+(new Date()).toString());
 }

}

Spring配置

<bean id="SchedulerTask" class="org.springframework.scheduling.quartz.JobDetailBean">
  <property name="jobClass">
   <value>com.land.SchedulerTest</value>
  </property>
 </bean>
 <bean id="SchedulerTask2" class="org.springframework.scheduling.quartz.JobDetailBean">
  <property name="jobClass">
   <value>com.land.SchedulerTest2</value>
  </property>
 </bean>
<bean id="SchedulerTaskTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
  <property name="jobDetail" ref="SchedulerTask" />
  <property name="cronExpression">
   <value>0/10 * * * * ?</value>
  </property>
 </bean>


 <bean id="SchedulerTaskTrigger2" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
  <property name="jobDetail" ref="SchedulerTask2" />
  <property name="startDelay">
   <value>1000</value><!--延迟时间-->
  </property>
  <property name="repeatInterval">
   <value>20000</value><!--间隔时间-->
  </property>
 </bean>

 

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
  <property name="triggers">
   <list>
    <ref bean="SchedulerTaskTrigger" />
    <ref bean="SchedulerTaskTrigger2" />
   </list>
  </property>
 </bean>

 

3.其他说明

  Java Timer定时有一种配置启动的方org.springframework.scheduling.timer.ScheduledTimerTask,

Quartz定时器有两种配置启动的方式:org.springframework.scheduling.quartz.SimpleTriggerBean,org.springframework.scheduling.quartz.CronTriggerBean。

org.springframework.scheduling.quartz.CronTriggerBean

Linux系统的计划任务通常有cron来承担。从左到右

字段            允许值            允许的特殊字符
  秒               0-59                 , - * /
  分               0-59                 , - * /
小时              0-23                 , - * /
日期              1-31                 , - * ? / L W C
月份       1-12 或者 JAN-DEC      , - * /
星期       1-7 或者 SUN-SAT      , - * ? / L C #
年(可选)  留空, 1970-2099      , - * /


   表达式                    意义
"0 0 12 * * ?"    每天中午12点触发
"0 15 10 ? * *"    每天上午10:15触发
"0 15 10 * * ?"    每天上午10:15触发
"0 15 10 * * ? *"    每天上午10:15触发
"0 15 10 * * ? 2005"    2005年的每天上午10:15触发
"0 * 14 * * ?"    在每天下午2点到下午2:59期间的每1分钟触发
"0 0/5 14 * * ?"    在每天下午2点到下午2:55期间的每5分钟触发
"0 0/5 14,18 * * ?"    在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0-5 14 * * ?"    在每天下午2点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED"    每年三月的星期三的下午2:10和2:44触发
"0 15 10 ? * MON-FRI"    周一至周五的上午10:15触发
"0 15 10 15 * ?"    每月15日上午10:15触发
"0 15 10 L * ?"    每月最后一日的上午10:15触发
"0 15 10 ? * 6L"    每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L 2002-2005"    2002年至2005年的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3"    每月的第三个星期五上午10:15触发

 
特殊字符   意义
*    表示所有值;
?    表示未说明的值,即不关心它为何值;
-    表示一个指定的范围;
,    表示附加一个可能值;
/    符号前表示开始时间,符号后表示每次递增的值;
L("last")    ("last") "L" 用在day-of-month字段意思是 "这个月最后一天";用在 day-of-week字段, 它简单意思是 "7" or "SAT"。如果在day-of-week字段里和数字联合使用,它的意思就是 "这个月的最后一个星期几" – 例如: "6L" means "这个月的最后一个星期五". 当我们用“L”时,不指明一个列表值或者范围是很重要的,不然的话,我们会得到一些意想不到的结果。
W("weekday")    只能用在day-of-month字段。用来描叙最接近指定天的工作日(周一到周五)。例如:在day-of-month字段用“15W”指“最接近这个月第15天的工作日”,即如果这个月第15天是周六,那么触发器将会在这个月第14天即周五触发;如果这个月第15天是周日,那么触发器将会在这个月第16 天即周一触发;如果这个月第15天是周二,那么就在触发器这天触发。注意一点:这个用法只会在当前月计算值,不会越过当前月。“W”字符仅能在day- of-month指明一天,不能是一个范围或列表。也可以用“LW”来指定这个月的最后一个工作日。
#    只能用在day-of-week字段。用来指定这个月的第几个周几。例:在day-of-week字段用"6#3"指这个月第3个周五(6指周五,3指第3个)。如果指定的日期不存在,触发器就不会触发。
C    指和calendar联系后计算过的值。例:在day-of-month 字段用“5C”指在这个月第5天或之后包括calendar的第一天;在day-of-week字段用“1C”指在这周日或之后包括calendar的第一天。
在MONTH和Day Of Week字段里对字母大小写不敏感

提供的引用内容未涉及esp32定时器配置方法,下面是一般情况下esp32定时器配置的步骤和示例代码: #### 配置步骤 1. **初始化定时器**:选择要使用的定时器,并设置其基本参数,如定时器的分辨率、计数器模式等。 2. **设置定时器回调函数**:当定时器达到设定的计数值时,会触发回调函数,可在回调函数中执行相应的操作。 3. **启动定时器**:完成配置后,启动定时器使其开始工作。 #### 示例代码 ```c #include "driver/timer.h" // 定时器回调函数 bool IRAM_ATTR timer_group_isr_callback(void *args) { // 在这里添加定时器触发时要执行的代码 return true; } void timer_configuration() { // 定时器配置结构体 timer_config_t config = { .divider = 80, // 定时器分频系数,这里设置为80,定时器时钟频率为1MHz .counter_dir = TIMER_COUNT_UP, // 计数器向上计数 .counter_en = TIMER_PAUSE, // 初始时暂停计数器 .alarm_en = TIMER_ALARM_EN, // 使能定时器报警 .auto_reload = true, // 定时器自动重载 }; // 选择定时器组和定时器编号 timer_group_t timer_group = TIMER_GROUP_0; timer_idx_t timer_idx = TIMER_0; // 初始化定时器 timer_init(timer_group, timer_idx, &config); // 设置定时器报警值 timer_set_alarm_value(timer_group, timer_idx, 1000000); // 定时器每1秒触发一次 // 使能定时器报警 timer_enable_intr(timer_group, timer_idx); // 注册定时器中断回调函数 timer_isr_callback_add(timer_group, timer_idx, timer_group_isr_callback, NULL, 0); // 启动定时器 timer_start(timer_group, timer_idx); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值