分布式對話服務(wù)器的管理(5)
發(fā)表時(shí)間:2024-06-19 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]遠(yuǎn)程訪問Mnemosyne 下面我們來討論在servlet服務(wù)器上訪問遠(yuǎn)程Mnemosyne的方法。要在無需特定服務(wù)器在線的情況下加載一個(gè)包含對話信息的Mnemosyne,需要?jiǎng)?chuàng)建一個(gè)FailoverHandler的實(shí)例,F(xiàn)ailoverHandler利用JDK 1.3中的Proxy API處理...
遠(yuǎn)程訪問Mnemosyne
下面我們來討論在servlet服務(wù)器上訪問遠(yuǎn)程Mnemosyne的方法。要在無需特定服務(wù)器在線的情況下加載一個(gè)包含對話信息的Mnemosyne,需要?jiǎng)?chuàng)建一個(gè)FailoverHandler的實(shí)例,F(xiàn)ailoverHandler利用JDK 1.3中的Proxy API處理對話服務(wù)器當(dāng)機(jī)的問題。FailoverHandler把一個(gè)代表訪問遠(yuǎn)程對話服務(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)程對象。如果方法調(diào)用失敗(例如服務(wù)器關(guān)機(jī)),F(xiàn)ailoverHandler將從提供給構(gòu)造器的URL清單中再取得下一個(gè)URL,這樣就會(huì)無縫地轉(zhuǎn)向下一個(gè)對話服務(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:// 嘗試對獲得的最后一個(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對象時(shí),從一個(gè)對話服務(wù)器向另一個(gè)對話服務(wù)器的轉(zhuǎn)換對于調(diào)用Mnemosyne的任何用戶端機(jī)器都是透明的。