我想提出一个在服务器上执行maven构建的Web应用程序,并在发生时显示构建控制台输出。我正在寻找类似于Hudson中可用的东西。
我已阅读此处给出的解决方案:Need to execute shell script from webapp and display console output in page
好吧,我可以运行脚本并获取整个输出,但我希望在构建发生时更新UI。我怎么能做到这一点?
使用JSF和Jboss Richfaces组件可以做到这一点吗?
答案 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>