當添加或刪除一個Memory對象時,經過同步的本地Mnemosyne對象需要對所有的Mnemosyne進行更新,可以通過notify()方法來完成這一任務。無論是發生write或take事件,Mnemosyne都會針對發生的事件調用適當的監聽者的notify()方法。在synchronize()方法中,我們把本地Mnemosyne注冊為所有遠程Mnemosyne的take和write事件的監聽者,一旦遠程Mnemosyne上有take和write事件發生,就會調用本地 Mnemosyne的notify()方法。然后,本地Mnemosyne必須對事件作出反應。下面是Mnemosyne如何與遠程Mnemosyne進行同步的例子:
public void notify(RemoteEvent remoteEvent) throws RemoteException { // 回寫被寫的內存,但無需通知所有的Mnemosyne if(remoteEvent instanceof WriteRemoteEvent) { WriteRemoteEvent wre = (WriteRemoteEvent) remoteEvent; commonContext.silentWrite(wre.getMemory()); }
file:// 取被寫的Memory,但無需通知所有的Mnemosyne if(remoteEvent instanceof TakeRemoteEvent) { TakeRemoteEvent tre = (TakeRemoteEvent) remoteEvent; commonContext.silentTake(tre.getMemory()); } }
現在已經創建了一個控制所有memory對象的Mnemosyne,它自動與遠程Mnemosyne保持同步,如果任何一個遠程Mnemosynes得到或失去一個Memory對象時,都可以使它保持最新的狀態。
要通過Mnemosyne管理HTTP對話,servlet需要創建HttpSession的實例(從HttpServletRequest中使用getSession()),在實現Memory對象的類中封裝對話,并調用Mnemosyne對象的write()方法把封裝類寫到一個Mnemosyne中。
通過調用write()方法,封裝著對話的Memory對象沿著網絡傳送給Mnemosyne,并通知遠程機器。當對象被寫到Mnemosyne時,WriteRemoteEvent被發送給在Mnemosyne上注冊的所有WriteRemoteEventListeners,這樣,所有其他的Mnemosynes就能將新的對象作為Mnemosynes添加到它們的對話信息存貯庫中。
要對存貯的對話進行查詢,servlet調用read()方法查找包含對話的Memory對象,如果Mnemosyne找到了要查找的對象,則該對象通過RMI返回到servlet服務器。
最后,要刪除對話,servlet就會調用Mnemosyne的take()方法,Mnemosyne將象有read事件發生那樣退還Memory對象,同時從其存貯對象庫中刪除該Memory對象。同時,向其所有TakeRemoteEventListeners發送TakeRemoteEvent事件,通知所有的遠程Mnemosynes該Memory對象已經被刪除了。
建立對話服務器
上面我們已經討論了如何在多服務器上維護對話存貯庫,下面我們將討論如何建立對話服務器。在初始化過程中,對話服務器完成下列任務:
━━創建本地Mnemosyne對象。
━━把本地Mnemosyne綁定到RMI。
━━把本地Mnemosyne與其他的遠程Mnemosyne進行同步。
|