调用Mnemosyne的take()方法,Mnemosyne将象有read事件发生那样退还Memory对象,同时从其存贮对象库中删除该Memory对象。同时,向其所有TakeRemoteEventListeners发送TakeRemoteEvent事件,通知所有的远程Mnemosynes该Memory对象已经被删除了。
分布式对话服务器的管理(3)
时间:2010-12-26
建立对话服务器
上面我们已经讨论了如何在多服务器上维护对话存贮库,下面我们将讨论如何建立对话服务器。在初始化过程中,对话服务器完成下列任务:
创建本地Mnemosyne对象。
把本地Mnemosyne绑定到RMI。
把本地Mnemosyne与其他的远程Mnemosyne进行同步。
首先,对话服务器将获得Mnemosyne对象的一个实例,该实例被绑定到对话服务器的本地IP上。
protected void bindMnemosyne()
{
file://得到Mnemosyne
Mnemosyne Mnemosyne = null;
try
{
Mnemosyne = MnemosyneFactory.getMnemosyne();
}
catch(RemoteException remoteException)
{
System.out.println("Internal error:");
System.out.println("Can''t create a Mnemosyne");
System.exit(1);
}
// 把Mnemosyne绑定到MnemosyneImpl
try
{
String rmiURL = "//" + _localIP + "/MnemosyneImpl";
Naming.rebind(rmiURL, Mnemosyne);
}
catch(ArrayIndexOutOfBoundsException ArrayIndexOutOfBoundsException)
{
throw new IllegalArgumentException("LocalIP is invalid");
}
catch(MalformedURLException malformedURLException)
{
throw new IllegalArgumentException("LocalIP is invalid");
}
catch(RemoteException remoteException)
{
System.out.println("Internal error:");
System.out.println("Can''t rebind a Mnemosyne to MnemosyneImpl");
System.exit(1);
}
}
通过把本地Mnemosyne上一系列代表RMI名字符号的URL赋予远程对话服务器,就能引发同步操作,这些URL存贮在一个被称作rmiURL的字符串数组中。在SessionServer的符号中,URL是作为参数从命令行命令中获得的,但它可以来自其他渠道:
protected void synchronizeMnemosyne()
{
file://获得本地Mnemosyne
Mnemosyne localMnemosyne = null;
try
{
localMnemosyne = (Mnemosyne) Naming.lookup(_localIP);
}
catch(Exception exception)
{
System.out.println("Internal error:");
System.out.println("Can''t lookup local MnemosyneImpl");
System.exit(1);
}
file://获得同步用的远程Mnemosynes
Vector remoteMnemosynes = new Vector();
// _rmiURLS对象是代表需要进行同步的远程服务器的字符串数组
for(int index = 1;index < _rmiURLS.length;index++)
{
try
{
remoteMnemosynes.add(Naming.lookup(_rmiURLS[index]));
}
catch(Exception exception)
{
}
}
file:// 同步
try
{
if(remoteMnemosynes.size() > 1)
localMnemosyne.synchronize(remoteMnemosynes);
}
catch(Exception exception)
{
System.out.println("Internal error:");
System.out.println("Can''t synchronize local MnemosyneImpl");
System.exit(1);
}
}
分布式对话服务器的管理(4)
时间:2010-12-26
远程访问Mnemosyne
下面我们来讨论在servlet服务器上访问远程Mnemosyne的方法。要在无需特定服务器在线的情况下加载一个包含对话信息的Mnemosyne,需要创建一个FailoverHandler的实例,FailoverHandler利用JDK 1.3中的Proxy API处理对话服务器当机的问题。FailoverHandler把一个代表访问远程对话服务器的RMI URL的字符串数组作为参数,然后,从Proxy类中获取Mnemosyne实例 |