?? +
字號:
[Domino]如何用java遠程訪問Domino郵箱數據(轉載) 05.12.28 from smoking_boy 相關文章(8) 來源 以文找文 上一篇 下一篇
這篇文章不錯,快看看收藏了該文章的所有2人,我也要收藏
應用場景
我們需要遠程訪問IBM Lotus Domino R6服務器,從中獲取用戶郵箱的郵件信息等關鍵數據。我們不需要提供每一個用戶密碼以及ID文件。
技術關鍵詞
Java:
Java 和 Lotus Notes/Domino 是理想的開發組合。
DIIOP:
IIOP,是Internet Inter-ORB Protocol,一種傳輸層協議。它用于CORBA 2.0及兼容平臺上。IIOP協議是要建立以下幾個部分:一個IIOP到HTTP的網關,使用這個網關可以讓CORBA客戶訪問WWW資源;一個HTTP到IIOP的網關,通過這個網關可以訪問CORBA資源;一個為IIOP和HTTP提供資源的服務器,一個能夠將IIOP作為可識別協議的瀏覽器。
其中ORB呢,Object Request Broker(請求對象代理),一個中間件。它可以建立對象之間的client/server關系。通過ORB,一個client可以透明的引用同一臺機器上或網絡上的一個server對象的方法。ORB解釋該調用并負責查找一個實現該請求的對象,找到后,把參數傳給該對象,調用它的方法,最后返回結果。
那么,DIIOP就是Domino IIOP了,什么意思呢?就是一個服務器端的任務,通過Domino ORB,來使得Domino Server與Java applets交互,雙方使用IIOP來交互和交換對象數據。
IOR:
IOR,Interoperable Object Reference。
實際上,就是Domino服務器上的一個文件diiop_ior.txt的內容,類似于:
IOR:01012d032900000049444c3a6c6f………………………
,它在c:\lotus\domino\data\domino\html文件夾下。
客戶端java程序向domino服務器發出CORBA請求,服務器通過HTTP協議返回給客戶端IOR字符串,之后客戶端通過IIOP協議與服務器進行通訊。
從這一點來看,IOR 實際上是一個對象的字符串編碼,包含對Domino服務器的 CORBA 訪問的識別信息。客戶端java程序將字符串 IOR 解碼,就可以用它來尋找到對應的主機并建立遠程會話了。
Domino對象
Domino對象類的結構基于包容模型,包容模型定義了對象的范圍。容器對象通常被用來訪問它所包含的子對象。
關閉一個容器對象意味著其包含的全部子對象也將被關閉。例如,你建立了一個Database對象,使用它創建了一個Document對象,如果關閉了 Database對象,Document 對象也會隨之關閉。如果容器對象超時,它將會被自動關閉,其包含的對象也將被自動關閉。因此你應該在容器對象超時或關閉前保存你的任何改變。
Domino Database:
Domino中的Database,指的是在一個名字下存儲的,一個集合,包含了Document以及相應的form、view和folder。Java中有lotus.domino.Database。
我們通常可以通過session對象的getDatabase方法,或者DbDirectory對象的getFirstDatabase/ getNextDatabase方法,來獲取Database對象的實例。
Domino View:
Database集合中有著各種View。Java中有lotus.domino.View。可以通過Database對象的getView方法,來獲取View對象的實例。
Domino Document:
Domino中的Document,指的是在一個Database的一個條目,包含了fileds,text,numbers,graphics等等。Java中有lotus.domino.Document。
可以通過Database對象的getView方法,來獲取View對象的實例。
環境準備
客戶端java開發:
安裝Lotus Notes Client。
安裝Eclipse 3.1 with Eclipse-JDT-SDK。
安裝JRE 1.3.1。Lotus Notes/Domino 的R5/6版本使用的是 Java 1.3.1,所以必須安裝該軟件以使用正確的版本來編譯項目。(Lotus Notes/Domino 7 使用 JDK 1.4。)雖然許多 Java 代理和程序都可以編譯,而且沒什么問題,但可能會陷入另一些問題,比如使用一個 JDK 版本構建程序,卻在另一個版本上運行。
從服務器端Lotus目錄下復制NCSO.jar以及NCSO.cab文件。遠端訪問Domino Server,需要這個jar包。
Domino 提供了兩個 JAR 文件,用于編程訪問 Domino 對象。這兩個文件是 Notes.jar 和 NCSO.jar。Notes.jar 用來訪問 本地的 Domino 服務器(此時 Lotus Domino 和 Java 程序運行在相同的服務器上)。NCSO.jar 包含了用來訪問遠程服務器的其他 CORBA/IIOP 代碼。
在決定使用哪個 JAR 文件時,請考慮以下因素:
運行的 Java 程序和 Lotus Domino 的相對關系如何?如果它們運行在相同的機器上,那么使用 Notes.jar 可以獲得更好的性能。
您關心可擴展性嗎?即使現在您是在相同的機器上運行 Java 程序(單獨的 Java 程序和非 J2EE 的程序)和 Lotus Domino,將來您可能會發現需要將其擴展到專用的服務器上。在這種情況中,請使用 NCSO.jar ,這樣可以獲得更好的適應能力。
Java 程序要在一個應用服務器上運行嗎?在 WebSphere 的情況中,即使它與 Lotus Domino 在相同的機器上,也需要使用 NCSO.jar。
如果你不用超級管理員用戶名密碼創建連接session,而是采用Domino Server ID,那么請從Domino服務器上Lotus目錄下復制一個server.id文件以備用。
如果你想直接使用diiop_ior.txt,把這個diiop_ior.txt復制到本地。
Domino服務器端配置:
必須配置的項目:
必須設置 Domino 服務器監聽 IIOP 請求:
首先確保安裝了DIIOP,你可以在安裝過程中選擇DIIOP,這樣當安裝結束,啟動Domino Server Console時,就會看到提示“
DIIOP Server Listen for connect requests on TCP Port:63148
DIIOP Server Ultility task”。
可以在 Domino Console中執行 show task 或 load diiop 命令,可以幫助判斷現在是否已經安裝了 DIIOP。如果還沒有安裝,請從 Domino 安裝光盤上安裝 DIIOP。
否則,就要修改lotus目錄下的Notes.ini文件了。找到以ServerTask開頭的一行,找找看等號后面的字符串中是否有DIIOP,如果沒有,就加上一個,然后重新啟動Domino Server。這樣,Domino啟動時就會自動加載DIIOP。
ServerTask一行類似于:
ServerTasks=Update,Replica,Router,AMgr, AdminP,CalConn,Sched,DIIOP,HTTP,LDAP
如何獲取IOR:
在 DIIOP 進程啟動時,它在 Domino HTTP 根目錄(Windows 中 Domino 默認的安裝目錄為 C:\lotus\domino\data\domino\html)中創建一個名為 diiop_ior.txt 的 IOR(Internet Object Reference)對象。
如何得到這個diiop_ior.txt內容(也就是IOR了),有兩個辦法:
第一個就是,您通過HTTP方式向服務器請求這個文件。那么這個時候,如果您使用 Lotus Domino 作為 HTTP 服務器,就必須告訴 DIIOP 將這些文件放到您的 HTTP 服務器的根 HTML 目錄中。配置方法如下所示:
1. 運行Domino Admin 6,點擊“XXX Domain”圖標,打開 Domino Server 文檔。
2. 選擇 Internet Protocols 屬性頁 - DIIOP 子屬性頁。
3. 在 External HTML directory 字段中,輸入非 Domino HTTP 服務器的根 HTML 目錄的完整路徑名。
4. 保存這個 Server 文檔,并重新啟動 DIIOP。
第二個辦法,是把這個diiop_ior.txt復制到客戶端機器上,直接使用。
TCP/IP連接檢查:
遠程訪問還需要設置 Domino Server和客戶端進行 TCP/IP 連接。Domino Server必須能夠通過 TCP/IP 進行訪問。必須能夠用 Internet 名稱從客戶端ping 到服務器。
DIIOP設置:
檢查 Domino Directory 中 Server 文檔。轉至 Ports 選項卡,然后轉向 Internet Ports 選項卡。查看 Web 選項卡(用于 HTTP)并找到 DIIOP 選項卡。這些部分有用于指定端口號以及啟用/禁用端口的字段。通常,HTTP 的端口號是 80,DIIOP 的端口號是 63148。下圖顯示了 Internet Ports--DIIOP 選項卡:
No.
Items
Descriptions
1
Name and Password
DIIOP 驗證需要名稱和密碼
2
Anonymous
DIIOP 驗證不需要名稱和密碼
3
Enforce server access settings
DIIOP 使用 Security 選項卡下的 Server Access 設置
如果訪問數據庫時不知道文件名稱(例如,要使用 DbDirectory.getFirstDatabase),那么必須允許通過網絡瀏覽文件名。轉至 Internet Protocols 選項卡、HTTP 選項卡和 R5 Basics 選項卡。然后將“Allow HTTP clients to browse databases”設為 Yes。
配置權限:
必須給你當前建立session的用戶配置權限,否則你將會遇到下面的錯誤:
NotesException: You must have permission to sign documents for server based agents
at lotus.domino.NotesExceptionHelper.read(Unknown Source)
at lotus.domino.NotesExceptionHolder._read(Unknown Source)
at lotus.priv.CORBA.iiop.RepImpl.invoke(Unknown Source)
at lotus.priv.CORBA.portable.ObjectImpl._invoke(Unknown Source)
at lotus.domino.corba._IDocumentStub.send(Unknown Source)
at lotus.domino.cso.Document.send(Unknown Source)
at SendMail.send(SendMail.java:203)
at SendMail.main(SendMail.java:28)
轉至 Security 選項卡,找到“Programmability Restrictions”,在“Run unrestricted methods and operations:”和“Sign agents to run on behalf of someone else:”后面輸入你的用戶名:
總之,如果你遇到了權限錯誤,就到這里來配置。
開始編寫
Add External JARs:
在Eclipse 3.1,選中你的項目,右鍵菜單中“Build Path”à“Add External Archives”,在文件選擇對話框中找到并選中你前面復制到本地的NCSO.jar,如下圖所示。
添加了 JAR 文件之后,可以使用項目中 Notes Java API 定義的類和接口。 Domino Designer on-line help 中有關于 Notes Java API 的文檔。
然后選擇 JRE System Library采用1.3.1版本的。
獲取IOR:
首先,我們去獲取IOR。
還是前面說過的兩種辦法。
第一種,與Domino Server聯系獲取:
Code
String dominoHost = "192.168.1.223"; // 這里填寫主機名或IP地址
String strIOR = null;
URL url = new URL("http://" + dominoHost + "/diiop_ior.txt");
InputStream in = url.openStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
for (boolean bExit = false; !bExit; ) {
String line = br.readLine();
if (line == null) {
bExit = true;
}
else {
if (strIOR == null)
strIOR = line;
else
strIOR = strIOR + line;
if (strIOR.startsWith("IOR:"))
bExit = true;
}
}
br.close();
第二種,取得本地文件:
Code
FileInputStream fin = new FileInputStream("c:\\diiop_ior.txt");
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -