SpringBoot系统启动任务(三十二)的方式(上)

简介: SpringBoot系统启动任务(三十二)的方式(上)

一. 系统启动时执行定时任务

一.一 服务启动后执行定时任务

在系统启动时,我们常常需要初始化一些数据,如构造出必要的数据,将数据库中的某些数据提前写入到缓存里面,获取当前服务器的相关信息等。

@SpringBootApplication
public class InitApplication {
    public static void main(String[] args) {
        SpringApplication.run(InitApplication.class,args);
        System.out.println(">>>>>>>项目启动成功");
        //执行初始化数据.
        initData();
    }
    public static void initData(){
        System.out.println("静态方法初始化数据");
    }
}


这样的操作, initData() 并不是系统启动时执行的定时任务,而是系统启动后执行的.

image.png



这样写,当不牵扯到组件 @Component 相关的注解方法时,也就是说只有简单的方法处理时,虽然可以进行初始化数据,但不规范,一般不采用这种方式处理.


本章节代码层次结构如下:


image.png


定义一个接口和一个实现


UserService 接口

public interface UserService {
    public void set();
    public void get();
}


UserServiceImpl 实现

@Service
public class UserServiceImpl implements UserService {
    @Override
    public void set() {
        System.out.println("UserService--->set值");
    }
    @Override
    public void get() {
        System.out.println("UserService--->取出值");
    }
}


一.二 Listener 监听器执行定时任务

在 JSP /Servlet 时,我们常常使用 Listener 监听器来初始化数据.


SpringBoot 也支持这种形式.

一.二.一 事件监听器 InitListener

在 listener 包下创建事件监听器

package top.yueshushu.init.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
 * @ClassName:InitListener
 * @Description 监听器
 * @Author zk_yjl
 * @Date 2021/11/30 9:00
 * @Version 1.0
 * @Since 1.0
 **/
public class InitListener implements ServletContextListener {
    /**
      容器启动时
     */
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        //初始化必要的数据. 常于构建缓存,初始化数据.
        System.out.println(">>>>Listener,容器启动,初始化必要的数据");
    }
    /**
     容器突然销毁时
     */
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        //容器关闭了,进行数据备份的处理.
        System.out.println(">>>>Listener,容器销毁,将重要数据备份");
    }
}


一.二.二 启动添加 Listener

@SpringBootApplication
public class InitApplication {
    public static void main(String[] args) {
        SpringApplication.run(InitApplication.class,args);
        System.out.println(">>>>>>>项目启动成功");
        //执行初始化数据.
       // initData();
    }
   /* public static void initData(){
        System.out.println("静态方法初始化数据");
    }
*/
    /**
     * 添加Listener
     * @date 2021/11/30 9:03
     * @author zk_yjl
     * @return
     */
    @Bean
    public ServletListenerRegistrationBean<InitListener> initListenerServletListenerRegistrationBean(){
        ServletListenerRegistrationBean<InitListener> registrationBean=new ServletListenerRegistrationBean<>(
                new InitListener()
        );
        return registrationBean;
    }
}



在项目启动之前执行了,初始化 ExecutorService 之前.


二. SpringBoot 系统启动任务

通常使用 CommandLineRunner , ApplicationRunner , 和 @PostConstruct三种方式进行处理


关于参数的使用,可以参考江南一点雨大神的这篇文章.


二.一 CommandLineRunner 方式

如启动时,获取机器码


二.一.一 获取机器码的工具类 HardwareUtil

package top.yueshushu.init.util;
import lombok.extern.log4j.Log4j2;
import org.springframework.util.StringUtils;
import java.io.IOException;
import java.io.InputStream;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.List;
import java.util.Scanner;
@Log4j2
public class HardwareUtil {
    private static final String[] getCpuIdWindows = {"wmic", "cpu", "get", "ProcessorId"};
    private static String cpuId;
    public static String getCpuId() {
        try{
            String osName = getOsName();
            String cpuId = null;
            if (osName.toLowerCase().contains("linux")) {
                cpuId = getSerialNumber("dmidecode -t processor | grep 'ID'", "ID", ":");
            } else if (osName.toLowerCase().contains("windows")) {
                cpuId = getWindowsCpuId();
            }
            return !StringUtils.hasText(cpuId)?"1020304050607080":cpuId;
        }catch (Exception e){
            log.error("生成CpuId错误",e);
            return "1020304050607080";
        }
    }
    private static String getWindowsCpuId() {
        try {
            Process process = Runtime.getRuntime().exec(getCpuIdWindows);
            process.getOutputStream().close();
            Scanner sc = new Scanner(process.getInputStream());
            String property = sc.next();
            String serial = sc.next();
            log.info(property + ": " + serial);
            return serial;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            log.error("发生异常", e);
        }
        return null;
    }
    public static String getMac() {
        NetworkInterface networkInterface = getRealNetworkInterface();
        try {
            if (networkInterface == null) {
                return null;
            }
            byte[] mac = networkInterface.getHardwareAddress();
            return buildMac(mac);
        } catch (SocketException e) {
            log.error("发生异常{}", e);
        }
        return null;
    }
    public static String getServerId() {
        return buildServerId(getIpAddress());
    }
    private static String getIpAddress() {
        NetworkInterface networkInterface = HardwareUtil.getRealNetworkInterface();
        return networkInterface.getInterfaceAddresses().get(0).getAddress().getHostAddress();
    }
    private static NetworkInterface getRealNetworkInterface() {
        try {
            //枚举本机所有的网络接口
            Enumeration<NetworkInterface> allNetInterfaces = NetworkInterface.getNetworkInterfaces();
            while (allNetInterfaces.hasMoreElements()) {
                NetworkInterface netInterface = allNetInterfaces.nextElement();
                // 去除回环接口,子接口,未运行和接口
                if (netInterface.isLoopback() || netInterface.isVirtual() || !netInterface.isUp()) {
                    continue;
                }
                return netInterface;
            }
        } catch (SocketException e) {
            System.err.println("Error when getting host ip address" + e.getMessage());
        }
        return null;
    }
    private static String buildServerId(String address) {
        List<String> ips = Arrays.asList(address.split("\\."));
        return ips.stream().mapToInt(Integer::parseInt).boxed().map(Object::toString).reduce("", String::concat);
    }
    private static String buildMac(byte[] mac) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < mac.length; i++) {
            if (i != 0) {
                sb.append("-");
            }
            String s = Integer.toHexString(mac[i] & 0xFF);
            sb.append(s.length() == 1 ? 0 + s : s);
        }
        return sb.toString().toUpperCase();
    }
    private static String getOsName() {
        return System.getProperty("os.name");
    }
    private static String getSerialNumber(String cmd, String record, String symbol) {
        String execResult = executeLinuxCmd(cmd);
        String[] infos = execResult.split("\n");
        for (String info : infos) {
            info = info.trim();
            if (info.contains(record)) {
                info.replace(" ", "");
                String[] sn = info.split(symbol);
                return sn[1];
            }
        }
        return null;
    }
    private static String executeLinuxCmd(String cmd) {
        try {
            log.debug("got cmd job : " + cmd);
            Runtime run = Runtime.getRuntime();
            Process process;
            process = run.exec(cmd);
            InputStream in = process.getInputStream();
//            BufferedReader bs = new BufferedReader(new InputStreamReader(in));
            StringBuffer out = new StringBuffer();
            byte[] b = new byte[8192];
            for (int n; (n = in.read(b)) != -1; ) {
                out.append(new String(b, 0, n));
            }
            in.close();
            process.destroy();
            return out.toString();
        } catch (Exception e) {
            log.error("发生异常", e);
        }
        return null;
    }
}


相关文章
|
2月前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的服装商城管理系统
基于Java+Springboot+Vue开发的服装商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的服装商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
138 2
基于Java+Springboot+Vue开发的服装商城管理系统
|
2天前
|
XML Java 数据库连接
SpringBoot集成Flowable:打造强大的工作流管理系统
在企业级应用开发中,工作流管理是一个核心组件,它能够帮助我们定义、执行和管理业务流程。Flowable是一个开源的工作流和业务流程管理(BPM)平台,它提供了强大的工作流引擎和建模工具。结合SpringBoot,我们可以快速构建一个高效、灵活的工作流管理系统。本文将探讨如何将Flowable集成到SpringBoot应用中,并展示其强大的功能。
14 1
|
11天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
20天前
|
存储 安全 Java
打造智能合同管理系统:SpringBoot与电子签章的完美融合
【10月更文挑战第7天】 在数字化转型的浪潮中,电子合同管理系统因其高效、环保和安全的特点,正逐渐成为企业合同管理的新宠。本文将分享如何利用SpringBoot框架实现一个集电子文件签字与合同管理于一体的智能系统,探索技术如何助力合同管理的现代化。
54 4
|
20天前
|
前端开发 Java Apache
SpringBoot实现电子文件签字+合同系统!
【10月更文挑战第15天】 在现代企业运营中,合同管理和电子文件签字成为了日常活动中不可或缺的一部分。随着技术的发展,电子合同系统因其高效性、安全性和环保性,逐渐取代了传统的纸质合同。本文将详细介绍如何使用SpringBoot框架实现一个电子文件签字和合同管理系统。
40 1
|
23天前
|
文字识别 安全 Java
SpringBoot3.x和OCR构建车牌识别系统
本文介绍了一个基于Java SpringBoot3.x框架的车牌识别系统,详细阐述了系统的设计目标、需求分析及其实现过程。利用Tesseract OCR库和OpenCV库,实现了车牌图片的识别与处理,确保系统的高准确性和稳定性。文中还提供了具体的代码示例,展示了如何构建和优化车牌识别服务,以及如何处理特殊和异常车牌。通过实际应用案例,帮助读者理解和应用这一解决方案。
|
2月前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
基于Java+Springboot+Vue开发的大学竞赛报名管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的大学竞赛报名管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
206 3
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
|
2月前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的蛋糕商城管理系统
基于Java+Springboot+Vue开发的蛋糕商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的蛋糕商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
133 3
基于Java+Springboot+Vue开发的蛋糕商城管理系统
|
2月前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的美容预约管理系统
基于Java+Springboot+Vue开发的美容预约管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的美容预约管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
50 3
基于Java+Springboot+Vue开发的美容预约管理系统
|
2月前
|
JavaScript Java 关系型数据库
毕设项目&课程设计&毕设项目:基于springboot+vue实现的在线考试系统(含教程&源码&数据库数据)
本文介绍了一个基于Spring Boot和Vue.js实现的在线考试系统。随着在线教育的发展,在线考试系统的重要性日益凸显。该系统不仅能提高教学效率,减轻教师负担,还为学生提供了灵活便捷的考试方式。技术栈包括Spring Boot、Vue.js、Element-UI等,支持多种角色登录,具备考试管理、题库管理、成绩查询等功能。系统采用前后端分离架构,具备高性能和扩展性,未来可进一步优化并引入AI技术提升智能化水平。
毕设项目&课程设计&毕设项目:基于springboot+vue实现的在线考试系统(含教程&源码&数据库数据)