我需要在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");
}
}
这是我将eventlistener传递给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();
}
}
答案 0 :(得分:1)
问题在于,因为您的事件侦听器是可序列化的,所以事件侦听器的数据字段将通过线路发送,并在服务器端创建新对象。在此事件侦听器副本上调用该方法。这对于数据对象非常有意义,但是对于事件侦听器这样的事情并不起作用,因为您希望客户端代码能够接听电话。
如果你的事件监听器扩展RemoteObject,我相信你可以做到这一点。如果执行此操作,而不是复制对象,则在调用服务器时它将作为RMI服务公开。服务器而不是获取对象的副本,将获得您的事件侦听器的代理。对事件监听器的调用将导致反向调用RMI以调用事件监听器。
有关详细信息,请参阅RMI指南中的Passing Remote Objects。