[英]How do I properly mimic pass-by-reference in Java RMI with serializable objects and a callback method?
我有一個使用java RMI的分布式應用程序和一個實現java.io.Serializable的主對象(CoreApplication)。 每分鍾,此主對象都將發送到遠程計算機並在該JVM的線程池上進行處理。 由於它是異步的,因此處理對象時不會阻塞主計算機上的主線程。
當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個計算節點並且它們沒有返回它們的對象,那么我認為它會變得非常混亂。
到目前為止它工作得很好,除非在嘗試發送另一個作業時沒有處理該作業並導致發送具有舊狀態的陳舊對象(即,與最后一分鍾相同的對象)。 如果這沒有意義,請評論我會盡力解釋。
RMI不是跨群集同步對象的方法。 但是有一些工具可以做到這一點。 例如, 請查看http://www.hazelcast.com/ 。
如果您有一組計算機並且需要同步,那么您需要通過服務器工具或第三方工具使用群集。
我推薦hazelcast。 它非常易於使用,並允許使用TCP套接字到TCP套接字的快速UDP或WAN群集的本地群集。
例如,Hazelcast會讓你做這樣的事情:
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
什么是輸出? 如果集群成員在地圖中更改了項目“1”,那么您將自動獲得該值。 不再需要編碼......
希望能幫助到你
-Alex
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.