本篇文章小编给大家分享一下spring-boot实现单次执行程序代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
spring-boot 单次执行程序
spring-boot做为spring的集大成框架,大部分时候作为WEB服务被集成使用,但某些情况下,需要手动执行一些逻辑的情况下,单次运行的类似脚本的程序也是很有用的。
pom.xml
注意:pom.xml部分只需引入spring-boot-starter模块,尤其不要引入web模块,其他非spring本身模块可以随意引入
4.0.0 com.leon sprint-boot-task 0.0.1-SNAPSHOT UTF-8 UTF-8 1.8 org.springframework.boot spring-boot-starter 2.0.4 org.springframework.boot spring-boot-maven-plugin
主要代码结构
Service类
@Service public class StatService { public void doSomething() { System.out.println("===================: this is a test service but nothing"); } }
执行逻辑入口类
@Component public class StatTask { private StatService statService; @Autowired public StatTask(StatService statService) { this.statService = statService; } public void doSomething() { statService.doSomething(); } }
Spring-boot 启动类
@SpringBootApplication public class TaskApplication { public static void main(String[] args) { ConfigurableApplicationContext context = SpringApplication.run(TaskApplication.class, args); StatTask statTask = context.getBean(StatTask.class); // 获取逻辑入口类的实例 statTask.doSomething(); } }
如此这般后,启动这个springboot工程,执行完启动类中的调用过程后,程序就会自动退出。
基本上,不配置启用spring mvc和定时Job,这种配置下的springboot就是一个“脚本”程序。
这里举个?,上面的代码加上两个注解,就会变成常驻进程程序:
执行逻辑入口类
@Component public class StatTask { private StatService statService; @Autowired public StatTask(StatService statService) { this.statService = statService; } @Scheduled(fixedRate = 5000L) // --------------这里----------------- public void doSomething() { statService.doSomething(); } }
Spring-boot 启动类
@SpringBootApplication @EnableScheduling // --------------这里--------------- public class TaskApplication { public static void main(String[] args) { ConfigurableApplicationContext context = SpringApplication.run(TaskApplication.class, args); StatTask statTask = context.getBean(StatTask.class); statTask.doSomething(); } }
与最上面区别的是,上面只执行一次,输出 “this is a test service but nothing” 就完事了,进程自动退出,
加上两个注解后就会每5秒输出一次 “this is a test service but nothing”,且进程永驻。
当然这种情况下使用脚本语言如python、nodeJs等可能更好一些,但在其他语言不熟的情况下,使用spring-boot来应急也是极好的。
启动时执行单次任务
最近做任务遇到一个问题,需要在项目启动时候执行扫描数据库表的任务,用于异常恢复容灾,一开始想的是可不可以使用定时任务
代码如下 并且在启动类加上
@EnableScheduling注解就可以实现定时去执行任务了
package com.beihui.service.task; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component public class XXXTask { private Logger logger = LoggerFactory.getLogger(this.getClass()); @Scheduled(cron = "0 0 0 * * ?") public void bTask() { long startCurrentTime = System.currentTimeMillis(); logger.info("开始执行定时任务:" + startCurrentTime); //业务处理 long endTime = System.currentTimeMillis(); logger.info("定时任务:执行结束,花费时间" + (endTime - startCurrentTime)); } @Scheduled(cron = "0 */1 * * * ?") public void runUpdateDbTask() { long startCurrentTime = System.currentTimeMillis(); logger.info("开始执行更新数据库剩余次数定时任务:" + startCurrentTime); //业务处理 long endTime = System.currentTimeMillis(); logger.info("定时任务:执行结束,花费时间" + (endTime - startCurrentTime)); } @Scheduled(fixedDelay = 60 * 1000 * 10) public void cTask() { long startCurrentTime = System.currentTimeMillis(); //业务处理 long endTime = System.currentTimeMillis(); logger.info("定时任务:执行结束,花费时间" + (endTime - startCurrentTime)); } }
但是这个并不能单次执行任务,所以后来 使用listener
代码如下,并在启动类加上
@ServletComponentScan注解
package xx.xx.xx; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; @WebListener public class XXXListener implements ServletContextListener { private Logger logger = LoggerFactory.getLogger(this.getClass()); //项目启动执行 @Override public void contextInitialized(ServletContextEvent servletContextEvent) { long startTime = System.currentTimeMillis(); logger.info("开始执行启动任务,{}"+startTime); //业务处理 long endTime = System.currentTimeMillis(); logger.info("执行启动任务结束,共花费时间{}"+(startTime-endTime)); } //项目终止时执行 @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { } }
忍者必须死34399账号登录版 最新版v1.0.138v2.0.72
下载勇者秘境oppo版 安卓版v1.0.5
下载忍者必须死3一加版 最新版v1.0.138v2.0.72
下载绝世仙王官方正版 最新安卓版v1.0.49
下载Goat Simulator 3手机版 安卓版v1.0.8.2
Goat Simulator 3手机版是一个非常有趣的模拟游
Goat Simulator 3国际服 安卓版v1.0.8.2
Goat Simulator 3国际版是一个非常有趣的山羊模
烟花燃放模拟器中文版 2025最新版v1.0
烟花燃放模拟器是款仿真的烟花绽放模拟器类型单机小游戏,全方位
我的世界动漫世界 手机版v友y整合
我的世界动漫世界模组整合包是一款加入了动漫元素的素材整合包,
我的世界贝爷生存整合包 最新版v隔壁老王
我的世界MITE贝爷生存整合包是一款根据原版MC制作的魔改整