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