Java服务调用系统指令、Bat脚本记录

2023-05-16

一、前言

        在项目推进过程中偶尔会涉及到调用其它组件或脚本的需求,本文重点介绍Java服务调用Bat脚本、系统指令。

二、调用Bat脚本

        根据需求生成BAT脚本内容文本,通过文件流写入到新建的BAT文件中,然后利用ProcessBuilder执行BAT命令,最后判断删除生成的BAT文件。

    public void executeBatScript(String cCommand, String cBatFileName, String cBasePath) throws Exception {
        //判断路径是否存在
        File directory = new File(cBasePath);
        if (!directory.exists()) {
            directory.mkdir();
        }
        String tBatFilePath = cBasePath + cBatFileName + ".bat"; // 批处理文件的路径和名称

        // 创建一个Writer对象来写入批处理命令
        PrintWriter writer = new PrintWriter(new FileWriter(tBatFilePath));
        writer.println(cCommand); // 在批处理文件中写入命令
        writer.close(); // 关闭Writer对象

        // 执行批处理文件
        ProcessBuilder builder = new ProcessBuilder(tBatFilePath);
        // 输出指令日志
        builder.redirectOutput(ProcessBuilder.Redirect.INHERIT);
        builder.redirectError(ProcessBuilder.Redirect.INHERIT);
        // 启动进程并后台执行批处理文件
        builder.start();

        // 删除生成的批处理文件
        File file = new File(tBatFilePath);
        if (file.delete()) {
            log.info("Batch file deleted successfully.");
        }
    }

         当前模式存在两个问题需要手动处理:

        1、设置了打印指令日志会导致最终服务运行的日志很多很杂,按理说Logger应该可以配置单独开一个日志文件,这块暂时还没研究到,有配置成功的同学记得评论区分享下哈。

        2、执行的BAT脚本为非阻塞型,所以针对BAT脚本运行中断后的处理需要在BAT内容中实现,后面是笔者用到的BAT脚本,供大家参考。

@echo off

:: 设置重试次数和计数器变量
set max_retry=3
set retry_count=0

set remote=$remote$
set local=$local$

:retry
:: 检查重试次数是否超过最大值
if %retry_count% gtr %max_retry% (
   echo "Maximum retries exceeded. Quitting."
   goto end
)

:: 调用ffmpeg指令  ffmpeg -i  rtmp://105if39328.51pc.cn:1935/live/0 -c copy -f flv rtmp://127.0.0.1:50001/live/aa8
ffmpeg -i %remote% -c copy -f flv %local%

:: 检查上一个命令的退出代码是否为0(成功)
if %errorlevel% neq nul (
   echo "remote:%remote%. local:%local%. errorlevel:%errorlevel%. Retrying in 10 seconds...This is No.%retry_count% times Retry"
   :: 等待10秒后重试
   ping -n 15 127.0.0.1 > nul
   set /a retry_count+=1
   goto retry
)

:end
echo "Done"

三、调用系统指令

        执行系统指令还是利用ProcessBuilder,包括日志打印的套路都与BAT脚本执行一致,需要注意的一点是,针对指令中的空格分割需要通过List的集合进行拆分。

        例如:指令 rtmp-to-flv.exe -proxy 50003,50004,需要将其根据空格分为三份,分别装进List集合中,然后使用processBuilder.command方法运行即可。

    public void executeSystemCommand() {
        try {
            // 执行批处理文件
            Resource classpathResource = resourceLoader.getResource("classpath:");
            String classpathPath = classpathResource.getFile().getAbsolutePath();

            ProcessBuilder processBuilder = new ProcessBuilder();
            //定义命令内容
            List<String> command = new ArrayList<>();
            // rtmp-to-flv.exe -proxy 50003,50004

            //
            String os= System.getProperty("os.name").toLowerCase();
            if (os.contains("windows")) {
                command.add(classpathPath + "/rtmp-to-flv.exe");
            }
            else {
                command.add(classpathPath + "/rtmp-to-flv");
            }

            command.add("-proxy");
            command.add("50003,50004");
            processBuilder.command(command);
            //将标准输入流和错误输入流合并,通过标准输入流读取信息
            processBuilder.redirectOutput(ProcessBuilder.Redirect.INHERIT);
            processBuilder.redirectError(ProcessBuilder.Redirect.INHERIT);
            processBuilder.start(); // 启动进程并后台执行批处理文件

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

四、总结

        利用JAVA服务运行系统指令及BAT脚本其实可以很大程度减轻JAVA的开发工总量,更容易做到功能的可插拔性,只是对开发人员的编码要求和编程思想有一些较高的要求,当然这也是作为研发的必经之路,salute。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java服务调用系统指令、Bat脚本记录 的相关文章

随机推荐

  • python之np.sum()用法详解

    python库numpy提供的求和方法np sum xff0c 可以对数组和矩阵进行求和 sum方法可以接收多个参数 xff0c 主要是数组a 坐标轴axis 数据类型dtype 初始值initial 其中 xff0c axis对于我们来说
  • java中list集合对象按照某一个属性分组

    这里的需求是分组 xff0c 就是集合按照相同的属性来分组 一般默认的做法就是定义一个对象 xff0c 然后利用java8流对象的分组方法来分组 xff0c 在分组函数中 xff0c 传入一个属性get方法 如下所示 xff1a packa
  • snakeyaml数字字符串显示单引号的问题

    如题所示 xff0c 一般yaml结构中 xff0c 字符串直接显示没有单引号的字符串 xff0c 如果字符串由数字组成 xff0c 为了区别真正的数字 xff0c 这个字符串会使用单引号包围起来 数据结构如下 xff1a Map lt S
  • java中flatMap用法

    java中map是把集合每个元素重新映射 xff0c 元素个数不变 xff0c 但是元素值发生了变化 而flatMap从字面上来说是压平这个映射 xff0c 实际作用就是将每个元素进行一个一对多的拆分 xff0c 细分成更小的单元 xff0
  • excel中设置下拉选择框和word文档中插入外部excel只显示图标

    这篇文章介绍两个和excel相关的主题 xff0c 一个是对excel表格设置下拉框 xff0c 另一个是在word文档中插入外部excel xff0c 但是我们不想展示excel的内容 xff0c 而是展示一个图标 xff0c 点击图标
  • snakeyaml自定义pojo写入yml文件时属性字段排序问题

    snakeyaml采用LinkedHashMap保存对象 xff0c 最后写入yml文件的时候 xff0c 可以按照存入的顺序写入yml xff0c 如果采用自定义pojo xff0c 虽然可以写入yml xff0c 但是属性默认是按照字母
  • microsoft store打开加载失败,显示检查连接

    如题所示 xff0c 微软商店 microsoft store打开 xff0c 页面显示空白 xff0c 提示检查连接 xff0c 如下所示 xff1a 这种问题其实是网络设置不正确 xff0c 我们通过控制面板打开 网络和Internet
  • SpringBoot配置静态资源访问办法

    SpringBoot如果是web项目 xff0c 其实默认静态资源是放在resources static 目录下的 这个静态资源其实隐含了一个配置就是spring mvc static path pattern xff0c 如下所示 xff
  • Java服务导致CPU爆表异常排查

    一 前言 之前的博客有提到过面对Tomcat部署的java服务出现内存溢出该如何定位 xff0c 今天来记录下Tomcat部署的java服务出现CPU爆表的事故该如何定位 二 正文 针对Linux系统在处理CPU爆满时会有相关指令可以一步到
  • win10+python3.6+cuda9+pytorch1.1.0安装

    为了让torch可以使用显卡GPU加速 xff0c 需要安装对应版本的cudatoolkit和pytorch 这里我的nvidia显卡驱动是9 1版本 xff0c 只能安装cudatoolkit9 一般支持gpu加速的显卡大部分都是英伟达n
  • vmware虚拟机与树莓派4B安装ubuntu1804 + ros遇到的问题

    如题所示 xff0c 本人在虚拟机上安装ubuntu1804 xff0c 可以很容易安装 xff0c 并且更换系统apt源和ros源 xff0c 然后安装ros xff0c 非常顺利 xff0c 但是在树莓派4B上安装raspiberry系
  • python中Flask项目启动静态资源访问问题

    flask项目启动 xff0c 会监听默认的5000端口 xff0c 这个时候 xff0c 在项目根路径下有一个默认的文件夹static xff0c 是用来存放静态资源的 xff0c 我们启动项目 xff0c 可以直接访问这个目录里面的静态
  • java混淆框架proguard结合springboot项目混淆打包

    java项目一般是打包成jar运行或者作为依赖给第三方使用的 xff0c 有的时候 xff0c 可能不想被别人反编译 xff0c 于是就对关键部分进行混淆 xff0c 让代码变得普通人看不懂的地步 xff0c 很多关键字和变量都是用单个字母
  • java中Runtime.exec()可能带来的命令注入安全问题的解决办法

    我们在使用Runtime getRuntime exec 的时候 xff0c 可以指定一个命令或者脚本 xff0c 让它执行 xff0c 类似于调用系统指令来进行完成一项任务 但是这个方法如果有安全检查 xff0c 它会被报出一个Comma
  • springboot自帶线程池ThreadPoolTaskExecutor使用

    不管是阿里 xff0c 还是华为java开发手册 xff0c 都会有一条建议 xff0c 就是让开发者不要使用Executors去创建线程池 xff0c 而是使用构造函数ThreadPoolExecutor的方式来创建 xff0c 并设置合
  • windows下postgresql安装timescaledb

    timescaledb是一个时序数据库 xff0c 可以创建超表hypertable 它并不是一个独立的数据库 xff0c 它依赖于postgresql xff0c 目前相当于postgresql的一个插件或者扩展 要安装timescale
  • windows下sonarqube+sonar-runner安装记录

    sonarqube是一套代码质量管理工具系统 xff0c sonar runner是一个静态扫描代码的工具 xff0c 它可以把扫描的结果交给sonarqube来管理 这里安装的sonarqube版本比较老旧5 1 2 xff0c 因为我安
  • windows上nacos源码编译安装

    nacos是阿里巴巴旗下的一款类似dubbo的微服务注册与发现中心 xff0c 现在很多地方都在使用这个新的框架作为微服务注册中心 nacos本质还是一个rpc框架 xff0c 但是它更强大 xff0c 它还支持配置管理 这里来学习naco
  • java通过URLClassLoader类加载器加载外部jar

    相信在实际工作中 xff0c 大家可能会遇到这种需求 xff0c 这个jar是外部的 xff0c 并没有添加到项目依赖中 xff0c 只能通过类加载器加载并调用相关方法 这种jar加载 xff0c 其实也简单 xff0c 我们通过普通的UR
  • Java服务调用系统指令、Bat脚本记录

    一 前言 在项目推进过程中偶尔会涉及到调用其它组件或脚本的需求 xff0c 本文重点介绍Java服务调用Bat脚本 系统指令 二 调用Bat脚本 根据需求生成BAT脚本内容文本 xff0c 通过文件流写入到新建的BAT文件中 xff0c 然