Springboot2.1(6) 超简单的定时任务,及War包运行

《回顾》

上一篇,说了Swagger-UI和自定义日志,从现在开始,以后的演示项目,都这样用了。

 

本篇,说下定时任务,说下怎么把SpringBoot项目编译成War包的形式运行。是的,我们堂堂程序员不仅有双肩包,还有Jar包,War包。

 

一、定时任务

 

不知道你是否还在使用代码一坨又一坨的XML来配置定时任务?如果是,那这一篇你不能放过。

定时任务,属于SpringBoot自带的功能,在spring-boot-starter-web 中,所以无需额外添加依赖。

具体一些,它在spring-context 包中,依赖关系了解下。

Springboot2.1(6) 超简单的定时任务,及War包运行

 

 

1、启用定时任务

@SpringBootApplication
@EnableScheduling // 开启定时任务
public class Springbootz06Application {

中间那行

 

2、编写定时任务工作类

@Component
public class DemoJob {

   private Logger log = LoggerFactory.getLogger(getClass());

   // 自本次开始,每10秒执行一次
   @Scheduled(fixedRate = 10000)
   public void fixedRate() {
       log.info(" ** fixedRate,运行..{} ",new Date());
   }

   // 自本次结束,每10秒执行一次
   @Scheduled(fixedDelay = 10000)
   public void fixedDelay() {
       log.info(" ** fixedDelay,运行..{} ",new Date());
   }

   // 第一次延迟1秒执行,当执行完后每2秒再执行
   @Scheduled(initialDelay = 1000, fixedDelay = 2000)
   public void delay() {
       log.info(" ** delay,运行..{}", new Date());
   }

   //每天10点54分00秒时执行
   @Scheduled(cron = "00 38 20 * * ?")
   public void cron() {
       log.info(" ** cron,运行..{}", new Date());
   }
}

首先,注意下@Component 。它表示,这个类就交给Spring请管理了。

 

定时任务相关注解说明:

@Scheduled 将当前方法注解为定时任务,它包含以下参数:

cron:crontab表达式(用的最多的一个)。

* * * * * * :分别对应,秒、分、时、日、月、年  
0 0 10,14,16 * * ? :每天上午10点,下午2点,4点 ,逗号之间连接起来算一个
0 0 12 * * ?        :每天中午12点触发 
0 0/5 0 * * ?      :每5分钟执行一次

fixedRate:上一次 启动时间点之后X秒执行一次,单位毫秒

fixedDelay:上一次 结束时间点之后每X秒执行一次,单位毫秒

initialDelay:第一次延迟X秒执行,之后按照fixedRate的规则每X秒执行,单位毫秒

  •  @Scheduled(fixedRate = 10000) :自上一次开始执行时间点,之后每10秒执行一次

  •  @Scheduled(fixedDelay = 10000) :自上一次执行完毕时间点,之后每10秒执行一次

  •  @Scheduled(initialDelay = 1000, fixedDelay = 2000) :第一次延迟1秒后执行,之后按fixedDelay的规则每2秒执行一次

  • @Scheduled(cron = "00 55 22 * * ?") :按照crontab表达式规则,执行一次。22点55分执行一次。

 

启动应用,查看运行效果:

Springboot2.1(6) 超简单的定时任务,及War包运行

定时任务就这些,你可以尽管放心的把它运行于线上。

 

二、打War包

在生产环境中,用Jar包的形式运行应用,有点不太妥当。Tomcat优化不那么方便,单个class处理也不那么方便,如果涉及到前端代码,那就有更多的不方便。

所以,还是用War包吧。

1、修改启动类 *Application.java

 

继承 SpringBootServletInitializer,

重写 configure() 方法

 

代码如下:

@SpringBootApplication
@EnableScheduling // 开启定时任务
public class Springbootz06Application extends SpringBootServletInitializer {
   @Override
   protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
       return application.sources(Springbootz06Application.class);
   }

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

 

2、修改 pom.xml

添加:

<packaging>war</packaging>

如果,pom中已经存在packaging,值是jar,修改成war即可。

如下代码:

<groupId>com.zhou</groupId>
<artifactId>springbootz06</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springbootz06</name>
<description>springboot2.1.1 定时任务,打War包</description>
<packaging>war</packaging>

最后那行

 

3、排除掉tomcat依赖

添加依赖:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-tomcat</artifactId>
   <scope>provided</scope>
</dependency>

 

4、打包

此处的打包方式和Jar包那片的步骤完全一致,我就不细细重复了。

Springboot2.1(6) 超简单的定时任务,及War包运行

 

将War包修改成自己想要的名字后,放入tomcat运行即可。

Springboot2.1(6) 超简单的定时任务,及War包运行

 

查看运行日志:

Springboot2.1(6) 超简单的定时任务,及War包运行

 

请注意你的环境变量或者Tomcat配置的JDK环境变量版本。本项目使用JDK11编译。

今天就到这吧。

 

 

博客内所有文章,每周从公众号同步一次。

文章源码均可从公众号获取。

如果您可以关注下,那就好了。

Springboot2.1(6) 超简单的定时任务,及War包运行