java实现spring boot项目启动时,重启Windows进程

简介: java实现spring boot项目启动时,重启Windows进程

@[toc]

一、方法总述

前5个实现了在spring boot在Windows启动服务时候,杀死相应的进程的;
第6个组成了启动相应的进程的方式。

二、SpringBoot项目启动时自动执行指定方法

在SpringBoot中,有两种接口方式实现启动执行,分别是ApplicationRunner和CommandLineRunner,除了可接受参数不同,其他的大同小异,这里选择随机选择一种,因为不需要接收参数,所以无所谓哪一种;

@Component
@Order(value = 1)
public class start implements ApplicationRunner {
    private static Logger logger = LoggerFactory.getLogger(StartService.class);

    @Override
    public void run(ApplicationArguments args) throws Exception {
        logger.info("spring boot项目启动成功");
    }
    
}

三、查看进程是否存在的方法

根据传入的course进程名,进行判断,如果存在的话,返回true,不存在返回false,供后面kill进程使用;

  /**
     * 查看进程是否存活
     *
     * @param course 进程的名称
     * @return
     * @throws IOException
     */
    public boolean isLive(String course) throws IOException {

        BufferedReader bufferedReader = null;

        try {
            Process proc = Runtime.getRuntime().exec("tasklist -fi " + '"' + "imagename eq " + course + '"');
//            将获取到的进程打印出来
            bufferedReader = new BufferedReader(new InputStreamReader(proc.getInputStream(), "UTF-8"));
            String line = null;
            while ((line = bufferedReader.readLine()) != null) {
//            如果存在,则返回true
                if (line.contains(course)) {
                    return true;
                }
            }
            return false;
        } catch (Exception ex) {
            return false;
        } finally {
//            关闭资源
            if (bufferedReader != null) {
                try {
                    bufferedReader.close();

                } catch (Exception ex) {

                }
            }
        }
    }

四、杀死Windows进程的方法

根据传入的进程的名称course,去杀死相应的进程;

  /**
     * 杀死进程
     * @param course
     * @return
     * @throws IOException
     */
    public static String killProc(String course) throws IOException {
//        判断进程是否为空
        if (StringUtils.isNotBlank(course)) {
            course = "taskkill /F /IM " + course;
        }
        Runtime runtime = Runtime.getRuntime();
        Process process = runtime.exec("cmd /c " + course);
//            将获取到的进程打印出来
        BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream(), "UTF-8"));
        String line = null;
        StringBuilder build = new StringBuilder();
        while ((line = br.readLine()) != null) {
            build.append(line);
        }
//        返回关闭的进程
        return build.toString();
    }

五、完整代码

public class start implements ApplicationRunner {

    /**
     * 关闭系统中存在的wps.exe进程
     */
    @Override
    public void run(ApplicationArguments applicationArguments) throws Exception {

        String course = "wps.exe";

        try {
            //查看进程是否存活
            boolean isLive = isLive(course);
            if (isLive) {
                // 存在,则杀死该进程
                killProc(course);
            }
        } catch (Exception e) {
        //杀死进程失败
            e.printStackTrace();
        }

    }

    /**
     * 查看进程是否存活
     *
     * @param course 进程的名称
     * @return
     * @throws IOException
     */
    public boolean isLive(String course) throws IOException {

        BufferedReader bufferedReader = null;

        try {
            Process proc = Runtime.getRuntime().exec("tasklist -fi " + '"' + "imagename eq " + course + '"');
//            将获取到的进程打印出来
            bufferedReader = new BufferedReader(new InputStreamReader(proc.getInputStream(), "UTF-8"));
            String line = null;
            while ((line = bufferedReader.readLine()) != null) {
//            如果存在,则返回true
                if (line.contains(course)) {
                    return true;
                }
            }
            return false;
        } catch (Exception ex) {
            return false;
        } finally {
//            关闭资源
            if (bufferedReader != null) {
                try {
                    bufferedReader.close();

                } catch (Exception ex) {

                }
            }
        }
    }

    /**
     * 杀死进程
     * @param course
     * @return
     * @throws IOException
     */
    public static String killProc(String course) throws IOException {
//        判断进程是否为空
        if (StringUtils.isNotBlank(course)) {
            course = "taskkill /F /IM " + course;
        }
        Runtime runtime = Runtime.getRuntime();
        Process process = runtime.exec("cmd /c " + course);
//            将获取到的进程打印出来
        BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream(), "UTF-8"));
        String line = null;
        StringBuilder build = new StringBuilder();
        while ((line = br.readLine()) != null) {
            build.append(line);
        }
//        返回关闭的进程
        return build.toString();
    }
}

六、实现项目启动重启进程

如果想要实现在项目启动的时候,重启进程的话,只需要在关闭进程结束后,加上启动进程就可以了。

try {
    //查看进程是否存活
    boolean isLive = isLive(course);
    if (isLive) {
        // 存在,则杀死该进程
        killProc(course);
        //启动进程
        startProc(course);
    } else {
        //启动进程
        startProc(course);
    }
} catch (Exception e) {
    logger.error("重启/杀死提取程序失败。。。");
}

%%%%%最关键的:启动进程代码:%%%%%

/**
 *  启动进程
 * @throws IOException
 */
public static void startProc(String processName) {
    log.info("启动应用程序:" + processName);
    if (StringUtils.isNotBlank(processName)) {
        try {
            Desktop.getDesktop().open(new File(processName));
        } catch (Exception e) {
            e.printStackTrace();
            log.error("应用程序:" + processName + "不存在!");
        }
    }
}
目录
相关文章
|
1月前
|
IDE Java 开发工具
Spring Boot:加速Java后端开发的现代化利器
在当今快速迭代的软件开发环境中,Spring Boot 已成为Java后端开发领域的首选框架。作为Spring家族的一员,它以“约定优于配置”的设计理念,极大地简化了传统Spring应用的配置和部署过程,让开发者能够更加专注于业务逻辑的实现。本文将探讨Spring Boot的核心优势,并通过一个简单的示例展示如何快速启动一个基于Spring Boot的Java Web应用。
58 1
|
16天前
|
Java 应用服务中间件 开发者
Java面试题:解释Spring Boot的优势及其自动配置原理
Java面试题:解释Spring Boot的优势及其自动配置原理
55 0
|
14天前
|
监控 Java 开发者
Spring Boot框架在java领域的优势
随着云计算、微服务架构的兴起,Java开发领域迫切需要一套高效、灵活且易于上手的框架来应对日益复杂的业务需求。正是在这样的背景下,Spring Boot应运而生,以其独特的魅力迅速成为了Java开发者手中的利器。
30 3
|
15天前
|
安全 前端开发 Java
Java技术栈中的核心组件:Spring框架
Java作为一门成熟的编程语言,其生态系统拥有众多强大的组件和框架,其中Spring框架无疑是Java技术栈中最闪耀的明星之一。Spring框架为Java开发者提供了一套全面的编程和配置模型,极大地简化了企业级应用的开发流程。
25 1
|
18天前
|
人工智能 移动开发 Java
Java智能之Spring AI:5分钟打造智能聊天模型的利器
尽管Python最近成为了编程语言的首选,但是Java在人工智能领域的地位同样不可撼动,得益于强大的Spring框架。随着人工智能技术的快速发展,我们正处于一个创新不断涌现的时代。从智能语音助手到复杂的自然语言处理系统,人工智能已经成为了现代生活和工作中不可或缺的一部分。在这样的背景下,Spring AI 项目迎来了发展的机遇。尽管该项目汲取了Python项目如LangChain和LlamaIndex的灵感,但Spring AI并不是简单的移植。该项目的初衷在于推进生成式人工智能应用程序的发展,使其不再局限于Python开发者。
37 2
|
22天前
|
消息中间件 Java BI
使用Java和Spring Batch实现批处理
使用Java和Spring Batch实现批处理
|
23天前
|
安全 Java 数据安全/隐私保护
使用Java和Spring Security实现身份验证与授权
使用Java和Spring Security实现身份验证与授权
|
23天前
|
消息中间件 负载均衡 Java
Java和Spring Cloud构建分布式系统
Java和Spring Cloud构建分布式系统
|
25天前
|
XML 监控 Java
Java中的AOP编程:AspectJ与Spring AOP的应用
Java中的AOP编程:AspectJ与Spring AOP的应用
|
27天前
|
负载均衡 Java 开发者
细解微服务架构实践:如何使用Spring Cloud进行Java微服务治理
【6月更文挑战第30天】Spring Cloud是Java微服务治理明星框架,整合Eureka(服务发现)、Ribbon(客户端负载均衡)、Hystrix(断路器)、Zuul(API网关)和Config Server(配置中心),提供完整服务治理解决方案。通过Eureka实现服务注册与发现,Ribbon进行负载均衡,Hystrix确保服务容错,Config Server集中管理配置,Zuul则作为API入口统一处理请求。理解和使用Spring Cloud是现代Java开发者的关键技能。
90 2