SpringBoot项目中,定时任务默认是串行执行的,不论启动多少任务,都是一个执行完成,再执行下一个。
如何设置并行呢? @EnableAsync 和@Async 这两个注解来实现 ,具体如下:
pom文件
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>mydemo</artifactId> <groupId>com.itstudy</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>mvcdemo</artifactId> <name>mvcdemo</name> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.30</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>1.5.9.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
启动文件App.java
@EnableScheduling @EnableAsync @SpringBootApplication public class App { public static void main( String[] args ) { System.out.println( "Hello World!" ); SpringApplication app = new SpringApplication(App.class); //关闭banner app.setBannerMode(Banner.Mode.OFF); app.run(args); } }
@Service @Async public class TaskSecond { private Logger logger = LoggerFactory.getLogger(TaskSecond.class); //@Scheduled( cron = "0/2 * * * * * ") @Scheduled(fixedDelay = 20000,initialDelay = 2000) public void test(){ try { logger.info(" second start"); TimeUnit.SECONDS.sleep(10); logger.info(" second end"); } catch (InterruptedException e) { e.printStackTrace(); } } }
@Service @Async public class TaskFirst { private Logger logger = LoggerFactory.getLogger(TaskSecond.class); //@Scheduled( cron = "0/2 * * * * * ") @Scheduled(fixedDelay = 20000,initialDelay = 2000) public void test(){ try { logger.info(" first start"); TimeUnit.SECONDS.sleep(10); logger.info(" first end"); } catch (InterruptedException e) { e.printStackTrace(); } } }