当前位置: 首页 > news >正文

Linux中Java后端调用外部进程 未处理后台输出流 导致io阻塞问题解决方法

问题复现

项目中遇到通过Java后端调用启动CMake编译好的C++二进制文件,Websocket 客户端与服务端正常建立连接通信约两分钟后服务端会失联的问题,但如果本地启动C++进程通信是正常的。
在这里插入图片描述

问题原因

服务端启动C++进程的方法是通过:

ProcessBuilder pb = new ProcessBuilder("bash","-c","/home/ubuntu/cmake bin文件; exec bash");

然而ProcessBuilder如果只启动进程,但未处理输出流会造成io阻塞,因为没有正确处理外部进程(算法)的输出流,因此关于本地回环通信以及日志模块的功能都会受到影响。
在这里插入图片描述

  • ProcessBuilder(“./my_cpp_program”).start() 启动外部进程
  • 必须处理 process.getInputStream() 和 process.getErrorStream()
  • 否则C++进程的输出会阻塞,导致WebSocket子线程无法接收消息
  • 这是Unix/Linux系统的进程间通信机制决定的,不是Java或C++的bug

解决方法

方法一

直接丢弃输出流,防止有限缓冲区造成io阻塞

Process process = pb
// 丢弃stdout
.redirectOutput(ProcessBuilder.Redirect.DISCARD)//丢弃stderr
.redirectError(ProcessBuilder.Redirect.DISCARD).start();
方法二

使用Commons Exec进行外部进程管理
Commons Exec是为了简化 Java 应用中外部进程的调用和管理而设计的。它通过封装 Java 原生的 Process 和 Runtime,提供了更加友好和强大的API。这个库的设计重点是易用性和灵活性,让开发者可以更加专注于业务逻辑,而不是纠结于底层的进程管理细节。

http://www.dtcms.com/a/355038.html

相关文章:

  • K8S架构与组件完全解析
  • Baselight 携手 Walrus 激活链上数据价值,打造无需许可的数据中
  • LeetCode热题100--98. 验证二叉搜索树--中等
  • QT 概述(背景介绍、搭建开发环境、Qt Creator、程序、项目文件解析、编程注意事项)
  • Fortran快速排序算法实现与优化
  • Web安全:深入理解User-Agent报头注入与防御
  • 从CTFshow-pwn入门-pwn43理解栈溢出到底跳转call还是plt
  • 网络安全测试(一)Kali Linux
  • PyTorch实战(3)——PyTorch vs. TensorFlow详解
  • 网络安全设备监控指标
  • jvm锁优化
  • MiniCPM-V 4.5 vs MiniCPM-V 2.6 深度对比分析
  • claude code helper for vscode
  • MTK Linux DRM分析(十七)- MTK KMS实现mtk_drm_fb.c
  • HTML贪吃蛇游戏实现
  • SQLSERVER触发器
  • C++讲解---什么是静态成员函数
  • 云计算学习100天-第28天
  • 软件测试(三):测试流程及测试用例
  • 如果被控端显示器分辨率是2k,远程控制软件的画质设置是4k,主控端显示器的分辨率是2k,那主控端看到的被控端画面是几k
  • list 手动实现 1
  • IO多路复用---EPOLL
  • 把llamafacoty微调后的模型导出ollama模型文件
  • SPARK入门
  • Python 多版本环境治理理念驱动的系统架构设计——三维治理、四级隔离、五项自治 原则(路径治理升级修订 V 2.0 版)
  • 七牛云实践:我们如何用 AIGC 将产品开发从“人想图”变为“图选图”
  • 使用astah制作专业状态图及C/C++实现解析
  • 随手小记:elementUI的勾选框使用的坑
  • 大模型微调示例五之Llama-Factory_agent_functioncalling
  • 大数据原生集群 (Hadoop3.X为核心) 本地测试环境搭建三