2012-02-24 8 views
3

私は、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の計算ノードを持っていて、それらのオブジェクトを返さなかったら、それは本当に乱雑になり、それらをすべて追跡すると思います。

ジョブが別のジョブを送信しようとするまでに処理されず、古い状態(つまり、直前のものと同じオブジェクト)の古いオブジェクトを送信する結果にならない限り、これまではかなりうまくいきます。これが意味をなさない場合は、私はそれを説明するために全力を尽くすとコメントしてください。

+0

パスは意味がありませんお役に立てば幸いです。データが1台のマシンにのみ残っていて、他のマシンがそのデータを持つ元のマシンで操作を呼び出すようにしますか? – Adrian

+0

こんにちはエイドリアン、あなたはそれを持っています!元のオブジェクトにカウンタがあるとします。計算機を通過するたびに、カウンタに1が加算されます。私はその変数を保持するためにそのオブジェクトカウンタにしたい。私が見つけた唯一の方法は、マスターマスターに当たるたびにオブジェクトを置き換えることです。 1回のJVMセットアップでは、参照渡しのために自動的に発生しますが、RMIとコールバックの設定では、coreApplicationObjects.put(ticker、j)を使用してハッシュテーブル内のオブジェクトを置き換えない限り、毎回カウンタがリセットされます。 私が知りたいのは、これを行うより良い方法がある場合です。 – Submerged

+0

エクスポートされたリモートオブジェクト自体が現在 'Serializable'であるオブジェクトが必要なように聞こえるので、サーバJVMで(RMIを介して)それを更新することができます。 – EJP

答えて

1

RMIは、クラスタ全体でオブジェクトを同期させる方法ではありません。しかし、それを行うためのツールがあります。例えば、http://www.hazelcast.com/を見てください。

コンピュータのクラスタがあり、同期が必要な場合は、サーバーのツールまたはサードパーティのツールを使用してクラスタリングを使用する必要があります。

ヘイルキャストがおすすめです。これは非常に使いやすく、TCPソケットからTCPソケットを使用して高速のUDPまたはWANクラスタを使用するローカルクラスタを許可します。

import com.hazelcast.core.MultiMap; 
import com.hazelcast.core.Hazelcast; 
import java.util.Collection; 

// a live shared multimap shared across all cluster nodes 
MultiMap<String, Order> mmCustomerOrders = Hazelcast.getMultiMap("customerOrders"); 

mmCustomerOrders.put("1", new Order ("iPhone", 340)); 

Thread.Sleep(1000); 

Order order = (Order) mmCustomerOrders.get("1"); 

System.out.println(Order.quantity()); // 340 ?? Nobody knows, it might have been changed 

出力はどのようなものです:

たとえばHazelcastは、あなたがこのような何かをやらせるのだろうか?クラスタメンバーがマップ内の項目「1」を変更した場合、その値は自動的に取得されます。コーディングは必要ありません。

は、それはあなたが複数のコンピュータを扱っているときに、参照することにより

-Alex

関連する問題