我在XPage应用程序中通过Apache Poi创建powerpoint文件。
在xpage上我有一个重复控件,重复中的每一行都会显示一个按钮,用于启动" xagent"做到了这一点(SSJS)。
<xp:button id="button7" value="Download">
<xp:eventHandler event="onclick" submit="true"
refreshMode="norefresh">
<xp:this.action><![CDATA[#{javascript:sessionScope.docId = obj.unid;
sessionScope.slideType = "TITLE_AND_CONTENT";
sessionScope.fieldList = ["refName","refSub","refStrength","refWeakness"];
context.redirectToPage("StreamPresentation.xsp");}]]></xp:this.action>
</xp:eventHandler></xp:button>
我注意到触发每行的导出需要一些时间。这是一些&#34;时间报告&#34;来自日志:
2016-09-26 16:57:05 HTTP JVM: time:2016-09-26 16:57
2016-09-26 16:57:05 HTTP JVM: docId:6AD84C823BD8A52FC125803A0051BE49
2016-09-26 16:57:38 HTTP JVM: time:2016-09-26 16:57
2016-09-26 16:57:38 HTTP JVM: docId:660E0CC12C3E1046C1258039006AA394
2016-09-26 16:57:58 HTTP JVM: time:2016-09-26 16:57
2016-09-26 16:57:58 HTTP JVM: docId:C8DD8933E26057C3C1258039006A3ED0
如何加快流程?
我的xagent代码看起来如下:
importPackage(java.lang);
importPackage(org.apache.poi.xslf.usermodel);
//getting sessionvariables
var sessSlide = sessionScope.slideType;
var docId = sessionScope.docId;
print("time:" + @Now());
print("docId:" + docId);
var sessFields = sessionScope.fieldList;
var doc:NotesDocument;
doc = database.getDocumentByUNID(docId);
var ppt: XMLSlideShow = new XMLSlideShow();
/*
* creating slides here...
/*
//The Faces Context global object provides access to the servlet environment via the external content
var extCont = facesContext.getExternalContext();
//The servlet's response object provides control to the response object
var pageResponse = extCont.getResponse();
//Get the output stream to stream binary data
var pageOutput = pageResponse.getOutputStream();
//Set the content type and headers
pageResponse.setContentType("application/vnd.openxmlformats-officedocument.presentationml.presentation");
pageResponse.setHeader("Cache-Control", "no-cache");
pageResponse.setHeader("Content-Disposition", "inline; filename=" + fileName);
ppt.write(pageOutput);
pageOutput.flush();
pageOutput.close();
facesContext.responseComplete();
答案 0 :(得分:2)
有许多因素决定了应用程序的全速度。如果你想要达到总计算时间的底部,你需要查看每个操作以获得一个想法。
为了您的方便,那里有相当多的资源
从阅读回来?以下是我要开始研究的内容:
第一站是将整个代码从SSJS移动到Java。每次在SSJS中调用Java对象或Java方法时,它都会被装箱/取消装箱,这需要花费一些时间。然而,我怀疑单独这一步不会给你很多缓解。但这是采取更极端措施的必要步骤。 一旦Java类完成了您的工作,您就可以使用常规Java应用程序从命令行对其进行测试并添加更多计时器语句。或者尝试使用Java profiler。
需要注意的事项:
性能gremlin可能在您没有显示的代码中。
答案 1 :(得分:1)
我发现它有点令人困惑:你的重复包含按钮。因此用户需要单击它才能启动xagent。那些时候(16:57:05,16:57:38,16:57:58)是有人点击那个按钮的时候。从代码的角度来看,我没有看到任何缓慢。
除非用户连续点击了所有这些内容,否则您会看到xagent延迟启动。然后问题出在synchronization in XPages。
您可以尝试提及xsp.session.transient
财产或multiple threads,以便提前为您准备演示文稿。