|
遠(yuǎn)程訪問Mnemosyne
下面我們來討論在servlet服務(wù)器上訪問遠(yuǎn)程Mnemosyne的方法。要在無需特定服務(wù)器在線的情況下加載一個(gè)包含對(duì)話信息的Mnemosyne,需要?jiǎng)?chuàng)建一個(gè)FailoverHandler的實(shí)例,F(xiàn)ailoverHandler利用JDK 1.3中的Proxy API處理對(duì)話服務(wù)器當(dāng)機(jī)的問題。FailoverHandler把一個(gè)代表訪問遠(yuǎn)程對(duì)話服務(wù)器的RMI URL的字符串?dāng)?shù)組作為參數(shù),然后,從Proxy類中獲取Mnemosyne實(shí)例。下面的SessionManager類中的initializeMnemosyne()方法可以顯示出這一切是如何完成的:
public static void initializeMnemosyne(String[] rmiURLs) { // 設(shè)置當(dāng)機(jī)服務(wù)器的處理程序 FailoverHandler fh = new FailoverHandler(null, rmiURLs);
// 得到Mnemosyne. 的一個(gè)實(shí)例 _Mnemosyne = (Mnemosyne)Proxy.newProxyInstance(Mnemosyne.class.getClassLoader(), new Class[] { Mnemosyne.class }, fh ); }
如果用Proxy類獲取Mnemosyne的實(shí)例,所有的方法調(diào)用必須通過FailoverHandler的 invoke()方法進(jìn)行。當(dāng)有方法訪問Mnemosyne時(shí),F(xiàn)ailoverHandler將試著調(diào)用該方法訪問一個(gè)遠(yuǎn)程對(duì)象。如果方法調(diào)用失。ɡ绶⻊(wù)器關(guān)機(jī)),F(xiàn)ailoverHandler將從提供給構(gòu)造器的URL清單中再取得下一個(gè)URL,這樣就會(huì)無縫地轉(zhuǎn)向下一個(gè)對(duì)話服務(wù)器。
// 建立遠(yuǎn)程加載類的URL清單 public FailoverHandler(Remote delegate, String[] delegateURLS) { this.delegateURLS = delegateURLS;
// 如果這個(gè)URL無效,則獲取下一個(gè)有效的URL try { this.delegate = ((delegate == null)?getNextValidDelegate():delegate); } catch (RemoteException ex) { // 如果發(fā)生遠(yuǎn)程意外錯(cuò)誤,則該URL不能使用,向調(diào)用者發(fā)送一個(gè) //IllegalArgumentException事件 throw new IllegalArgumentException("Remote URLs could not " + "be found"); }
}
public Object invoke(Object proxy, Method method, Object[] arguments) throws Throwable { while(true) { try { file:// 嘗試對(duì)獲得的最后一個(gè)URL調(diào)用被調(diào)用的方法 return method.invoke(delegate, arguments); } catch(InvocationTargetException invocationTargetException) { file://如果獲得的URL無效,則取下一個(gè)URL try { throw invocationTargetException.getTargetException(); } catch(RemoteException remoteException) { delegate = getNextValidDelegate(); } } } }
file://從構(gòu)造器中的URL清單中獲得下一個(gè)URL protected Remote getNextValidDelegate() throws RemoteException { for(int i = 0; i < delegateURLS.length;i++) { try { return Naming.lookup(delegateURLS[i]); } catch(Exception exception) { } }
throw new RemoteException("All lookup failed"); }
當(dāng)使用FailoverHandler對(duì)象時(shí),從一個(gè)對(duì)話服務(wù)器向另一個(gè)對(duì)話服務(wù)器的轉(zhuǎn)換對(duì)于調(diào)用Mnemosyne的任何用戶端機(jī)器都是透明的。
|
溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!