2016-09-26 107 views
1

我在XPages应用程序中通过Apache Poi创建了powerpoint文件。如何加快我的Xagent?

在xpage上我有一个重复控制,repeat中的每一行显示一个按钮,它启动一个执行作业的“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> 

我注意到它需要一些时间来触发每一行的导出。以下是日志中的一些“时间报告”:

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

有迹象表明,确定所有超速应用程序的许多因素很多。如果您想要了解总计算时间的底部,则需要查看每个操作以获取想法。

有相当一些资源在那里,为了您的方便

回到阅读?以下是我将开始考虑的内容:

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

事情看出来:

  • 多长时间需要导航到该文件。与autoupdate=false视图导航器是大多数时间最快
  • 你能加载从视图中的数据,而不是打开一个文档
  • 多久拿开你读
  • 你阅读的文档只有一次的文档,即使你可能需要他们更多的时候
  • 是否有低效循环
  • 进行适当的再循环
  • 你避免冗长的字符串操作的所有对象(StringBuilder的是你的朋友)
  • 如果输出做cuments大流方法(类似于SAX)可能比DOM方法更快
  • 只有你所需要的

性能小鬼可能是你没有显示的代码导入。

+0

更具体的数字是否显示触发一个xagent后需要多长时间?在我的情况下,我有一个输入和一个输出流。 –

+0

以上所有因素都会影响它。取决于你的服务器有多忙。如果你不依赖会话变量,你可以 - 使用Ajax并行启动它们 – stwissel

1

我觉得有点混乱:你的重复包含按钮。所以用户需要点击它来启动xagent。所以那些时候(16:57:05,16:57:38,16:57:58)是当有人点击那个按钮时。从代码角度来看,我没有看到任何缓慢。

除非用户连续单击它们,并且您观察xagent延迟启动。那么问题出在synchronization in XPages

您可以尝试提到xsp.session.transient财产或multiple threads预先准备您的演示文稿。