2012年10月5日 星期五

LotusNotes的LS2J

最近公司使用LotusNotes(以下簡稱Notes)從R5升到R8.5.3,其中就有個新的功能LS2J(其實在R6版本就開始有)。由於先前需寫WebSphere MQ的Java程式,剛好就發現了這項功能的好處與缺點。其實國外的相關文件滿多可以參考的,以下就做個簡要的說明與實做。

 在LotusDomino Designer(以下簡稱Designer)中建立一個資料庫。 Notes會自動將所需要的內容建起來。

在來就是在"程式碼\Script程式庫" 中"新增Script程式庫",名稱暫時叫"testJava",類型記得改成"Java",確定後,Designer就會幫我們做相關的配置。再來就是在Src中建立所需要的Package與Class啦…也可以在別的地方寫好的Java做匯入的動作,就能將寫好的程式直接載入進來。這邊放入個簡單回傳的code。
package my;

public class javaMain {
    public String getMessage(){
        return "This is Message from Java";
    }
} 

 
"我有相關用到的Jar檔要用,怎麼辦" ,解法有二。
  1. 選"匯入"到"保存"中(存到Server中)
  2. 放在"{NotesPath}\jvm\lib\ext"中(存在Clinet中)
這兩個差在那?讀取資料庫的效率!!如果Jar檔過大,在JVM開始載入相關的Jar檔,在保存中的Jar,需讀取下來,所以需要網路傳送的時間,所以效能較存在Clinet中慢。但如果存在Clinet中,會有發布的問題,因為是每個Clinet都要放置這個Jar檔,不然Notes會直接當給你看。

再來就可以寫LotusScript(LSX)的部分了 ,這邊用代理程式來測試,首先,新增一個代理程式,名稱就叫"testJAVAFromAgent",類型選"LotusScript",建立後,在"Options"中加入下述兩行
Use "testJava"
UseLSX "*javacon"
第一行就是上面寫的Script程式庫的名稱
第二行就是等一下會使用到的LS2J的元件

選Initialize,並加入下述程式碼

Sub Initialize
    Dim jsession As JavaSession
    Dim jclass As JavaClass
    Dim jObject As JavaObject
    Dim jerr As JavaError
    On Error GoTo Catch   
    Set jsession = New JavaSession
    Set jclass = jsession.GetClass("my.javaMain")   
    Set jObject = jclass.Createobject()   
    MesssageBox jObject.getMessage()
    Catch:   
    MessageBox "LS Error: " & Error
    Set jerr = jsession.GetLastJavaError()   
    ret=ErrorHandling1(jerr.ErrorMsg())
    MessageBox " Stack trace: " & jerr.Stacktrace()
    jsession.Clearjavaerror    
End Sub


建立JavaSession,再由JavaSession取得要使用的Class名稱並給JavaClass,再由JavaClass產生Object出來,最後就是呼叫該Object有的method。最後Catch的部分則是當如果程式在Java中有throw exception時,可以透過catch來抓取問題出來,以利問題的排除

其他
  1. JVM在第一次載入時會慢
  2. 一個JavaSeasion同名的Class只能有一個,先載入的為主,以Clinet為單位,所以只要JVM一將Class Load進來開不同的資料庫Seasion都會是同一個所Loading進來的Class也是共用
  3. 在Java 中寫System.out.println會出現在那?在NotesLotusClinet的工具列中的"工具\顯示JAVA偵錯控制台"所有的System.out.println都會出現在這
  4. 寫Java程式時,由於JVM已經起來,所以不會重新載入重寫過的Class,所以需將Notes重開,讓JVM重新載入新寫的Class

沒有留言:

張貼留言