繁体   English   中英

如何在Java RMI中使用可序列化对象和回调方法正确模仿传递引用?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM