SSM整合Quart和Springboot整合Quartz组件

1】使用我们的这个ssm去整合我们的这个定时任务

1.Quartz的依赖

<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.1</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz-jobs</artifactId> <version>2.2.1</version> </dependency>

2.在ssm中的定时任务的这个xml配置文件

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 注册自定义Job --> <bean id="jobDemo" class="com.itheima.jobs.JobDemo"></bean> <!-- 注册JobDetail,作用是负责通过反射调用指定的Job --> <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!-- 注入目标对象 --> <property name="targetObject" ref="jobDemo"/> <!-- 注入目标方法 --> <property name="targetMethod" value="run"/> </bean> <!-- 注册一个触发器,指定任务触发的时间 --> <bean id="myTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <!-- 注入JobDetail --> <property name="jobDetail" ref="jobDetail"/> <!-- 指定触发的时间,基于Cron表达式 --> <property name="cronExpression"> <value>0/10 * * * * ?</value> </property> </bean> <!-- 注册一个统一的调度工厂,通过这个调度工厂调度任务 --> <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <!-- 注入多个触发器 --> <property name="triggers"> <list> <ref bean="myTrigger"/> </list> </property> </bean> </beans>

3.定时任务的表达式

上面的入门案例中我们指定了一个表达式:0/10 * * * * ?

这种表达式称为cron表达式,通过cron表达式可以灵活的定义出符合要求的程序执行的时间。本小节我们就来学习一下cron表达式的使用方法。如下图:

cron表达式分为七个域,之间使用空格分隔。其中最后一个域(年)可以为空。每个域都有自己允许的值和一些特殊字符构成。使用这些特殊字符可以使我们定义的表达式更加灵活。

下面是对这些特殊字符的介绍:

逗号(,):指定一个值列表,例如使用在月域上1,4,5,7表示1月、4月、5月和7月

横杠(-):指定一个范围,例如在时域上3-6表示3点到6点(即3点、4点、5点、6点)

星号(*):表示这个域上包含所有合法的值。例如,在月份域上使用星号意味着每个月都会触发

斜线(/):表示递增,例如使用在秒域上0/15表示每15秒

问号(?):只能用在日和周域上,但是不能在这两个域上同时使用。表示不指定

井号(#):只能使用在周域上,用于指定月份中的第几周的哪一天,例如6#3,意思是某月的第三个周五 (6=星期五,3意味着月份中的第三周)

L:某域上允许的最后一个值。只能使用在日和周域上。当用在日域上,表示的是在月域上指定的月份的最后一天。用于周域上时,表示周的最后一天,就是星期六

W:W 字符代表着工作日 (星期一到星期五),只能用在日域上,它用来指定离指定日的最近的一个工作日

【2】使用我们的Springboot去整合我们的这个定时任务

首先我们需要在我们的这个Springbootd的启动类上面去添加我的这个方法上面去添加一个@EnableSheduling来开启这个定时任务,然后我们可以在我们的这个业务方法上面去添加一个@Scheduled(fixedRate=3000)这个的参数是指温度这个毫秒为单位

主程序类

pom依赖

<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.2.1</version>
</dependency>
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz-jobs</artifactId>
    <version>2.2.1</version>
</dependency>

然后我们在Springboot的主程序类中添加开启定时任务的组件

@SpringBootApplication
@EnableScheduling
public class RedissApplication { 
    public static void main(String[] args) {
        SpringApplication.run(RedissApplication.class, args);
    }
}

我们的使用定时任务来指定执行某一个方法,然后就会每个1000毫秒的单位去执,注意我的这个类一定要去使用@Component的这个注解,纳入我们的这个Spring的管理,最后去启动我们的结果如下图

@Component
public class Quatrz {
    int i =0;
    @Scheduled(fixedRate = 1000)
    public void index(){
        System.out.println("当前是第"+(i++)+"次执行任务");
    }
}

 然后我们去分析一下@Scheduled的底层的源码,我把他复制下来了,我们也可以直接去分析底层的源码

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
public @interface Scheduled { 
    
   String CRON_DISABLED = ScheduledTaskRegistrar.CRON_DISABLED;

     /**
     *这个主要是用来通过cron表达式来实现定时任务的定时时间
     *
     */
   String cron() default "";

   
   String zone() default "";

    
   long fixedDelay() default -1;

    
   String fixedDelayString() default "";

  /**
  * 这个主要是用来通过我的这个毫秒来规定我的这个定时任务的定时时间
  */
   long fixedRate() default -1;
 /**
  * 这个和fixedRate相似,就是说我的这个值是字符串类型
  *最重要的是他是支持我们的这个占位符的
  */
   String fixedRateString() default "";

   /**
   * 这个就是我从多少秒钟之后我就可以通过
   */
   long initialDelay() default -1;

   
   String initialDelayString() default "";

其实我们在使用定时任务的时候它里面还存在一个锁的机制,如果说在多台服务器同时弄了定时任务,那么我们可以通过一个定时任务的锁去解决这个问题,这个是一个面试常问的题目

Springboot的启动类

@SpringBootConfiguration
@EnableAutoConfiguration
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = "PT30M")
@ComponentScan(basePackages = {"com.gjh.rediss"})
public class RedissApplication {

    public static void main(String[] args) {
        SpringApplication.run(RedissApplication.class, args);
    }
}

定时任务的配置类

@Component
public class Quatrz {
    int i =0;
    @Scheduled(fixedRate = 1000 * 30)//通过使用cron来进行定时
    //lockAtLeastFor我的这个定时任务锁的最少时间
    //lockAtMostFor 我的这个定时任务锁的最短时间
    @SchedulerLock(name = "TaskScheduler_scheduledTask", lockAtLeastForString = "PT5M", lockAtMostForString = "PT14M")
    @Bean
    public void index(){
        try {
            Thread.sleep(8000);//进行线程睡眠模拟高并发
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("当前是第"+(i++)+"次执行任务");
    }
}

注意在这里我们的这个maven的版本一定要注意,我现在就是应为这个版本的问题还没有解决,下次再更新

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值