首页 文章资讯内容详情

【Spring】Spring的定时任务

2026-06-01 2 花语

本文内容纲要:

->参考的优秀文章 ->版本说明 ->搭建最简单的Spring定时任务工程 ->如果你同时执行多个任务,且某些任务耗时较长,要配线程池哦(>_<)

>参考的优秀文章

TaskExecutionandScheduling

>版本说明

<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>3.2.14.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.webflow</groupId> <artifactId>spring-webflow</artifactId> <version>2.3.4.RELEASE</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.1.0</version> </dependency> </dependencies>

>搭建最简单的Spring定时任务工程

Spring定时任务,给人的第一感觉就是简洁(>_<)

所需要的JAR,参考以上“版本说明”的POM文件,当然,不嫌麻烦,也可以一个个去下载。

把Spring通过web.xml注册进来

<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:spring/spring.xml</param-value> </context-param> <listener> <description>SpringContext</description> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>

当然,需要告诉Spring去哪儿扫描组件。对了,也要告诉Spring我们是使用注解方式注册任务的

<?xmlversion="1.0"encoding="UTF-8"?> <beansxmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.2.xsd http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd http://www.springframework.org/schema/taskhttp://www.springframework.org/schema/task/spring-task-3.2.xsd"> <context:component-scanbase-package="com.nicchagil.*"/> <task:annotation-driven/> </beans>

附logback的配置

<configuration> <appendername="STDOUT"class="ch.qos.logback.core.ConsoleAppender"> <!--encodersareassignedthetypech.qos.logback.classic.encoder.PatternLayoutEncoder bydefault--> <encoder> <pattern>%d{HH:mm:ss.SSS}[%thread]%-5level%logger{36}-%msg%n </pattern> </encoder> </appender> <appendername="FILE"class="ch.qos.logback.core.FileAppender"> <file>D:/logs/application.log</file> <encoder> <pattern>%d{HH:mm:ss.SSS}[%thread]%-5level%logger{36}-%msg%n </pattern> </encoder> </appender> <rootlevel="debug"> <appender-refref="STDOUT"/> <appender-refref="FILE"/> </root> </configuration>

好了,注册一个简单的任务,它每逢0秒执行,打印一个语句

packagecom.nicchagil.springtask; importorg.slf4j.Logger; importorg.slf4j.LoggerFactory; importorg.springframework.scheduling.annotation.Scheduled; importorg.springframework.stereotype.Component; @Component publicclassMyFirstSpringJob{ privatefinalLoggerlogger=LoggerFactory.getLogger(this.getClass()); @Scheduled(cron="0****?") publicvoidrun(){ logger.info("MyFirstSpringJobtrigger..."); } }

如无意外,启动项目后,可见日志大致如下

22:42:00.024[pool-1-thread-1]INFO c.n.springtask.MyFirstSpringJob-MyFirstSpringJobtrigger... 22:43:00.002[pool-1-thread-1]INFO c.n.springtask.MyFirstSpringJob-MyFirstSpringJobtrigger...

>如果你同时执行多个任务,且某些任务耗时较长,要配线程池哦(>_<)

如题。比如,你设置了12:00触发A任务、12:05触发B任务,如果A任务需耗时10分钟,并且没设置线程池,那么B任务有可能会被推迟到12:10以后再执行哦。

所以,这些情况,我们需设置线程池

<task:annotation-drivenscheduler="myScheduler"/> <task:schedulerid="myScheduler"pool-size="20"/>

:具体池的大小,视项目情况而定

将任务改为如下测试

第一个任务

packagecom.nicchagil.springtask; importjava.util.concurrent.TimeUnit; importorg.slf4j.Logger; importorg.slf4j.LoggerFactory; importorg.springframework.scheduling.annotation.Scheduled; importorg.springframework.stereotype.Component; @Component publicclassMyFirstSpringJob{ privatefinalLoggerlogger=LoggerFactory.getLogger(this.getClass()); @Scheduled(cron="0****?") publicvoidrun(){ logger.info("MyFirstSpringJobtrigger..."); /*模拟此Job需耗时5秒*/ try{ TimeUnit.SECONDS.sleep(5); }catch(InterruptedExceptione){ e.printStackTrace(); } } }

第二个任务

packagecom.nicchagil.springtask; importorg.slf4j.Logger; importorg.slf4j.LoggerFactory; importorg.springframework.scheduling.annotation.Scheduled; importorg.springframework.stereotype.Component; @Component publicclassMySecondSpringJob{ privatefinalLoggerlogger=LoggerFactory.getLogger(this.getClass()); @Scheduled(cron="3****?") publicvoidrun(){ logger.info("MySecondSpringJobtrigger..."); } }

由日志可以看出,第一个任务由一个线程执行;而第二个任务启动时,由于第一个任务还未完成,则由另外一个线程执行

22:49:00.023[myScheduler-1]INFOc.n.springtask.MyFirstSpringJob-MyFirstSpringJobtrigger... 22:49:03.002[myScheduler-2]INFOc.n.springtask.MySecondSpringJob-MySecondSpringJobtrigger...

本文内容总结:>参考的优秀文章,>版本说明,>搭建最简单的Spring定时任务工程,>如果你同时执行多个任务,且某些任务耗时较长,要配线程池哦(>_<),

原文链接:https://www.cnblogs.com/nick-huang/p/4864737.html