Java對Domino Objects的訪問控制

Java 對 Domino Objects 的訪問是通過高級包 lotus.domino 進行的。根據運行時環境,這個包中的接口是在其他兩個包中的一個包中實現的:
  
  lotus.domino.local 提供了從同一計算機上的 Notes/Domino 軟件進行調用。
  
  lotus.domino.cso 提供了從通過遠程連接訪問的 Domino 服務器進行調用。
  
  對於本地訪問,Java 程序運行在安裝有 Notes 客戶機或者 Domino 服務器的計算機上。本地類由 JNI(Java Native Interface)構建來,用於訪問與 JVM(Java Virtual Machine)相同的進程中的 Notes/Domino 二進制文件。對於遠程訪問,Java 程序使用 CORBA(Common Object Request Broker Architecture)請求 Domino 服務器所提供的服務。遠程類使用 CORBA 通過 TCP/IP 網絡訪問服務器。遠程訪問由以下兩個部分組成:
  
  客戶機通過 HTTP 協議獲得服務器的初始對象,作爲 IOR (Interoperable Object Reference)。
     客戶機通過 IIOP 連接進一步獲得其他對象。

  
 2004.12.14.10.36.11.1.jpg

  在 lotus.domino 中,NotesFactory 類提供了 createSession 和其他方法,以便在 Java 應用程序和 servlet 中啓用對 Domino Objects 的訪問。特殊的調用方式確定了訪問是本地還是遠程的。要編譯使用 lotus.domino 包的 Java 程序,類路徑必須包含 Notes.jar(本地)或者 NCSO.jar(遠程)。例如:
  set classpath=%classpath%;c:/lotus/domino/Notes.jar 或者 set classpath=%classpath%;c:/lotus/domino/data/domino/java/NCSO.jar 其中 Notes.jar 可以在任何 Notes/Domino 安裝的程序目錄中找到。NCSO.jar 可以在 Domino Designer 或 Domino 服務器數據目錄下的 domino/java 目錄中找到。
  
  本地調用

  createSession 的調用沒有參數,第一個參數爲 null 或者第一個參數爲空字符串都表示本地調用。下列代碼是等價的:
  
  Session s = NotesFactory.createSession()

  Session s = NotesFactory.createSession((String)null)

  Session s = NotesFactory.createSession("")

  
  將 null 轉換成 String,以避免過載衝突。要從應用程序和 servlet 中實現本地調用,路徑中必須包含 Notes/Domino 的程序目錄,類路徑中必須包含 Notes/Domino 程序目錄中的 Notes.jar。例如:
  
  set path := %path%;c:/lotus/domino

  set classpath := %classpath%;c:/lotus/domino/Notes.jar

  
  Notes.jar 中包含 lotus.domino 和 lotus.domino.loca 包。本地調用需要用 NotesThread 類管理線程。NotesThread 類擴展了 java.lang.Thread,包含專門針對 Domino 的初始化和終止代碼。您有以下三種選擇:
  
  通過繼承來執行線程。

  通過 Runnable 接口來執行線程。
  
  通過靜態方法來執行線程。
  
  通過繼承來執行線程
  要通過繼承來執行線程,需要擴展 NotesThread,而不是 Thread,並且需要包含 runNotes 方法,而不是 run 方法。NotesThread 線程可以和任何其他線程一樣通過 start 方法來啓動。這種方式比靜態方法(稍後討論)容易使用,且不易出錯。
  
  import lotus.domino.*;
  

  public class myClass extends NotesThread

  {

  public static void main(String argv[])

  {

  myClass t = new myClass();

  t.start();

  }

  public void runNotes() // entry point for Notes thread

  {

  try

  {

  Session s = NotesFactory.createSession();

  // Operational code goes here

  }

  catch (Exception e)

  {

  e.printStackTrace();

  }

  }

  }
  


  通過 Runnable 接口來執行線程

  要通過 Runnable 接口來執行線程,需要實現 Runnable 幷包含 run 方法,這與使用線程的任何類相同。當您因爲正在擴展其他類而不能擴展 NotesThread 時,可以使用這種方式。
  
  import lotus.domino.*;

  public class myClass implements Runnable

  {

  public static void main(String argv[])

  {

  myClass t = new myClass();

  NotesThread nt = new NotesThread((Runnable)t);

  nt.start();

  }

  public void run() // entry point for thread

  {

  try

  {

  Session s = NotesFactory.createSession();

  // Operational code goes here

  }

  catch (Exception e)

  {

  e.printStackTrace();

  }

  }

  }

  
  通過靜態方法來執行線程

  要通過靜態方法來執行線程,需要調用 sinitThread() 來初始化線程,調用 stermThread() 來終止線程。stermThread() 的調用必須與 sinitThread() 的調用嚴格一一對應;推薦將 stermThread 放在“finally”程序塊裏。靜態方法適用於不可能進行繼承的線程,或者適用於需要更好地控制基於事件的線程。
  
  import lotus.domino.*;

  public class myClass

  {

  public static void main(String argv[])

  {

  try

  {

  NotesThread.sinitThread(); // start thread

  Session s = NotesFactory.createSession();

  // Operational code goes here

  }

  catch(Exception e)

  {

  e.printStackTrace();

  }

  finally

  {

  NotesThread.stermThread(); // must terminate every thread

  }

  }

  }
  


  進行本地調用的每個應用程序的線程都必須初始化一個 NotesThread 對象。它包含了訪問 Domino Objects 的 AWT 線程。監聽器線程必須使用靜態方法,因爲無法從 NotesThread 中繼承它們。 既進行本地調用又進行遠程調用的應用程序可以動態地決定何時使用靜態方法 sinitThread 和 stermThread。運行本地線程時,也可以進行遠程調用;但不要將通過一個會話獲得的對象用於對其他會話的調用。應該避免使用多線程,除非有非常充分的理由,比如處理文件輸入/輸出和 Web 請求時,要繼續進行操作。觀察遵循以下指導原則:
  
  在同一會話中,可以跨線程共享、同步和回收 Domino

  Objects。如果每個線程使用不同的會話,那麼就會失去這些功能;必須明確地在每個線程的基礎上管理同步和回收。
  
  不要跨線程使用 DbDirectory。

  允許在多線程中訪問現有文檔,但只在一個線程中進行訪問文檔將簡化內存管理。將訪問限制在一個線程,這樣就可以不檢查其他線程直接進行回收。跨線程創建文檔始終是安全的,並且這些對象可以不管其他線程就進行回收。
  
  配置文件文檔是基於每個線程進行緩存的。如果出現更新競爭,那麼將保留最後一個線程的更新。
  
  注意不要刪除其他線程中通過視圖或集合進行導航所需的文檔。
  
  當子對象被用於其父對象之外的其他線程時,父線程要等所有子線程都結束後才能結束。當在 AWT 事件處理程序中使用 Domino Objects 時,這一點尤其重要。
  
  遠程調用

  在進行遠程調用時,createSession 簽名的第一個參數是非空字符串。第一個參數通常用來標識 Domino 服務器所在的計算機。例如:
  
  Session s = NotesFactory.createSession("myhost.east.acme.com")
  
  或者
  
  Session s = NotesFactory.createSession("myhost.east.acme.com:63148")
  
  第二個示例指定了端口號,這樣就無需在 myhost.east.acme.com 上運行 Domino Web 服務器。
  


  要從應用程序或者 servlet 執行遠程調用,客戶機計算機的類路徑中必須包含 NCSO.jar。NCSO.jar 包含 lotus.domino 包、lotus.domino.cso 包、lotus.domino.corba 包以及 ORB 類,ORB 類包含用於遠程類的實現代碼。對於已安裝的 Domino Designer 和 Domino 服務器軟件,NCSO.jar 位於 Domino 數據目錄下的 domino/java 子目錄中。對於沒有安裝 Domino 軟件的計算機,必須從安裝該軟件的計算機上覆制歸檔文件。
  
  類路徑必須包含歸檔文件,例如:
  
  set classpath := %classpath%;c:/lotus/domino/data/domino/java/NCSO.jar
  
  編碼

  編碼比較簡單。遠程調用不使用 NotesThread。只需使用主機名稱和(可選)端口號進行 createSession 調用即可。
  


  不使用線程時,模板將如下所示:
  


  import lotus.domino.*;

  public class myClass

  {

  public static void main(String argv[])

  {

  try

  {

  String host = "myhost.east.acme.com:63148";

  Session s = NotesFactory.createSession(host);

  // Operational code goes here

  }

  catch(Exception e)

  {

  e.printStackTrace();

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章