明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

分布式對話服務(wù)器的管理(5)

[摘要]遠(yuǎn)程訪問Mnemosyne  下面我們來討論在servlet服務(wù)器上訪問遠(yuǎn)程Mnemosyne的方法。要在無需特定服務(wù)器在線的情況下加載一個包含對話信息的Mnemosyne,需要創(chuàng)建一個FailoverHandler的實例,F(xiàn)ailoverHandler利用JDK 1.3中的Proxy API處理...
遠(yuǎn)程訪問Mnemosyne

  下面我們來討論在servlet服務(wù)器上訪問遠(yuǎn)程Mnemosyne的方法。要在無需特定服務(wù)器在線的情況下加載一個包含對話信息的Mnemosyne,需要創(chuàng)建一個FailoverHandler的實例,F(xiàn)ailoverHandler利用JDK 1.3中的Proxy API處理對話服務(wù)器當(dāng)機(jī)的問題。FailoverHandler把一個代表訪問遠(yuǎn)程對話服務(wù)器的RMI URL的字符串?dāng)?shù)組作為參數(shù),然后,從Proxy類中獲取Mnemosyne實例。下面的SessionManager類中的initializeMnemosyne()方法可以顯示出這一切是如何完成的:


public static void initializeMnemosyne(String[] rmiURLs)
{
// 設(shè)置當(dāng)機(jī)服務(wù)器的處理程序
FailoverHandler fh = new FailoverHandler(null, rmiURLs);

// 得到Mnemosyne. 的一個實例
_Mnemosyne =
(Mnemosyne)Proxy.newProxyInstance(Mnemosyne.class.getClassLoader(),
new Class[] { Mnemosyne.class },
fh );
}



  如果用Proxy類獲取Mnemosyne的實例,所有的方法調(diào)用必須通過FailoverHandler的 invoke()方法進(jìn)行。當(dāng)有方法訪問Mnemosyne時,F(xiàn)ailoverHandler將試著調(diào)用該方法訪問一個遠(yuǎn)程對象。如果方法調(diào)用失。ɡ绶⻊(wù)器關(guān)機(jī)),F(xiàn)ailoverHandler將從提供給構(gòu)造器的URL清單中再取得下一個URL,這樣就會無縫地轉(zhuǎn)向下一個對話服務(wù)器。


// 建立遠(yuǎn)程加載類的URL清單
public FailoverHandler(Remote delegate, String[] delegateURLS)
{
this.delegateURLS = delegateURLS;

// 如果這個URL無效,則獲取下一個有效的URL
try {
this.delegate =
((delegate == null)?getNextValidDelegate():delegate);
} catch (RemoteException ex) {
// 如果發(fā)生遠(yuǎn)程意外錯誤,則該URL不能使用,向調(diào)用者發(fā)送一個 //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:// 嘗試對獲得的最后一個URL調(diào)用被調(diào)用的方法
return method.invoke(delegate, arguments);
}
catch(InvocationTargetException invocationTargetException)
{
file://如果獲得的URL無效,則取下一個URL
try
{
throw invocationTargetException.getTargetException();
}
catch(RemoteException remoteException)
{
delegate = getNextValidDelegate();
}
}
}
}

file://從構(gòu)造器中的URL清單中獲得下一個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對象時,從一個對話服務(wù)器向另一個對話服務(wù)器的轉(zhuǎn)換對于調(diào)用Mnemosyne的任何用戶端機(jī)器都是透明的。