java - 通过 RMI 传递事件监听器

标签 java rmi event-listener

我需要在 RMI 服务内运行一个任务,并且需要为其实现一个事件监听器。现在,当我通过 RMI 传递 EventListener 时,它确实会执行调用,但是监听器的回调方法不会被调用,并且仍处于等待状态。我应该如何让它发挥作用?

public class MyEventListener implements Serializable, ABCEventListener {

    private static final long serialVersionUID = -4686421592620210489L;
    private boolean registrationCompleted = false;

    public boolean getRegistrationCompleted(){
        return registrationCompleted;
    }
    @Override
    public void onSomethingDiscovered(Agent agent) {            
        System.out.println("Added agent "+agent.toString()+" to the set \n");

    }

    @Override
    public void onDiscoveryComplete() {
        this.registrationCompleted = true;
        System.out.println("Discovery process completed. \n");
    }
}

这里是我将事件监听器传递给 RMI 服务“ds”的地方

MyEventListener myEL = new MyEventListener();
ds.discoverAsync(val, myEL);
waitForRegistration();
.
.
    private void waitForRegistration() {

    try{
    while(!dcev.getRegistrationCompleted()){
        System.out.println("Please wait...");
        Thread.sleep(15000);
    }
    }catch(InterruptedException e){
        logger.error("InterruptedException raised while waiting for registration",e);
        e.printStackTrace();
    }

}

最佳答案

问题在于,由于您的事件监听器是可序列化的,因此事件监听器的数据字段通过线路发送,并在服务器端创建一个新对象。在事件监听器的此副本上调用该方法。这对于数据对象来说非常有意义,但对于事件监听器之类的事件监听器来说却不起作用,因为您希望客户端代码获得调用。

我相信如果您的事件监听器扩展RemoteObject,您就可以完成这项工作。 。如果这样做,当您调用服务器时,对象将被公开为 RMI 服务,而不是被复制。服务器将获取事件监听器的代理,而不是获取对象的副本。对事件监听器的调用将导致反向 RMI 调用来调用您的事件监听器。

参见Passing Remote Objects在 RMI 指南中了解更多详细信息。

关于java - 通过 RMI 传递事件监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13507038/

相关文章:

java - 通过 @Rule 在 JUnit 中初始化一个 List<?>

Java RMI 在同一实例中具有不同的值

javascript - 如何使用 JavaScript 一键切换两种背景颜色

javascript - 如何使用户名创建表单即使在页面重新加载时也保持不可见?

java - 使用 Spring @RestController 和 @QuerydslPredicate 来处理 GET With ZonedDateTime 参数

java - Tomcat 8.0.18 未收到客户端的完整请求

java - 安卓 Java : getText can't read superscript font

java - 使用 RMI 访问对象

java - 多个 DAO 实例 = 不好?

java - Pi4j 事件监听器未由 GPIO 状态更改触发