当前位置: 代码网 > it编程>编程语言>Java > Java服务如何调用系统指令、Bat脚本记录

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

2024年07月02日 Java 我要评论
前言在项目推进过程中偶尔会涉及到调用其它组件或脚本的需求,本文重点介绍java服务调用bat脚本、系统指令。调用bat脚本根据需求生成bat脚本内容文本,通过文件流写入到新建的bat文件中,然后利用p

前言

在项目推进过程中偶尔会涉及到调用其它组件或脚本的需求,本文重点介绍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。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com