0

I need to run a task inside a RMI service and it needs an event listener implemented for it. Right now when I pass the EventListener over RMI it does execute the call however the callback method of the Listener is not being invoked and it remains in the wait state. How should I get this to work?

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

Here is where I pass the eventlistener to the RMI service '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 に答える