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

分布式對(duì)話服務(wù)器的管理(3)

[摘要]當(dāng)添加或刪除一個(gè)Memory對(duì)象時(shí),經(jīng)過(guò)同步的本地Mnemosyne對(duì)象需要對(duì)所有的Mnemosyne進(jìn)行更新,可以通過(guò)notify()方法來(lái)完成這一任務(wù)。無(wú)論是發(fā)生write或take事件,Mne...
當(dāng)添加或刪除一個(gè)Memory對(duì)象時(shí),經(jīng)過(guò)同步的本地Mnemosyne對(duì)象需要對(duì)所有的Mnemosyne進(jìn)行更新,可以通過(guò)notify()方法來(lái)完成這一任務(wù)。無(wú)論是發(fā)生write或take事件,Mnemosyne都會(huì)針對(duì)發(fā)生的事件調(diào)用適當(dāng)?shù)谋O(jiān)聽者的notify()方法。在synchronize()方法中,我們把本地Mnemosyne注冊(cè)為所有遠(yuǎn)程Mnemosyne的take和write事件的監(jiān)聽者,一旦遠(yuǎn)程Mnemosyne上有take和write事件發(fā)生,就會(huì)調(diào)用本地 Mnemosyne的notify()方法。然后,本地Mnemosyne必須對(duì)事件作出反應(yīng)。下面是Mnemosyne如何與遠(yuǎn)程Mnemosyne進(jìn)行同步的例子:


public void notify(RemoteEvent remoteEvent) throws RemoteException
{
// 回寫被寫的內(nèi)存,但無(wú)需通知所有的Mnemosyne
if(remoteEvent instanceof WriteRemoteEvent)
{
WriteRemoteEvent wre = (WriteRemoteEvent) remoteEvent;
commonContext.silentWrite(wre.getMemory());
}

file:// 取被寫的Memory,但無(wú)需通知所有的Mnemosyne
if(remoteEvent instanceof TakeRemoteEvent)
{
TakeRemoteEvent tre = (TakeRemoteEvent) remoteEvent;
commonContext.silentTake(tre.getMemory());
}
}



  現(xiàn)在已經(jīng)創(chuàng)建了一個(gè)控制所有memory對(duì)象的Mnemosyne,它自動(dòng)與遠(yuǎn)程Mnemosyne保持同步,如果任何一個(gè)遠(yuǎn)程Mnemosynes得到或失去一個(gè)Memory對(duì)象時(shí),都可以使它保持最新的狀態(tài)。

  要通過(guò)Mnemosyne管理HTTP對(duì)話,servlet需要?jiǎng)?chuàng)建HttpSession的實(shí)例(從HttpServletRequest中使用getSession()),在實(shí)現(xiàn)Memory對(duì)象的類中封裝對(duì)話,并調(diào)用Mnemosyne對(duì)象的write()方法把封裝類寫到一個(gè)Mnemosyne中。

  通過(guò)調(diào)用write()方法,封裝著對(duì)話的Memory對(duì)象沿著網(wǎng)絡(luò)傳送給Mnemosyne,并通知遠(yuǎn)程機(jī)器。當(dāng)對(duì)象被寫到Mnemosyne時(shí),WriteRemoteEvent被發(fā)送給在Mnemosyne上注冊(cè)的所有WriteRemoteEventListeners,這樣,所有其他的Mnemosynes就能將新的對(duì)象作為Mnemosynes添加到它們的對(duì)話信息存貯庫(kù)中。

  要對(duì)存貯的對(duì)話進(jìn)行查詢,servlet調(diào)用read()方法查找包含對(duì)話的Memory對(duì)象,如果Mnemosyne找到了要查找的對(duì)象,則該對(duì)象通過(guò)RMI返回到servlet服務(wù)器。

  最后,要?jiǎng)h除對(duì)話,servlet就會(huì)調(diào)用Mnemosyne的take()方法,Mnemosyne將象有read事件發(fā)生那樣退還Memory對(duì)象,同時(shí)從其存貯對(duì)象庫(kù)中刪除該Memory對(duì)象。同時(shí),向其所有TakeRemoteEventListeners發(fā)送TakeRemoteEvent事件,通知所有的遠(yuǎn)程Mnemosynes該Memory對(duì)象已經(jīng)被刪除了。

  建立對(duì)話服務(wù)器

  上面我們已經(jīng)討論了如何在多服務(wù)器上維護(hù)對(duì)話存貯庫(kù),下面我們將討論如何建立對(duì)話服務(wù)器。在初始化過(guò)程中,對(duì)話服務(wù)器完成下列任務(wù):

  ━━創(chuàng)建本地Mnemosyne對(duì)象。

  ━━把本地Mnemosyne綁定到RMI。

  ━━把本地Mnemosyne與其他的遠(yuǎn)程Mnemosyne進(jìn)行同步。