`

项目中遇到的 Java啤酒爆炸

    博客分类:
  • java
阅读更多

    最近在做一项目,其中有一模块需要在页面上配置第三方提供的程序路径,配置完成后系统定时执行(quartz),也可以在页面上手动执行,ajax调用后台方法,执行第三方提供的程序,只要是读取固定格式的文件解析成图片,存到本地目录和数据库中。当要解析的文件很大的时候,就会遇到啤酒爆炸的问题。。。

    File file = new File(pro);
        if (file.exists()) {
          logger.info("seed程序开始执行....");
          ProcessBuilder procBuilder = new ProcessBuilder(file.getAbsolutePath());
          procBuilder.redirectErrorStream(true); //合并输出子进程的standard和error inputstream
          logger.info("合并子进程InputStream{}",procBuilder.redirectErrorStream());
          Process process = procBuilder.start();
         
          drainInBackground(process.getInputStream());
          int exit = process.waitFor();
          logger.info("seed程序退出{}", exit);
          josnResult = "exeok";
        } else {
          logger.info("seed程序未找到....");
          josnResult = "notfound";
        }

 

    /**
   * 启动一个线程,用于排空子进程的输出流,否则子进程会挂起
   */
  static void drainInBackground(final InputStream is) {
    new Thread(new Runnable() {
      public void run() {
        try {
          while (is.read() >= 0)
            ;
        } catch (IOException e) {
          // return on IOException
        }
      }
    }).start();
  }

 

    这里的教训是: 为了确保子进程能够结束,你必须排空它的输出流;对于错误流(error stream)也是一样,而且它可能会更麻烦,因为你无法预测进程什么时候会倾 倒(dump)一些输出到这个流中。在 5.0 版本中,加入了一个名为ProcessBuilder 的类用于排空这些流。它的 redirectErrorStream 方法将各个流合并起来,所以你只需要排空这一个流。如果你决定不合并输出流和错误流,你必须并行地 (concurrently)排空它们。试图顺序化地(sequentially)排空它们会导致子进程被挂起。

分享到:
评论

相关推荐

    Java 项目经验汇总(简历项目素材)

    5. **解决问题**:突出你在项目中遇到的关键问题和解决方案,展示你的问题解决能力。 6. **成果与影响**:列举项目上线后的实际效果,如提升了多少效率,节省了多少成本,或者为用户带来了什么价值。 在"Java项目...

    java项目开发实战案例

    在《Java项目开发实战案例》这个资源中,我们聚焦于Java技术在实际项目中的应用,通过具体的案例来深入了解系统开发的全过程。这个实战教程旨在帮助开发者掌握从需求分析到项目落地的各项技能,涵盖数据库设计、前后...

    Java项目经验汇总(简历项目素材)

    Java项目经验汇总(简历项目素材)

    公司真实项目源码(java)

    这样的项目源码对于学习者来说具有很高的价值,因为它提供了真实世界中的应用实例,帮助开发者了解如何在实践中运用Java技术。 【描述】中提到,这个项目已经包含了部署到服务器所需的全部组件,并且可以与导入的...

    java项目开发验收交接整套模板

    在Java项目开发中,验收与交接是至关重要的环节,确保项目的质量和稳定性,同时为后续的维护和升级奠定基础。此"java项目开发验收交接整套模板"提供了全面的指导材料,帮助开发者和团队规范地完成这一过程。以下是...

    java新手8个小项目

    特别适合java新手巩固java基础的项目,总共有8个项目的全部代码,都可以直接运行,代码有注释。

    129个Java项目源码下载

    在Java项目开发中,我们通常会遇到多种技术栈和框架,例如Spring Boot用于构建微服务,Struts或Spring MVC用于MVC架构,Hibernate或MyBatis处理数据持久化,以及JUnit进行单元测试等。这些项目源码可能包含了这些...

    很棒的毕业设计、课程设计、练手的java项目-仓库商品管理系统(文档+视频+源码).rar

    很棒的毕业设计、课程设计、练手的java项目---仓库商品管理系统(文档+视频+源码) 很棒的毕业设计、课程设计、练手的java项目---仓库商品管理系统(文档+视频+源码) 很棒的毕业设计、课程设计、练手的java项目---仓库...

    人事管理项目(java+mysql)源代码

    1. **Servlets和JSP**:Servlets是Java中处理HTTP请求的组件,可以接收和响应来自客户端的请求。JSP则是一种动态网页技术,允许在HTML页面中嵌入Java代码,以实现动态内容生成。两者结合,可以构建出功能强大的Web...

    达内当当网项目源码(java)

    通过深入研究"达内当当网项目源码(java)",你可以提升自己的Java Web开发技能,学习到实际项目开发中的最佳实践,并为未来的项目开发积累宝贵经验。同时,这个项目也可以作为自我学习和实践的实战平台,帮助你更好...

    JAVA_API1.6文档(中文)

    java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...

    JAVA框架项目

    - **背景介绍**:《JAVA框架项目教程》是翰子昂实训体系丛书中的一部分,旨在通过真实的项目案例,为学习者提供贴近实际工作的JAVA技能训练。随着软件产业在全球范围内的快速发展,软件人才成为推动经济增长的关键...

    80个java开发项目经验.pdf

    80个java开发项目经验,适合应届生

    java仓库管理系统项目源码

    Java仓库管理系统项目源码是一个基于Java技术开发的用于管理仓库库存、进出货流程以及相关数据的软件系统。这个系统提供了全面的功能,旨在提高仓库管理效率,确保库存数据准确无误,便于企业进行供应链管理和决策。...

    韩顺平Java教学 坦克大战游戏源码+素材+文档

    在坦克大战的项目中,Java的面向对象特性被充分利用,通过定义各种类来构建游戏的各个元素,如坦克、子弹、障碍物等。学习这个源码,你可以看到如何使用类、对象、继承、封装和多态等核心概念。 其次,游戏源码部分...

    经典java项目源代码

    2. **异常处理**:Java中的异常处理机制是通过try-catch-finally语句实现的,用于捕获和处理程序运行时可能出现的问题。 3. **集合框架**:包括ArrayList、LinkedList、HashSet、HashMap等,是Java编程中数据组织和...

    Java企业及互联网项目实战

    《Java企业及互联网项目实战》是一本专注于Java技术在实际企业及互联网项目中的应用书籍。这本书的特点在于提供了源代码,让读者能够通过实践来深化理解,非常适合自学。 Java项目是IT行业中广泛应用的开发领域,...

    java版山寨QQ项目源码

    java版山寨QQ项目 里面有四个压缩包 QQ服务器端.rar QQ客户端.rar 改进QQ客户机服务器视频实现.rar Q第三方库.rar 这个java版山寨QQ项目实现的功能有: 1.实现的java视频聊天; 2.集成了Mina框架; 3.服务器管理...

    java小项目 适合初学者

    小项目如计算器能够让学生直观地理解编程基础,并且在实现过程中学会如何运用Java语言中的基本语法和编程结构。 接下来,我们具体探讨一下适合初学者的小型Java项目应该如何设计。一般来说,小型项目需要满足以下...

    Java最著名的开源项目

    在Java的生态系统中,存在诸多著名的开源项目,这些项目各有特色,为Java开发人员提供了丰富的开发工具和应用架构。以下是对一些Java著名开源项目的详细介绍,它们分别在不同的开发领域中扮演着重要角色。 首先,...

Global site tag (gtag.js) - Google Analytics