亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java服務(wù)如何調(diào)用系統(tǒng)指令、Bat腳本記錄

 更新時(shí)間:2024年06月26日 15:00:49   作者:Aikes902  
這篇文章主要介紹了Java服務(wù)如何調(diào)用系統(tǒng)指令、Bat腳本記錄,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

前言

在項(xiàng)目推進(jìn)過(guò)程中偶爾會(huì)涉及到調(diào)用其它組件或腳本的需求,本文重點(diǎn)介紹Java服務(wù)調(diào)用Bat腳本、系統(tǒng)指令。

調(diào)用Bat腳本

根據(jù)需求生成BAT腳本內(nèi)容文本,通過(guò)文件流寫(xiě)入到新建的BAT文件中,然后利用ProcessBuilder執(zhí)行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"; // 批處理文件的路徑和名稱

        // 創(chuàng)建一個(gè)Writer對(duì)象來(lái)寫(xiě)入批處理命令
        PrintWriter writer = new PrintWriter(new FileWriter(tBatFilePath));
        writer.println(cCommand); // 在批處理文件中寫(xiě)入命令
        writer.close(); // 關(guān)閉Writer對(duì)象

        // 執(zhí)行批處理文件
        ProcessBuilder builder = new ProcessBuilder(tBatFilePath);
        // 輸出指令日志
        builder.redirectOutput(ProcessBuilder.Redirect.INHERIT);
        builder.redirectError(ProcessBuilder.Redirect.INHERIT);
        // 啟動(dòng)進(jìn)程并后臺(tái)執(zhí)行批處理文件
        builder.start();

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

當(dāng)前模式存在兩個(gè)問(wèn)題需要手動(dòng)處理:

1、設(shè)置了打印指令日志會(huì)導(dǎo)致最終服務(wù)運(yùn)行的日志很多很雜,按理說(shuō)Logger應(yīng)該可以配置單獨(dú)開(kāi)一個(gè)日志文件,這塊暫時(shí)還沒(méi)研究到,有配置成功的同學(xué)記得評(píng)論區(qū)分享下哈。

2、執(zhí)行的BAT腳本為非阻塞型,所以針對(duì)BAT腳本運(yùn)行中斷后的處理需要在BAT內(nèi)容中實(shí)現(xiàn),后面是筆者用到的BAT腳本,供大家參考。

@echo off

:: 設(shè)置重試次數(shù)和計(jì)數(shù)器變量
set max_retry=3
set retry_count=0

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

:retry
:: 檢查重試次數(shù)是否超過(guò)最大值
if %retry_count% gtr %max_retry% (
   echo "Maximum retries exceeded. Quitting."
   goto end
)

:: 調(diào)用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%

:: 檢查上一個(gè)命令的退出代碼是否為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"

調(diào)用系統(tǒng)指令

執(zhí)行系統(tǒng)指令還是利用ProcessBuilder,包括日志打印的套路都與BAT腳本執(zhí)行一致,需要注意的一點(diǎn)是,針對(duì)指令中的空格分割需要通過(guò)List的集合進(jìn)行拆分。

例如:

指令 rtmp-to-flv.exe -proxy 50003,50004,需要將其根據(jù)空格分為三份,分別裝進(jìn)List集合中,然后使用processBuilder.command方法運(yùn)行即可。

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

            ProcessBuilder processBuilder = new ProcessBuilder();
            //定義命令內(nèi)容
            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);
            //將標(biāo)準(zhǔn)輸入流和錯(cuò)誤輸入流合并,通過(guò)標(biāo)準(zhǔn)輸入流讀取信息
            processBuilder.redirectOutput(ProcessBuilder.Redirect.INHERIT);
            processBuilder.redirectError(ProcessBuilder.Redirect.INHERIT);
            processBuilder.start(); // 啟動(dòng)進(jìn)程并后臺(tái)執(zhí)行批處理文件

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

總結(jié)

利用JAVA服務(wù)運(yùn)行系統(tǒng)指令及BAT腳本其實(shí)可以很大程度減輕JAVA的開(kāi)發(fā)工總量,更容易做到功能的可插拔性,只是對(duì)開(kāi)發(fā)人員的編碼要求和編程思想有一些較高的要求,當(dāng)然這也是作為研發(fā)的必經(jīng)之路,salute。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java NIO框架Netty簡(jiǎn)單使用的示例

    Java NIO框架Netty簡(jiǎn)單使用的示例

    本篇文章主要介紹了Java NIO框架Netty簡(jiǎn)單使用的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • SpringCloud2020.0.x版UnderTow AccessLog相關(guān)配置簡(jiǎn)介

    SpringCloud2020.0.x版UnderTow AccessLog相關(guān)配置簡(jiǎn)介

    本文詳細(xì)介紹了SpringCloud中AccessLog的相關(guān)配置,我們可以根據(jù)文中的相關(guān)數(shù)據(jù)配置出所需的AccessLog的信息以及格式,感興趣的小伙伴可以參考一下
    2021-08-08
  • SpringBoot獲取yml和properties配置文件的內(nèi)容

    SpringBoot獲取yml和properties配置文件的內(nèi)容

    這篇文章主要為大家詳細(xì)介紹了SpringBoot獲取yml和properties配置文件的內(nèi)容,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Java中PageHelper分頁(yè)后對(duì)list操作導(dǎo)致分頁(yè)無(wú)效

    Java中PageHelper分頁(yè)后對(duì)list操作導(dǎo)致分頁(yè)無(wú)效

    在項(xiàng)目中使用分頁(yè)插件的時(shí)候發(fā)現(xiàn)PageHelper插件失效了,本文就來(lái)介紹一下Java中PageHelper分頁(yè)后對(duì)list操作導(dǎo)致分頁(yè)無(wú)效的解決方法,感興趣的可以了解一下
    2021-05-05
  • Mybatis多數(shù)據(jù)源切換實(shí)現(xiàn)代碼

    Mybatis多數(shù)據(jù)源切換實(shí)現(xiàn)代碼

    這篇文章主要介紹了Mybatis多數(shù)據(jù)源切換實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Java請(qǐng)求流量合并和拆分提高系統(tǒng)的并發(fā)量示例

    Java請(qǐng)求流量合并和拆分提高系統(tǒng)的并發(fā)量示例

    這篇文章主要為大家介紹了Java請(qǐng)求流量合并和拆分提高系統(tǒng)的并發(fā)量示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • springboot config 攔截器使用方法實(shí)例詳解

    springboot config 攔截器使用方法實(shí)例詳解

    本文介紹Spring-Boot中使用攔截器的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2018-05-05
  • SpringMVC處理器映射器HandlerMapping詳解

    SpringMVC處理器映射器HandlerMapping詳解

    這篇文章主要介紹了SpringMVC處理器映射器HandlerMapping詳解,在SpringMVC中會(huì)有很多請(qǐng)求,每個(gè)請(qǐng)求都需要一個(gè)HandlerAdapter處理,具體接收到一個(gè)請(qǐng)求之后使用哪個(gè)HandlerAdapter進(jìn)行處理呢,他們的過(guò)程是什么,需要的朋友可以參考下
    2023-09-09
  • Java中提供synchronized后為什么還要提供Lock

    Java中提供synchronized后為什么還要提供Lock

    這篇文章主要介紹了Java中提供synchronized后為什么還要提供Lock,在Java中提供了synchronized關(guān)鍵字來(lái)保證只有一個(gè)線程能夠訪問(wèn)同步代碼塊,下文更多相關(guān)資料需要的小伙伴可以參考一下
    2022-03-03
  • spring自定義注解及使用方法詳細(xì)例子

    spring自定義注解及使用方法詳細(xì)例子

    這篇文章主要給大家介紹了關(guān)于spring自定義注解及使用方法的相關(guān)資料,Spring 是一個(gè)非常強(qiáng)大的框架,可以使用自定義注解來(lái)完成許多任務(wù),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01

最新評(píng)論