0

我需要在 RMI 服务中运行一个任务,它需要为它实现一个事件监听器。现在,当我通过 RMI 传递 EventListener 时,它确实执行了调用,但是没有调用 Listener 的回调方法,它仍然处于等待状态。我应该如何让它工作?

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();
    }

}
4

1 回答 1

1

问题在于,因为您的事件侦听器是可序列化的,所以您的事件侦听器的数据字段通过网络发送,并在服务器端创建了一个新对象。在您的事件侦听器的此副本上调用该方法。这对数据对象非常有意义,但对于事件侦听器之类的东西,您希望您的客户端代码获得调用,因此无法正常工作。

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

有关详细信息,请参阅RMI 指南中的传递远程对象

于 2012-11-22T06:41:45.450 回答