spring task定时任务实现

1. task与Quartz区别

    Spring从3.0开始增加了自己的任务调度器,它是通过扩展java.util.concurrent包下面的类来实现的,它也使用Cron表达式。
    对于Quartz,我们使用的时候主要是注重两个方面,一个是定时任务的业务,另一个就是Cron表达式。定时任务跟具体的业务相关,这无需多说,这里只说明表达式含义及其写法。
    简单的来说task是Quartz的轻量级封装。task不需要而外引入jar包,完全依赖与spring 相关jar.

2. task有两种配置方式,一种是依赖配置文件,第二种是注解实现;

 1.第一种方式大家可以参考一下其他的,主要讲解第二种配置方式,因为比较简介,迅速;
 2.第二种方式:可以直接在spring配置文件中增加命名空间task ;
 `<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans    
                    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd    
                    http://www.springframework.org/schema/context    
                    http://www.springframework.org/schema/context/spring-context-3.1.xsd    
                    http://www.springframework.org/schema/mvc    
                    http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
                    http://www.springframework.org/schema/tx 
                    http://www.springframework.org/schema/tx/spring-tx-3.2.xsd 
                    http://www.springframework.org/schema/aop 
                    http://www.springframework.org/schema/aop/spring-aop.xsd
                    http://www.springframework.org/schema/task 
                    http://www.springframework.org/schema/task/spring-task.xsd">`

3. 第二步 :

`   <!-- 自动扫描的包名 -->
    <context:component-scan base-package="com.meyacom" />
    <!-- 如果定时任务很多,可以配置executor线程池,这里executor的含义和java.util.concurrent.Executor是一样的,pool-size的大小官方推荐为5~10。scheduler的pool-size是ScheduledExecutorService线程池, -->
<!--    <task:executor id="executor" pool-size="10" /> -->
    <!-- 定时任务前缀 -->
<!--    <task:scheduler id="scheduler" pool-size="10" /> -->
    <!-- 定时器开关 -->
    <task:annotation-driven  executor="executor"
        scheduler="scheduler"/>`


        <!--或者使用一下代码 配置线程池-->
            <!-- 自动扫描的包名 -->
    <context:component-scan base-package="com.meyacom" />
    <!-- 如果定时任务很多,可以配置executor线程池,这里executor的含义和
    <!-- 定时任务前缀 -->
    <task:scheduler id="scheduler" pool-size="${task.core_pool_size}" />
    <!-- 定时器开关 -->
    <task:annotation-driven executor="taskExecutor"
        scheduler="scheduler" />

    <!-- task 引入配置文件 -->
    <!-- 配置在jdbc.properties文件中 -->

    <!-- 如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。 如果此时线程池中的数量等于 
        corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。 
        如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 
        handler所指定的策略来处理此任务。也就是:处理任务的优先级为:核心线程corePoolSize、任务队列workQueue、最大线程 maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。 
        当线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。 -->
    <!-- 线程池 -->
    <bean id="taskExecutor"
    class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    <!-- 核心线程数 -->

    <property name="corePoolSize" value="${task.core_pool_size}" />
    <!-- 最大线程数 -->

    <property name="maxPoolSize" value="${task.max_pool_size}" />
    <!-- 队列最大长度 线程池所使用的缓冲队列 -->

    <property name="queueCapacity" value="${task.queue_capacity}" />
    <!-- 线程池维护线程所允许的空闲时间,默认为60s -->

     <property name="keepAliveSeconds" value="${task.keep_alive_seconds}" 
        /> 
    </bean>

第3步:task 数据,配置在jdbc.properties中

#------------ Task ------------
task.core_pool_size=10
task.max_pool_size=50
task.queue_capacity=1000
task.keep_alive_seconds=60

第四步 :编写测试方法

@Service
@Component
public class TaskServiceImpl implements TaskService{

    @Scheduled(cron="0/5 * *  * * ? ")   //每5秒执行一次  
    @Override
    public void myTest() {
        // TODO Auto-generated method stub      
        System.out.println(Thread.currentThread().getThreadGroup()+" "+Thread.currentThread().getName()+" "+"定时任务一:mytest1--------------------------开始");
    }

    @Scheduled(cron="0/5 * *  * * ? ")   //每5秒执行一次  
    @Override
    public void myTest2() {
        // TODO Auto-generated method stub
        System.out.println(Thread.currentThread().getName()+" "+"定时任务二:mytest2--------------------------开始");
    }

    @Scheduled(cron="0/5 * *  * * ? ")   //每5秒执行一次  
    @Override
    public void myTest3() {
        // TODO Auto-generated method stub
        System.out.println(Thread.currentThread().getName()+" "+"定时任务三:mytest3--------------------------开始");
    }

}

第五步:测试结果 ##

java.lang.ThreadGroup[name=main,maxpri=10] scheduler-3 定时任务一:mytest1--------------------------开始
scheduler-1 定时任务二:mytest2--------------------------开始
java.lang.ThreadGroup[name=main,maxpri=10] scheduler-6 定时任务一:mytest1--------------------------开始
scheduler-4 定时任务三:mytest3--------------------------开始
java.lang.ThreadGroup[name=main,maxpri=10] scheduler-4 定时任务一:mytest1--------------------------开始
scheduler-3 定时任务三:mytest3--------------------------开始
scheduler-2 定时任务二:mytest2--------------------------开始
scheduler-10 定时任务二:mytest2--------------------------开始
java.lang.ThreadGroup[name=main,maxpri=10] scheduler-6 定时任务一:mytest1--------------------------开始
scheduler-9 定时任务三:mytest3--------------------------开始
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
SpringTaskSpring框架提供的一个用于实现定时任务的模块。它可以帮助开发者在应用中创建、调度和管理定时任务。 要使用SpringTask,首先需要在Spring配置文件中配置一个任务调度器。可以使用`@EnableScheduling`注解来启用SpringTask,并且在需要执行定时任务的方法上使用`@Scheduled`注解来指定任务的触发条件。 例如,下面的代码展示了一个简单的定时任务配置: ```java import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component @EnableScheduling public class MyTask { @Scheduled(fixedRate = 5000) // 每隔5秒执行一次任务 public void myTask() { // 执行定时任务的逻辑代码 System.out.println("定时任务执行中..."); } } ``` 在上述代码中,使用`@Component`注解将`MyTask`类注册为Spring的组件,并使用`@EnableScheduling`注解启用SpringTask。然后,在`myTask()`方法上使用`@Scheduled`注解指定了定时任务的触发条件,这里是每隔5秒执行一次。 通过以上配置,当应用启动后,定时任务就会按照指定的触发条件自动执行。 除了`fixedRate`之外,`@Scheduled`注解还支持其他的触发条件配置,如`fixedDelay`、`cron`等,开发者可以根据具体需求选择合适的触发条件。 希望以上内容对你有帮助,如果还有其他问题,请随时提出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风中思絮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值