簡體   English   中英

如何通過Domino Designer中的外部jar從import語句獲取類?

[英]What should i do to get classes via import statement from external jars in Domino Designer?

我使用Domino服務器並開發java代理。 通常我將外部jar文件放入腳本庫,但定期獲取OutOfMemory。 我將jar從腳本庫中提取到jvm / lib / ext。 我可以通過ClassLoader獲取類,但不能通過import語句。 我應該怎么做才能通過import語句使它工作?

您實際上可以明確地將jar添加到Java代理。 請注意,默認情況下Java代理沒有包名稱,並且在引用語句中引用包時,您需要引用正確的包名稱。 此處描述將jar導入代理,以及此處此處的版本8.5

此外,我懷疑你沒有明確清理你的java對象。 JVM和Domino內存堆之間的連接“很弱”。 所以你必須在Domino對象上擁有自己的垃圾收集,以保持服務器的內存清潔。 它對我來說仍然是黑魔法,但我的理解是,盡管代理應該“包含”會話,然后在終止時釋放內存,但未正確回收的Domino對象可能會泄露Domino的堆內存。 以下是我保持記憶清潔的簡單提示:

1 /將會話對象保留在包裝器對象中 創建一個在其中包含Domino會話對象的類(我稱之為SessionWrapper)。 然后僅在NotesMain方法中聲明SessionWrapper對象,不要在類級別聲明它。 這個SessionWrapper類需要擁有調用Session.recycle()的自己的循環方法,並且需要在NotesMain的末尾調用它。 其原因在第2點解釋。 如果你沒有在NotesMain中調用任何其他方法,那么你真的不需要這個包裝器。 關於回收會話,請參見第4點。

2 /將SessionWrapper傳遞給需要Domino訪問的所有方法 基本上你在這個包裝類中傳遞會話作為參數。 這是因為我們不希望在類級別聲明會話對象。 這並不理想,但它可以防止因將會話類保持在類級別而導致的內存泄漏。

3 /積極的回收 在我看到這個示例循環之前,這對我來說從來沒有多大意義

ViewEntryCollection vec = view.getAllEntries();
ViewEntry ve = vec.getFirstEntry();
While (ve!=null) {
 ViewEntry veNext = vec.getNextEntry(ve);
 // do stuff

 ve.recycle;
 ve = null;
 ve = veNext;
}

了解“ve”對象如何被回收並且veNext正在獲取下一個對象。 基本上你需要在完成它之后回收每個對象,“getNext”方法實際上並沒有回收Domino堆內存中的對象,如果你不回收它,它就是孤立的,Domino也不會清理它,服務器最終會耗盡Domino對象的內存。 請注意,我不回收veNext。 我不需要因為我指定ve => veNext。 “ve”將鏈接到同一個Domino對象,並在循環結束時調用recycle ve。 從中可以看出,許多java對象可以指向后端的同一個Domino實例對象。 如果我試圖在ve.recycle之后調用veNext.recycle,我會得到一個“對象已被刪除或回收”錯誤。

4 / NotesMain結束時的Recylce會話 確保在NotesMain的末尾調用SessionWrapper.recycle()以確保將該位內存釋放回服務器。

5 /確保為服務器上的JVM提供足夠的內存 請參閱此技術說明 還要注意“HTTPJVMMaxHeapSizeSet = 1”這是一個奇怪的設置,以確保內存設置“堅持”..更多關於它在這里

多年來,IBM沒有提供對象的內部清理任務,這些對象非常需要消除開發人員的這種開銷。 然后,您需要顯式釋放內存,這也是性能損失,但它是穩定性的必要折衷。 這些要點並非詳盡無遺,但我發現在觀察這些規則時,代理和servlet的穩定性大大提高。

  1. 關閉Lotus Notes客戶端和Designer。
  2. 將JAR放在本地jvm / lib / ext中。
  3. 打開Lotus Notes客戶端和Designer。

現在您可以導入類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM