2016-09-26 6 views
1

Я создаю файлы powerpoints через Apache Poi в приложении XPages.Как я могу ускорить свой Xagent?

На 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> 

Я заметил, что для каждого экспорта требуется некоторое время для экспорта. Вот некоторые «данные о времени» из журнала:

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. Каждый раз, когда вы вызываете объект Java или метод Java в SSJS, он получает boxed/unboxed, который стоит некоторое время. Однако я подозреваю, что только этот шаг не даст вам большой отсрочки. Но это необходимый шаг для более экстремальных мер. Когда у вас есть класс Java, выполняющий вашу работу, вы можете использовать обычное Java-приложение для проверки его из командной строки и добавления дополнительных операторов таймера. Или попробуйте использовать Java profiler.

вещи, которые нужно посмотреть:

  • Сколько времени потребуется, чтобы перейти к документам.Вид Навигатор с autoupdate=false является большой частью времени быстрого
  • Вы можете загрузить данные с точкой зрения, а не открытие документа
  • Сколько времени потребуется, чтобы открыть документ, когда вы читаете
  • Читают документы только один раз , даже если вы, возможно, потребуется их чаще
  • Существуют неэффективные петли
  • ли все объекты правильно переработаны
  • ли вы избежать длительных операций над строками (StringBuilder является вашим другом)
  • Если выход сделать cuments большой поток подход (по аналогии с Sax) может быть быстрее, чем йот подход
  • Импорт только то, что вам нужно

Гремлин производительности может быть в коде вы не показали.

+0

более конкретные цифры, сколько времени требуется для запуска xagent после друг друга? в моем случае у меня есть вход и выходной поток. –

+0

Все факторы, влияющие на него. Зависит от того, насколько занят ваш сервер. Вы можете - используя Ajax запускать их параллельно - если вы не зависите от переменных сеанса – stwissel

1

Я нахожу это немного запутанным: ваш повтор содержит кнопки. Поэтому пользователю нужно щелкнуть по нему, чтобы запустить xagent. Поэтому те времена (16:57:05, 16:57:38, 16:57:58) - это когда кто-то нажал на эту кнопку. Я не вижу ничего медленного с точки зрения кода.

UNLESS пользователь щелкнул их по очереди, и вы наблюдаете заложенные старты xagent. Тогда проблема в synchronization in XPages.

Вы можете попробовать упомянули xsp.session.transient или multiple threads, чтобы подготовить вас к презентации заранее.

Смежные вопросы