‘liusuyi’
2023-07-29 226b979027a05d371501d64f7ce040a6fe2a60e2
优化外部exe程序启动方式
已添加1个文件
已修改3个文件
已删除1个文件
204 ■■■■ 文件已修改
ard-work/src/main/java/com/ruoyi/media/service/impl/MediaService.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/media/service/impl/WebrtcService.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/utils/tools/CmdUtils.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/webrtc/setup.bat 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/logback.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/media/service/impl/MediaService.java
@@ -6,6 +6,7 @@
import com.ruoyi.media.service.IMediaService;
import com.ruoyi.utils.forest.MediaClient;
import com.ruoyi.utils.tools.ArdTool;
import com.ruoyi.utils.tools.CmdUtils;
import com.sun.jna.Platform;
import io.minio.messages.Item;
import lombok.extern.slf4j.Slf4j;
@@ -43,44 +44,25 @@
    @PostConstruct
    public void initMediaMtx() {
        if (Platform.isWindows()) {
            String processName="mediamtx.exe";
            String exePath = System.getProperty("user.dir") + File.separator + "lib" + File.separator + "mediamtx" + File.separator + "mediamtx.exe";
            String ymlPath = System.getProperty("user.dir") + File.separator + "lib" + File.separator + "mediamtx" + File.separator + "mediamtx.yml";
            // æž„建启动命令,使用cmd /c start命令来启动可执行程序并显示命令提示符窗口
//                String[] cmd = {"cmd", "/c", "start", exePath,ymlPath};
//                ProcessBuilder processBuilder = new ProcessBuilder(cmd);
//                processBuilder.redirectErrorStream(true); // å°†é”™è¯¯è¾“出重定向到标准输出
//                Process process = processBuilder.start();
            // å¦‚果你想等待程序完成
            //  int exitCode = process.waitFor();
            List<String> cmd = new ArrayList<>();
            cmd.add(exePath);
            cmd.add(ymlPath);
            commandStart(cmd);
            if (CmdUtils.isProcessRunning(processName)) {
                // è¿›ç¨‹å·²ç»åœ¨è¿è¡Œï¼Œç»“束该进程
                CmdUtils.stopProcess(processName);
            }
            // å¯åŠ¨åŽå°è¿›ç¨‹
             CmdUtils.commandStart(processName,cmd);
            // å¯åЍcmd窗口
//            String[] command = {"cmd","/c","start",exePath,ymlPath};
//            CmdUtils.commandStart(command);
        }
    }
        }
    }
    public static void commandStart(List<String> command) {
        command.forEach(v -> System.out.print(v + " "));
        System.out.println();
        System.out.println();
        ProcessBuilder builder = new ProcessBuilder();
        //正常信息和错误信息合并输出
        builder.redirectErrorStream(true);
        builder.command(command);
        //开始执行命令
        Process process = null;
        try {
            process = builder.start();
            //如果你想获取到执行完后的信息,那么下面的代码也是需要的
//            String line = "";
//            BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
//            while ((line = br.readLine()) != null) {
//                System.out.println(line);
//            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Override
    public String addPath(String name, String rtspPath, String mode) {
        String rtspUrl = "rtsp://" + mediamtxHost + ":7554/";
ard-work/src/main/java/com/ruoyi/media/service/impl/WebrtcService.java
@@ -1,5 +1,6 @@
package com.ruoyi.media.service.impl;
import com.ruoyi.utils.tools.CmdUtils;
import com.sun.jna.Platform;
import org.springframework.stereotype.Component;
@@ -23,36 +24,21 @@
    @PostConstruct
    public void init() {
        if (Platform.isWindows()) {
            // String exePath = System.getProperty("user.dir") + File.separator + "lib" + File.separator + "webrtc" + File.separator + "setup.bat";
            // String[] cmd = {"cmd", "/c", "start", exePath};
            String exePath = System.getProperty("user.dir") + File.separator + "lib" + File.separator + "webrtc" + File.separator + "webrtc-streamer.exe";
            String processName = "webrtc-streamer.exe"; // æ›¿æ¢ä¸ºå®žé™…çš„exe程序名称
            String exePath = System.getProperty("user.dir") + File.separator + "lib" + File.separator + "webrtc" + File.separator + processName;
            List<String> cmd = new ArrayList<>();
            cmd.add(exePath);
            cmd.add("-o");
            cmd.add("-H127.0.0.1:8000");
            commandStart(cmd);
            cmd.add("-o");
            if (CmdUtils.isProcessRunning(processName)) {
                // è¿›ç¨‹å·²ç»åœ¨è¿è¡Œï¼Œç»“束该进程
                CmdUtils.stopProcess(processName);
        }
    }
    public static void commandStart(List<String> command) {
        command.forEach(v -> System.out.print(v + " "));
        System.out.println();
        System.out.println();
        ProcessBuilder builder = new ProcessBuilder();
        //正常信息和错误信息合并输出
        builder.redirectErrorStream(true);
        builder.command(command);
        //开始执行命令
        Process process = null;
        try {
           process = builder.start();
//            //如果你想获取到执行完后的信息,那么下面的代码也是需要的
//            String line = "";
//            BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
//            while ((line = br.readLine()) != null) {
//                System.out.println(line);
//            }
       } catch (IOException e) {
            e.printStackTrace();
            // å¯åŠ¨åŽå°è¿›ç¨‹
             CmdUtils.commandStart(processName,cmd);
            // å¯åЍcmd窗口
//            String[] command = {"cmd", "/c", "start", exePath, "-H127.0.0.1:8000", "-o"};
//            CmdUtils.commandStart(command);
        }
    }
}
ard-work/src/main/java/com/ruoyi/utils/tools/CmdUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,100 @@
package com.ruoyi.utils.tools;
import lombok.extern.slf4j.Slf4j;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.List;
/**
 * @Description: cmd命令工具类
 * @ClassName: CmdUtils
 * @Author: åˆ˜è‹ä¹‰
 * @Date: 2023å¹´07月29日13:24:21
 * @Version: 1.0
 **/
@Slf4j(topic = "cmd")
public class CmdUtils {
    //启动命令1
    public static void commandStart(String processName, List<String> command) {
        log.debug("启动外部程序:" + processName);
        command.forEach(v -> log.debug(v + " "));
        ProcessBuilder builder = new ProcessBuilder();
        //正常信息和错误信息合并输出
        builder.redirectErrorStream(true);
        builder.command(command);
        //开始执行命令
        Process process = null;
        try {
            process = builder.start();
            //如果你想获取到执行完后的信息,那么下面的代码也是需要的
//            String line = "";
//            BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
//            while ((line = br.readLine()) != null) {
//                System.out.println(line);
//            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    // ç»“束指定名称的进程
    public static void stopProcess(String processName) {
        log.debug("尝试结束进程:"+processName);
        ProcessBuilder builder = new ProcessBuilder("taskkill", "/F", "/IM", processName);
        Process process;
        try {
            process = builder.start();
            //如果你想获取到执行完后的信息,那么下面的代码也是需要的
            String line = "";
            BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream(), Charset.forName("GBK")));
            while ((line = br.readLine()) != null) {
                log.debug("回显:" + line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    // æ£€æŸ¥æŒ‡å®šåç§°çš„进程是否正在运行
    public static boolean isProcessRunning(String processName) {
        try {
            ProcessBuilder builder = new ProcessBuilder("tasklist");
            Process process = builder.start();
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null) {
                if (line.contains(processName)) {
                    log.debug("进程" + processName + "已存在");
                    return true;
                }
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        log.debug("进程" + processName + "不存在");
        return false;
    }
    //启动命令2
    public static void commandStart(String[] command) {
        //构建启动命令,使用cmd /c start命令来启动可执行程序并显示命令提示符窗口
        ProcessBuilder processBuilder = new ProcessBuilder(command);
        processBuilder.redirectErrorStream(true); // å°†é”™è¯¯è¾“出重定向到标准输出
        Process process = null;
        try {
            process = processBuilder.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //如果你想等待程序完成
        try {
            int exitCode = process.waitFor();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
lib/webrtc/setup.bat
ÎļþÒÑɾ³ý
ruoyi-admin/src/main/resources/logback.xml
@@ -185,6 +185,19 @@
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>
    <!--cmd命令日志输出-->
    <appender name="cmd" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/cmd.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--按天回滚daily-->
            <fileNamePattern>${log.path}/cmd.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!--日志最大的历史60天-->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>
    <!-- ç³»ç»Ÿæ¨¡å—日志级别控制  -->
    <logger name="com.ruoyi" level="info"/>
    <!-- Spring日志级别控制  -->
@@ -239,4 +252,8 @@
    <logger name="rongCloud" level="DEBUG">
        <appender-ref ref="rongCloud"/>
    </logger>
    <!--cmd日志打印等级-->
    <logger name="cmd" level="DEBUG">
        <appender-ref ref="cmd"/>
    </logger>
</configuration>