2016-09-26 32 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預先準備您的演示文稿。