麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

分布式對話服務器的管理

2019-11-18 14:50:08
字體:
來源:轉載
供稿:網友

  摘要:

  通過使用JDK 1.3中引入的RMI和PRoxy API,本篇文章討論了一種答應一臺或多臺servlet服務器在一臺或多臺對話服務器上維護對話信息的技術,采用這種技術后,單一點故障就不會再出現了。

  假如系統中有一臺或多臺servlet服務器,對話信息只存在于運行著JVM的一臺servlet服務器上,而不會被傳輸給其他servlet服務器。假如該servlet服務器當機或因為維護而被關機,任何保存在對話中的信息都會丟失。假如一個系統中有多臺servlet服務器,一個帶有對話的用戶需要訪問對話中的任何信息,都需要被重新定向到同一臺servlet服務器。曾經有專家建議采用關系數據庫保存所有的對話信息,但這仍然存在單一點故障的危險,那就是運行關系數據庫的服務器。而且假如數據庫出了故障,所有的servlet服務器就都不能再訪問對話信息了。另外,在數據庫中保存可串行化的對象在有些數據庫中是比較難以實現的。

  多服務器對話治理的另一個可能的途徑是利用Javaspaces API來維護對話對象中的記錄。當然,假如運行javaSPaces的服務器由于維護或故障而被關機,也會丟失所有的對話信息,我們再一次碰到了單一點故障的問題。

  要實現帶有N個節點的分布式對話服務器,我們必須解決如下的三個問題:

  ━━如何建立一個庫來存貯對話信息。

  ━━如何對分布式對話信息存貯庫進行同步。

  ━━在一個對話信息存貯庫脫離網絡后,如何使該服務器從下一個對話信息存貯庫中訪問對話信息。


  Mnemosyne的簡介

  我們用來存貯對話信息的庫是Mnemosyne界面的執行。執行Mnemosyne的對象負責治理對話信息存貯庫中的所有對象,任何試圖寫、訪問或刪除庫中對象的對象都必須調用Mnemosyne的相應的方法來實現相應的操作。

  一個對象要存貯在Mnemosyne,就必須執行Memory界面,該界面定義了equalsMemory()操作來探測二個內存對象是否相同,這就使 Mnemosyne判定出應當把哪個對象返回給read要求或take要求。Memory界面也可以進行串行化擴充,以便我們可以用RMI在網絡上傳輸該對象。
  Mnemosyne使用三種界面表達其狀態。

  1、CommonContext界面存貯Mnemosyne的全部信息。每個Mnemosyne都有一個CommonContext對象的實例,以便read、write、take Memory對象時在各個方法之間進行同步。在write或者take說Memory對象時,CommonContext對象既定義“silent”方法也定義“loud”方法,當在不進行事件通知的情況下添加對象時,就會用到“silent”方法。例如,當Mnemosyne對象接收到WriteRemoteEvent(向一個遠程Mnemosyne對象寫對象的告示。)事件后,假如它也希望向CommonContext對象寫另一個對象,它就無需通知其他的遠程CommonContext對象,最初的Mnemosyne已經通知了它們,因此這種寫是通過調用CommonContext對象的silentWrite()方法“靜靜靜”地完成的。而“loud”方法則在有對象第一次被添加時將這一事件的具體信息通知所有被調用的監聽對象。

  2、Transaction對象用于在read、write、take Memory對象時進行分布式事務處理,這意味在Mnemosyne對象上可能會有多步驟的操作。

  3、TransactionContext界面治理分布式事務,使得系統可以中止或提交一個事務。

  保持Mnemosynes的同步是通過synchronize()和notify()這二個由 Mnemosyne定義的方法完成的。synchronize()可以使一個本地的Mnemosyne與其他Mnemosyne的Vector保持同步(這些Mnemosyne可以是本地的或遠程的,為簡明起見,我們假定它們是遠程的。)下面是synchronize()的一個例子:


public void synchronize(Vector Mnemosynes)
throws RemoteException, TransactionException
{

file:// MatchAllMemory對象是一個有效類
file://對任何二個Memory對象進行比較
MatchAllMemory matchAllMemory = new MatchAllMemory();

file:// 從Primary中獲得所有Memory
Mnemosyne Mnemosyne = (Mnemosyne) Mnemosynes.firstElement();
Vector allMemories = Mnemosyne.readAll(matchAllMemory,null);


commonContext.silentWriteAll(allMemories);

// 注冊進行發送、接收事件
Enumeration enumeration = Mnemosynes.elements();
while(enumeration.hasMoreElements())
{
Mnemosyne nextMnemosyne = (Mnemosyne) enumeration.nextElement();

file://注冊接收通知
nextMnemosyne.addTakeRemoteEventListener(this, matchAllMemory);
nextMnemosyne.addWriteRemoteEventListener(this, matchAllMemory);

file:// 注冊發送通知
addTakeRemoteEventListener(nextMnemosyne, matchAllMemory);
addWriteRemoteEventListener(nextMnemosyne, matchAllMemory);
}

// ...
}


  本地的Mnemosyne對象讀取Vector中第一個Mnemosyne對象的所有Memory對象,并采用“silent”方法將它們寫到其CommonContext對象中。然后,本地Mnemosyne將自己作為TakeRemoteEventListener和WriteRemoteListener添加到所有的遠程Mnemosyne中,這就意味著任何對遠程Mnemosynes的take或read操作都將調用本地Mnemosyne的notify()方法。最后,本地Mnemosyne將遠程Mnemosyne添加到其TakeRemoteEventListeners和WriteRemoteListeners隊列中,確保對本地Mnemosyne的write或take操作都會通知遠程Mnemosyne。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: av影院在线播放 | 久久人添人人爽人人爽人人片av | 日本一级黄色毛片 | 国产精品一区2区3区 | 欧美精品免费一区二区三区 | 嫩草影院在线观看网站成人 | 成年性羞羞视频免费观看无限 | 一区二区三区在线观看国产 | 久久成年人视频 | 欧美三级短视频 | 久久人人爽人人爽人人片av免费 | 亚洲欧美日韩免费 | 长泽雅美av | 日韩视频一区二区三区在线观看 | 久久av免费 | 99国产精成人午夜视频一区二区 | 在线观看视频毛片 | 精品少妇v888av | v11av在线播放 | 日韩视频高清 | 九九热视频免费观看 | 一区二区三区黄色 | 国产精品久久久乱弄 | 成人国产免费观看 | 精品国产一区二区三区在线观看 | 久久精品av| 毛片在线免费视频 | 久久久久久久一区二区三区 | 国产成人av一区二区 | 成人男女啪啪免费观看网站四虎 | 综合网天天色 | 一级网站 | 55夜色66夜色国产精品视频 | 精品国产一区二区三区久久久蜜月 | 看全色黄大色黄大片女图片 | 国产日韩欧美 | 日韩精品99久久久久久 | 国产91丝袜在线播放 | 一区二区三区四区高清视频 | 免费观看一级黄色片 | 色视频在线播放 |