私は、Java RMIとjava.io.Serializableを実装するメインオブジェクト(CoreApplication)を使って分散アプリケーションを持っています。毎分、このメインオブジェクトはリモートコンピュータに送信され、そのJVMのスレッドプールで処理されます。非同期であるため、オブジェクトはマスターコンピュータ上のメインスレッドをブロックせずに処理されます。シリアル化可能オブジェクトとコールバックメソッドを使用して、Java RMIでの参照渡しを正しく模倣するにはどうすればよいですか?
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オブジェクトを返すとともに、応答オブジェクトを返します。ここで
は、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());
}
}
私の質問があり、メインマシンにcoreApplicationHandlerメソッドのコードであることが最新のためだことを確認するためにコールバックメソッドの最良の方法でCoreApplicationオブジェクトを毎回交換されます次の分が送られますか? CoreApplicationは流動的であり、状態は保持されなければならない。マスターコンピュータに送り返すので、中央の場所から状態を監視できます。私が100の計算ノードを持っていて、それらのオブジェクトを返さなかったら、それは本当に乱雑になり、それらをすべて追跡すると思います。
ジョブが別のジョブを送信しようとするまでに処理されず、古い状態(つまり、直前のものと同じオブジェクト)の古いオブジェクトを送信する結果にならない限り、これまではかなりうまくいきます。これが意味をなさない場合は、私はそれを説明するために全力を尽くすとコメントしてください。
パスは意味がありませんお役に立てば幸いです。データが1台のマシンにのみ残っていて、他のマシンがそのデータを持つ元のマシンで操作を呼び出すようにしますか? – Adrian
こんにちはエイドリアン、あなたはそれを持っています!元のオブジェクトにカウンタがあるとします。計算機を通過するたびに、カウンタに1が加算されます。私はその変数を保持するためにそのオブジェクトカウンタにしたい。私が見つけた唯一の方法は、マスターマスターに当たるたびにオブジェクトを置き換えることです。 1回のJVMセットアップでは、参照渡しのために自動的に発生しますが、RMIとコールバックの設定では、coreApplicationObjects.put(ticker、j)を使用してハッシュテーブル内のオブジェクトを置き換えない限り、毎回カウンタがリセットされます。 私が知りたいのは、これを行うより良い方法がある場合です。 – Submerged
エクスポートされたリモートオブジェクト自体が現在 'Serializable'であるオブジェクトが必要なように聞こえるので、サーバJVMで(RMIを介して)それを更新することができます。 – EJP