在webapp中显示控制台输出

时间:2011-03-21 04:03:08

标签: java ajax jsf build richfaces

我想提出一个在服务器上执行maven构建的Web应用程序,并在发生时显示构建控制台输出。我正在寻找类似于Hudson中可用的东西。

我已阅读此处给出的解决方案:Need to execute shell script from webapp and display console output in page

好吧,我可以运行脚本并获取整个输出,但我希望在构建发生时更新UI。我怎么能做到这一点?

使用JSF和Jboss Richfaces组件可以做到这一点吗?

1 个答案:

答案 0 :(得分:1)

是的,您可以使用Richfaces的<a4j:poll>来完成此任务,它将定期轮询对服务器的请求。例如,

查看:

<a4j:region>
        <h:form>        
            <a4j:poll id="poll"  enabled="#{testBean.enablePolling}" reRender="consoleOutput,poll" />
        </h:form>
</a4j:region>

<h:form>
    <a4j:jsFunction name="startBuild" action="#{testBean.startBuild}" />
    <a4j:commandButton value="Start Build"  action="#{testBean.startPolling}" oncomplete="startBuild()"  reRender="poll"/>  
    <hr/>
    <h:outputText id="consoleOutput" value="#{testBean.consoleOuput}" escape="false"/>
</h:form>

MBean:

public class TestBean {

    private boolean enablePolling;
    private StringBuffer buildOutputSb = new StringBuffer();

    public TestBean() {
    }

        public boolean isEnablePolling() {
        return enablePolling;
    }

    public void setEnablePolling(boolean enablePolling) {
        this.enablePolling = enablePolling;
    }

    public void startPolling(){
        this.enablePolling = true;
    }

    public void startBuild(){

        this.buildOutputSb= new StringBuffer();

        //Stimulating the build process , which will output the log message to the buildOutputSb
        for (int i=0 ; i <10 ; i++){
            buildOutputSb.append("Output").append(i).append("<br/>");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }   
        this.enablePolling = false;
    }

}

构建脚本输出的日志消息将附加到字符串缓冲区(buildOutputSb),我们使用<h:outputText id="consoleOutput">将此字符串缓冲区中的值显示给UI。

按下“开始构建”按钮后,enablePolling属性将设置为true,这将启用<a4j:poll id="poll">并使其定期开始轮询服务器。在此期间,startBuild()(即构建过程)将会运行。<a4j:poll id="poll" > reRender<h:outputText id="consoleOutput">(即更新)每轮投票后的<h:outputText id="consoleOutput">,所以它只是比如刷新<a4j:poll>,然后刷新构建脚本的日志消息。

由于session scope将为每轮汇集发送一个请求,我在<a4j:poll>中注册MBean以防止它被多次实例化。

您可以参考official demo了解有关<a4j:poll>的更多信息以及使用它的最佳做法。例如,它建议为<a4j:poll>创建一个单独的表单,并使用<a4j:region>

包围{{1}}