?? 分布式對(duì)話服務(wù)器的管理(6).txt
字號(hào):
作者:運(yùn)氣
email: webmaster@chinaspx.com
日期:7/4/2001 1:43:27 PM
盡管我們已經(jīng)能夠訪問對(duì)話服務(wù)器,而且可以避免單一點(diǎn)故障,我們還必須為HttpSession建立一個(gè)封裝對(duì)象,而SessionWrapper就是這樣一個(gè)對(duì)象,而且,它還假定HttpSession的執(zhí)行也是串行化的。如果它不是串行化的,可以很方便地修改封裝對(duì)象將對(duì)話的信息轉(zhuǎn)移到一個(gè)哈希表中并在其他成員變量中保留其他信息(ID、創(chuàng)作時(shí)間等信息。)。
public interface SessionWrapper extends Memory
{
/**
* 得到HttpSession的信息。
*/
public HttpSession getSession();
}
public class SessionWrapperImpl implements SessionWrapper
{
/**識(shí)別該對(duì)話的關(guān)鍵字 */
protected String _id;
/** 當(dāng)前HttpSession的信息。 */
protected HttpSession _sess;
/**
* 建立ID,但沒有建立對(duì)話的其他信息,可用于通過read尋找一個(gè)對(duì)話。
*/
public SessionWrapper(String id) {
_id = id;
}
/**
* 建立一個(gè)帶對(duì)話的SessionWrapper。其ID與對(duì)話的ID相同。
*/
public SessionWrapper(HttpSession sess) {
_sess = sess;
_id = sess.getId();
}
/**
* 如果Memory對(duì)象是SessionWrapper的一個(gè)實(shí)例,當(dāng)前的SessionWrapper
* 已經(jīng)建立了與對(duì)象相同的ID,則此方法返回的值為真。
*/
public boolean equalsMemory(Memory m) {
return (m instanceof SessionWrapper
&& _id != null
&& _id.equals(((SessionWrapper)m)._id));
}
/**
* 得到HttpSession的信息。
*/
public HttpSession getSession() {
return _sess;
}
}
SessionWrapper類執(zhí)行了Memory的界面,因此,HttpSession對(duì)象的ID可以與遠(yuǎn)程對(duì)話的ID進(jìn)行比較。
最后需要?jiǎng)?chuàng)建read()、write()和delete(),以對(duì)遠(yuǎn)程對(duì)話進(jìn)行管理。我們向SessionManager類添加三個(gè)靜態(tài)類:
/**
* 從在初始化時(shí)建立的Mnemosyne中得到HttpSession信息。
*/
public static HttpSession getSession(String id)
throws RemoteException
{
try {
SessionWrapper result
= (SessionWrapper)_Mnemosyne.read(new SessionWrapper(id),
null);
return result.getSession();
} catch (TransactionException ex) {
// 由于沒有處理事物,因此不會(huì)有事務(wù)意外被放棄。
ex.printStackTrace();
}
return null;
}
/**
* 在初始化時(shí)指定的Mnemosyne中保存對(duì)話信息。
*/
public static void saveSession(HttpSession sess)
throws RemoteException
{
try {
_Mnemosyne.write(new SessionWrapper(sess), null);
} catch (TransactionException ex) {
file://由于沒有處理事物,因此不會(huì)有事務(wù)意外被放棄。
ex.printStackTrace();
}
}
/**
* 從在初始化時(shí)指定的Mnemosyne中刪除一個(gè)對(duì)話。
*/
public static void removeSession(String id)
throws RemoteException
{
try {
_Mnemosyne.take(new SessionWrapper(id), null);
} catch (TransactionException ex) {
// /由于沒有處理事物,因此不會(huì)有事務(wù)意外被放棄。
ex.printStackTrace();
}
}
在servlet中,可以以如下方式管理對(duì)話:
public void init(ServletConfig conf) throws ServletException {
// 調(diào)用一個(gè)方法得到指示對(duì)話服務(wù)器位置的RMI URL清單
// 例如://server1.foo.com/MnemosyneImpl, //server2.foo.com/MnemosyneImpl,等
String[] urls = getURLs(conf); // Method to get the URLs from properties for the session servers
SessionManager.initializeMnemosyne(urls)
}
public void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
file:// 得到存貯在cookie中的對(duì)話,僅僅是為了得到其ID。
HttpSession baseSess = req.getSession()
file://根據(jù)得到的ID,從Mnemosyne中得到真正的對(duì)話
HttpSession realSess = SessionManager.getSession(base.getId());
SessionManager.saveSession(realSess);
}
結(jié)論
盡管這篇文章討論了一個(gè)分布式對(duì)話管理的例子,但我們可以將這一技術(shù)用于管理必須容忍任一節(jié)點(diǎn)出錯(cuò)的分布式內(nèi)存管理系統(tǒng)中。Mnemosyne還可以用在成員不斷加入和離開的P2P應(yīng)用中。通過使用Mnemosyne,任何一個(gè)成員都可以與系統(tǒng)進(jìn)行快速同步,而無需要求為保持系統(tǒng)有效而必須保證某一結(jié)點(diǎn)不出故障。
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -