Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用可序列化对象和回调方法正确模拟JavaRMI中的按引用传递?_Java_Callback_Rmi_Pass By Reference_Distributed - Fatal编程技术网

如何使用可序列化对象和回调方法正确模拟JavaRMI中的按引用传递?

如何使用可序列化对象和回调方法正确模拟JavaRMI中的按引用传递?,java,callback,rmi,pass-by-reference,distributed,Java,Callback,Rmi,Pass By Reference,Distributed,我有一个使用java RMI的分布式应用程序和一个实现java.io.Serializable的主对象(CoreApplication)。每分钟,这个主对象都会被发送到远程计算机,并在JVM的线程池中进行处理。由于对象是异步的,因此处理对象时不会阻塞主计算机上的主线程 当CoreApplication对象在远程线程上完成处理时,它调用回调方法并发送回主计算机 下面是远程计算机处理通过RMI和sendJob方法从主计算机调用的作业的一些代码 public void sendJob(final Co

我有一个使用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对象是否是确保它在下一分钟发送时处于最新状态的最佳方法?Core应用程序是流动的,并且会发生变化,必须保持状态。我将它发送回主计算机,这样它的状态就可以从一个中心位置进行监控。如果我有100个计算节点,而它们不返回它们的对象,我认为跟踪它们会变得非常混乱


到目前为止,它工作得相当好,除非作业在尝试发送另一个对象时未被处理,并导致发送一个旧状态的过时对象(即,与最后一分钟相同的对象)。如果这不合理,请发表评论,我会尽力解释。

RMI不是跨集群同步对象的方法。但有一些工具可以做到这一点。例如,请看

如果您有一个计算机集群并且需要同步,那么您需要通过服务器的工具或第三方工具使用集群

我推荐黑兹卡斯特。它非常易于使用,并允许使用快速UDP的本地群集或使用TCP套接字到TCP套接字的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
import com.hazelcast.core.MultiMap;
导入com.hazelcast.core.hazelcast;
导入java.util.Collection;
//跨所有群集节点共享的实时共享多重映射
MultiMap mmCustomerOrders=Hazelcast.getMultiMap(“customerOrders”);
mmCustomerOrders.put(“1”,新订单(“iPhone”,340));
睡眠(1000);
订单订单=(订单)mmCustomerOrders.get(“1”);
System.out.println(Order.quantity());//340 ?? 没人知道,可能已经改变了
输出是什么?如果集群成员更改了映射中的项目“1”,那么您将自动获得该值。不需要更多的编码

希望能有帮助


-Alex

在处理多台计算机时,按引用传递没有意义。你想让数据只保留在一台机器上,而让其他机器在拥有数据的原始机器上调用操作吗?嗨,阿德里安,你明白了!假设原始对象有一个计数器。每次它运行一台计算机时,它都会向计数器中添加一个。我想使用对象计数器来保留该变量。我发现的唯一方法是在对象每次碰到主对象时替换它。在单个JVM设置中,由于引用传递,这会自动发生,但在RMI和回调设置中,计数器每次都会重置,除非我使用coreApplicationObjects.put(ticker,j)替换哈希表中的对象;我只想知道是否有更好的方法来实现这一点。听起来您需要当前可序列化的对象本身就是导出的远程对象,以便在服务器JVM上进行更新(通过RMI)。我同意@EJP,传递可序列化对象可能是实现跨JVM保持对象状态持久性的方法。