代码之家  ›  专栏  ›  技术社区  ›  Péter Török

为什么我的竹子构建被Java子进程阻塞?

  •  1
  • Péter Török  · 技术社区  · 14 年前

    我正在处理遗留Java企业服务器项目,试图建立夜间构建。我们使用Java 5、Maven 2、JBOSS 4.2和亚特兰西竹2.1.5。我们的想法是在一个dev服务器上有一个bamboo代理,maven构建被配置为硬部署生成的.ear文件,然后重新启动服务器。(我们不能使用Soft Deploy,因为我们的旧应用程序使用了一个库,在取消部署期间会导致异常…我们将在某个时候摆脱这个该死的库,但不是现在。)我正在为此使用JBossMaven插件。当我在自己的机器上运行maven构建时(膝上型电脑,win xp-professional),它工作得很好:服务器停止并重新启动最新的构建,构建完成。

    但是,当我尝试在我们的服务器上运行夜间构建(win 2003)时,在启动jboss服务器之后,构建过程将停止。竹剂显示在日志中:

    Build MYPROJECT-NIGHTLY-44 completed.
    

    然后它在那里等待,构建永远不会结束——除非我手动关闭JBoss服务器,此时,竹制构建过程恢复并运行其后期构建活动,然后以

    Finished building MYPROJECT-NIGHTLY-44.
    

    显然,启动jboss服务器的进程在win 2003上锁定了父进程,而同一进程在win xp上独立运行。jboss插件的相关代码如下(为了简洁而重新格式化):

    protected void launch( String fName, String params )
        throws MojoExecutionException {
    
        try {
            checkConfig();
            String osName = System.getProperty( "os.name" );
            Runtime runtime = Runtime.getRuntime();
    
            Process p = null;
            if ( osName.startsWith( "Windows" ) ) {
                String command[] = { "cmd.exe", "/C", "cd " + jbossHome + "\\bin & " + fName + ".bat " + " " + params };
                p = runtime.exec( command );
                dump( p.getInputStream() );
                dump( p.getErrorStream() );
            } else {
                String command[] = { "sh", "-c", "cd " + jbossHome + "/bin; ./" + fName + ".sh " + " " + params };
                p = runtime.exec( command );
            }
    
        } catch ( Exception e ) {
            throw new MojoExecutionException( "Mojo error occurred: " + e.getMessage(), e );
        }
    }
    
    protected void dump( final InputStream input ) {
        new Thread( new Runnable() {
            public void run() {
                try {
                    byte[] b = new byte[1000];
                    while ( ( input.read( b ) ) != -1 ) {
                    }
                } catch ( IOException e ) {
                    e.printStackTrace();
                }
            }
        } ).start();
    }
    

    这个 dump() 方法需要刷新进程的输出缓冲区-如果没有它,进程将无法运行,如 API docs 也是。但是,这仍然不适用于Win2003。此代码中是否有丢失或不正确的内容?这是竹子的问题吗?感谢您的帮助。

    更新: 我在服务器上的命令行中测试了maven构建,它工作得很好。所以这显然是个竹节问题。看起来,Bamboo代理直接或间接地将其构建过程中派生的所有子流程绑定在一起,并在声明构建完成之前等待所有子流程终止。对于一个构建代理来说,这听起来有点合乎逻辑…只是对我有不幸的后果:-(

    更新2: 我也把这个问题贴在竹制讨论板上,得到了亚特兰蒂斯支持者的一些回应,但还没有决定性的结果。

    1 回复  |  直到 13 年前
        1
  •  1
  •   Péter Török    13 年前

    我相关的结果 discussion on the Bamboo forum 这似乎是竹子的特点,所以没有直接的解决办法。建议的解决方案是使用 post build command plugin 在生成过程完成后部署应用程序。

    我没有尝试过,因为我找到了另一种解决方案,可以通过以下方式将服务器部署为Windows服务: Tanuki ,使用 Exec Maven Plugin .