Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.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
Java RMI在调用存根上的函数时冻结 总结_Java_Maven_Rmi_Freeze - Fatal编程技术网

Java RMI在调用存根上的函数时冻结 总结

Java RMI在调用存根上的函数时冻结 总结,java,maven,rmi,freeze,Java,Maven,Rmi,Freeze,我正在进行一个项目,发现了以下问题: 我们在代码中发现了一个无法解决的问题。 首先,我们给出一些关于Eclipse项目的一般信息以及如何执行它,然后给出一些关于代码的详细信息,最后描述问题 项目 我们在Eclipse中构建了一个JavaMaven项目。它包含两个源文件夹:src/main/java和src/test/java。主文件夹包含Gallager、Humblet和Spira算法的实现。现在,我们有一个测试SimpleTest,看看算法的基本功能是否如预期的那样工作。 代码可以按如下方式执

我正在进行一个项目,发现了以下问题:

我们在代码中发现了一个无法解决的问题。 首先,我们给出一些关于Eclipse项目的一般信息以及如何执行它,然后给出一些关于代码的详细信息,最后描述问题

项目 我们在Eclipse中构建了一个JavaMaven项目。它包含两个源文件夹:src/main/java和src/test/java。主文件夹包含Gallager、Humblet和Spira算法的实现。现在,我们有一个测试SimpleTest,看看算法的基本功能是否如预期的那样工作。 代码可以按如下方式执行:

  • 解压缩附加文件DA-Lab3.zip
  • 在文件夹DA-Lab3/target/classes中打开命令/终端窗口
  • 在此目录中启动Java RMI注册表(Linux中为“rmiregistry&”,Windows中为“Start rmiregistry”)
  • 转到命令/终端窗口中的文件夹DA-Lab3
  • 执行:“mvn清洁安装-f.”。(如果这不起作用,因为maven无法清理文件夹,请尝试不带“clean”的相同命令。) 现在,测试文件应该由Java/Maven执行
  • 代码 代码被分成几个部分。需要了解的最重要的部分是节点、流程和RMINetwork。 节点包含实际的算法,流程通过创建边、实现发送方法和删除边等实用功能扩展节点。RMINetwork处理RMI相关的功能,如在注册表中注册进程、注销进程以及在RMINetwork中查找其他进程

    节点放置在GHS.graph包中。包还包含Edge、NodeEstate和EdgeState。 消息由接收功能处理(第221行)。每种类型的消息都实现了GHS.messages.IMessage与函数进程的接口。节点中的receive函数在每条消息中调用此处理函数。从消息中的这些进程函数调用节点中的特定函数。节点中的这些函数根据算法处理消息

    流程放在包GHS中。它使用id变量扩展节点,并提供函数send、connect、disconnect、id()、run和stop。send函数确定接收方的id,并向RMINetwork提供向接收方发送消息的任务。 Process类还实现了IPProcess接口。此接口由RMI客户端使用

    RMINetwork被放置在包通信中。此类包含注册、取消注册、查找和发送的函数

    问题 在SimpleTest1中,创建了三个进程和一个边缘。进程0连接到进程2。然后进程0唤醒并向进程2发送连接消息。进程2唤醒并将连接消息发送回进程0。然后进程0向进程2发送启动消息。但在这里,Java似乎没有抛出任何错误

    要详细说明: Java似乎停留在:
    ((IProcess)this.lookup(id)).receive(edge,message)远程网络r:52

    为了了解实际问题是什么,我们在函数中添加了一些测试代码。 在第49行,我们添加了:
    IProcess p=(IProcess)this.lookup(id)
    第50行:
    String s=p.id()
    第51行:
    System.out.println(“网络”)
    使用此测试代码,在第50行启用Java Stuck

    当第50行被禁用时,将执行第51行,Java将在第52行停止

    p.id()函数在进程中实现。第一条语句将字符串打印到命令行。在Java停止时,不会执行这个print语句

    当我们用49替换第49行时,我们添加了:
    IProcess p=(IProcess)this.lookup(edge.nexter(id))(发送者现在实际上正在查找自己的id),然后在发送第二条而不是第三条消息时出现问题

    因此,JavaRMI似乎在存根上的调用中冻结。但它始终适用于第一条消息,并根据第49行的不同,适用于第二条消息。因为没有抛出错误,我们不知道为什么RMI在这一点上冻结

    @Override
    public void send(String id, Edge edge, IMessage message) throws Exception {
        System.out.println("testing");
        IProcess p = (IProcess) this.lookup(id);
        String s = p.id();
        //System.out.println(((IProcess) this.lookup(id)).id());
        System.out.println("networking");
        ((IProcess) this.lookup(id)).receive(edge, message);
        System.out.println("id found");
    }
    
    我们希望你能帮助我们


    您可以查看上的所有代码:

    您调用的远程方法没有返回。

    结果表明,进程在单个线程中相互等待。向其他进程发送消息的旧启动方法尚未完成,此时另一个进程通过存根调用方法。只要旧方法正在运行,这些方法就不会启动。因为旧方法正在等待响应(只有当这些旧方法完成时才会出现响应),所以系统最终陷入死锁。我们通过在新线程中执行节点的receive方法解决了这个问题。

    在本例中,Java冻结在
    String s=p.id()上,它应该返回进程的id(参见第66行)。因此,我不知道你的意思。您是否认为发生了一些意外的行为导致id()函数不返回?在您的问题中,它并不是说您被冻结了,但是无论您调用什么,它都不会返回,正如我已经说过的那样。注意:我终于明白了,当你说“行”时,你的意思是“行”。不要误用标准术语。嗯,好的。关于术语我很抱歉:)谢谢你的回答。