开发者

Display console output in webapp

I want to come up with a web application that does a maven build on a server and displays the build console output as it happening. I am looking for something similar to what is available in Hudson.

I have read the solution given here : Need to execute shell script from webapp and display consol开发者_Go百科e output in page

Well, I can get run the script and get the entire output, but I want the UI to be updated as the build is happening. How can I accomplish this?

Is this possible to do this using JSF and Jboss Richfaces components?


Yes , you can accomplish this using Richfaces 's <a4j:poll> , which will periodically poll a request to the server . For example ,

View:

<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>

The 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;
    }

}

The log messages outputted by the build script are appended to the string buffer (buildOutputSb) and we use a <h:outputText id="consoleOutput"> to display the value from this string buffer to the UI.

Once the "Start Build" button is pressed , the enablePolling properties will set to true , which enables the <a4j:poll id="poll"> and causes it to start polling the server periodically . At the meantime , startBuild() (ie. building process) will run .The <a4j:poll id="poll" > will reRender (ie. update) the <h:outputText id="consoleOutput"> after each round of polling, so it just like refreshing the <h:outputText id="consoleOutput"> and hence refreshing the log messages of the build script.

As the <a4j:poll> will send an request for each round of pooling , I register the MBean in the session scope to prevent it is instantiated many times.

You can refer to the official demo for more information about <a4j:poll> and the best practices of using it . For example , it suggests that to have a separate form for <a4j:poll> and surrounding <a4j:poll> with <a4j:region>

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜