当添加或删除一个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进行同步。
