面向傳統 LotusScript 開發者,本文從 Java 語法對比、Domino 對象模型映射、三大實戰案例(發郵件、遍歷視圖、生成郵件報表)、JVM 版本、recycle 內存管理、安全策略、外部 JAR 引用等全方位講解,助你平滑遷移到 Java Agent 開發。
import lotus.domino.*;
public class JavaAgent extends AgentBase {
public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();
// 業務代碼
} catch (Exception e) {
e.printStackTrace();
}
}
}
AgentBase,覆寫 NotesMain() 入口。getSession() 獲取會話,getAgentContext() 獲取當前上下文(數據庫、用戶等)。try-catch 捕獲,Domino 方法拋出 NotesException。| 特性 | LotusScript | Java |
|---|---|---|
| 類名前綴 | NotesDatabase, NotesDocument | Database, Document(去掉 Notes) |
| UI 類 | NotesUIWorkspace 等 | 無對應(Java Agent 無 UI 交互) |
| 變量聲明 | Dim x As String | String x; |
| 大小寫敏感 | 否 | 是 |
| 構造器 | Sub New | 類名() |
| 內存釋放 | 自動 | 必須手動 recycle() |
關鍵差異:
agentContext.getCurrentDatabase() 而非 session.CurrentDatabase。doc.createRichTextItem("Body") 而非 New NotesRichTextItem。recycle(),防止 C++ 底層句柄洩漏導致服務器崩潰。View view = db.getView("ViewName");
Document doc = view.getFirstDocument();
Document tmp;
while (doc != null) {
System.out.println(doc.getCreated());
tmp = view.getNextDocument(doc);
doc.recycle(); // 關鍵:釋放當前文檔
doc = tmp;
}
循環中必須用臨時變量接收下一個文檔,隨即 recycle() 當前文檔,否則內存線性增長。
names.nsf 的 People 視圖,遍歷人員文檔。session.getDatabase(mailServer, mailFile) 打開各郵件庫。recycle() 每個臨時 Database 與 Document。AccessControlException 需在 java.policy 授權。jvm/lib/ext、配置 JavaUserClasses notes.ini 變量。