我有一个使用Java RMI的分布式应用程序,主对象(CoreApplication)实现了java.io.Serializable接口。每分钟,该主对象会被发送到远程计算机并在该JVM的线程池上进行处理。由于它是异步的,因此对象可以在主计算机上的主线程不受阻塞的情况下进行处理。
当CoreApplication对象在远程线程上完成处理后,它会调用回调方法并发送回主计算机。
以下是远程计算机处理通过RMI从主计算机调用的作业以及sendJob方法的一些代码。
我的问题是,每次在回调方法中替换CoreApplication对象是否是确保它在下一分钟被发送时是最新的最好的方法? CoreApplication是流动的并且会发生变化,状态必须得到保留。我正在将其发送回主计算机,以便可以从中央位置监视其状态。如果我有100个计算节点而它们没有返回它们的对象,那么跟踪它们所有将变得非常混乱。
目前为止,它运行得非常好,除非作业在尝试发送另一个作业之前未被处理,并导致发送旧状态的陈旧对象(即与上一分钟相同的对象)。如果这不合理,请发表评论,我会尽力解释清楚。
当CoreApplication对象在远程线程上完成处理后,它会调用回调方法并发送回主计算机。
以下是远程计算机处理通过RMI从主计算机调用的作业以及sendJob方法的一些代码。
public void sendJob(final CoreApplication aJob) throws RemoteException{
Runnable r = new Runnable(){
public void run(){
try {
WorkResponse wr = aJob.process();
client.coreApplicationHandler(aJob,wr);
}catch(RemoteException e){}
}
};
workQueue.execute(r);
}
您可以看到client.coreApplicationHandler是回调主服务器的方法,并将CoreApplication对象与响应对象一起发送回来。
这是主机上的coreApplicationHandler方法代码:
public void coreApplicationHandler(CoreApplication j,WorkResponse wr){
String ticker = j.getTickerSymbol();
coreApplicationObjects.put(ticker, j);
if(GlobalParameters.DEBUG_MODE){
System.out.println("WORK RESPONSE IS "+wr.getMessage());
}
}
我的问题是,每次在回调方法中替换CoreApplication对象是否是确保它在下一分钟被发送时是最新的最好的方法? CoreApplication是流动的并且会发生变化,状态必须得到保留。我正在将其发送回主计算机,以便可以从中央位置监视其状态。如果我有100个计算节点而它们没有返回它们的对象,那么跟踪它们所有将变得非常混乱。
目前为止,它运行得非常好,除非作业在尝试发送另一个作业之前未被处理,并导致发送旧状态的陈旧对象(即与上一分钟相同的对象)。如果这不合理,请发表评论,我会尽力解释清楚。