Lotus Notes其實也是有Schema的。取得方式如下:
Form form = db.getForm("fmFoo"); |
Lotus Notes其實也是有Schema的。取得方式如下:
Form form = db.getForm("fmFoo"); |
在取得lotus.domino.DateTime物件後,就可以replaceItemValue("DateField", dateTime);。如此在NotesClient才會顯示Date/Time而非Text型態。
要search的話得借助Function了,如下:
Lotus Notes的Java API給我感覺很不統一,以新增Document為例,官網所附的sample code是用appendItemValue(Item-name, Item-value)。可是在API上寫的Usage卻用replaceItemValue(Item-name, Item-value)。而且這兩個方法似乎都可以用,此外,要是Item-name是Null,這兩個method丟出的Exception也不同。
這兩者的差別是,appendItemValue會對Item產生multi-value,也就是假設Item1有值a,做一次insert或update item1,值也是a,則在Notes Client看到會是a,a。而若一開始沒有Item1,卻replaceItemValue,則Item1值會被產出。總結是不管insert、update,使用appendItemValue對已存在的item做append,會變成multi-value,而repalceItemValue則不會,但若Item1不存在,就會append。這和RDBMS觀念確實有差距。
佩服Rex鍥而不捨的測試,Notes在Java的運作真的有夠OOXX,Session、Database和Form這祖孫三代物件,完全不像一脈相承的物件。就列舉這三代物件每一代若設錯會如何?
NotesException: Could not get IOR from Domino Server: java.net.UnknownHostException: NOTESHOST |
本來沒有想過權限議題,因為無法Update Notes Server幾乎是因為無法連線,但在有連線狀態下無法Update資料,大概只有權限了。Notes本身架構算完整了,對映到的Java API的物件體系也很完整,但不敢恭維的是在Exception表示方式,千篇一律像以下的Exception Stack:
NotesException: Notes error: ?????????? |
前有一篇說過,用Java對Notes的Document做完新增修改後再做刪除會丟出Exception,類似如下內容:
NotesException: Notes error: ?????????? |
到了壓力測試的撰寫,如何測試對Notes做完大量資料增改的執行時間?如何得知Notes已完成所有執行?而且有個難題是Notes的Domino Server時間未必和本機同步。取得Domino Server時間如下(紅字部份):
import lotus.domino.Database; |
今天測出一個奇怪的事情:對Notes新增一筆A,再修改A沒問題,然後再刪除A就丟出NotesException,而Error Message竟是一堆問號。反觀如果Notes本來就有B這筆資料,先新增A再刪除B或先刪B再增A就沒有問題。所以矛頭就指向了Session,使用Lotus Script操作Notes,其物件階層是Session==>Database==>Document,每個物件都有recycle的method,在API定義是寫道:無條件歸還記憶體給系統。在對Notes做createDocument後,執行Document、Database的recycle再remove都還是丟出NotesException,直到執行Session的recycle後再執行remove就正常work,而且Session被recycle後毋須再createSession,可以同一份instance繼續使用。
相對於上次提到逐筆取得Document再進行remove,今天發現有批次刪除的方式,看來會更有效能:
在Microsoft的spaces寫部落格最大的好處,除了即時分享給msn的朋友之外,對岸的同好也能搜尋到。而最大的壞處,不能像Google的Blog可以多重分類標籤,而且分類標籤居然有上限,和字母同字數。原本Lotus Notes被Java call的,只好放在Java類裡>"<。
Survey了一段時間,對Lotus Notes的增改刪查有些掌握。Notes的資料庫是階層式資料庫,不同於關聯式資料庫(RDBMS),其Database是一個後綴名的.NSF檔。Notes和RDBMS的比較對照如下:
Notes的物件體系中,Database下的Document和Agent地位是並排的,DocumentCollection只是個介於Database與Document的集合,算不上一個層次。我推測發Mail的動作何以那麼複雜,係因為發Mail的動作是一支Agent程式,而Mail內容則是Document物件,兼具了Agent、Document性質。因為執行一般的Agent,根本不用繼承AgentBase,直接這樣寫就行:
public static void main(String[] args) throws Exception { |
Google其解法大多是Override NotesMain method,但欠缺使用Java standalone的例子,還得參考VB call法才取得更進階實作方式。目前踹出的solution不包括對外使用STMP,只發給Notes裡的成員。
第一步,要寫個抽象類別繼承AgentBase,我只是奇怪為何不能只繼承AgentBase就好了?
使用Java去操作Lotus Notes,大都需要import兩個Jar:Notes.jar與NCSO.jar。只用Notes.jar還需安裝Notes Client才能與Server連,而NCSO.jar則是透過IBM制定的CORBA協議DIIOP連接到Domino Server的。
由IBM提供Sample連接,老是出現以下Exception: