我怎样才能加速我的Xagent?

时间:2016-09-26 17:50:28

标签: xpages xpages-ssjs

我在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();

2 个答案:

答案 0 :(得分:2)

有许多因素决定了应用程序的全速度。如果你想要达到总计算时间的底部,你需要查看每个操作以获得一个想法。

为了您的方便,那里有相当多的资源

从阅读回来?以下是我要开始研究的内容:

第一站是将整个代码从SSJS移动到Java。每次在SSJS中调用Java对象或Java方法时,它都会被装箱/取消装箱,这需要花费一些时间。然而,我怀疑单独这一步不会给你很多缓解。但这是采取更极端措施的必要步骤。 一旦Java类完成了您的工作,您就可以使用常规Java应用程序从命令行对其进行测试并添加更多计时器语句。或者尝试使用Java profiler

需要注意的事项:

  • 导航到文档需要多长时间。 <{1}}的视图导航器大部分时间都是最快的
  • 您可以从视图加载数据而不是打开文档
  • 打开您阅读的文件需要多长时间
  • 您是否只阅读过一次文档,即使您可能需要更多文档
  • 是否存在效率低下的循环
  • 是否所有对象都已正确回收
  • 你是否避免冗长的字符串操作(StringBuilder是你的朋友)
  • 如果输出文档很大,则流方法(类似于Sax)可能比dom方法更快
  • 仅导入您需要的内容

性能gremlin可能在您没有显示的代码中。

答案 1 :(得分:1)

我发现它有点令人困惑:你的重复包含按钮。因此用户需要单击它才能启动xagent。那些时候(16:57:05,16:57:38,16:57:58)是有人点击那个按钮的时候。从代码的角度来看,我没有看到任何缓慢。

除非用户连续点击了所有这些内容,否则您会看到xagent延迟启动。然后问题出在synchronization in XPages

您可以尝试提及xsp.session.transient财产或multiple threads,以便提前为您准备演示文稿。