2012-11-22 64 views
0

我需要在RMI服務中運行一個任務,並且需要爲它實現一個事件監聽器。現在,當我通過RMI傳遞EventListener時,它會執行調用,但是偵聽器的回調方法沒有被調用,並且它仍然處於等待狀態。我應該如何得到這個工作?通過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(); 
    } 

} 

回答

1

的問題是,因爲你的事件偵聽器是序列化的事件偵聽器的數據字段將會通過線路發送和一個在服務器端創建的新對象。該方法在您的事件偵聽器的此副本上調用。這對於數據對象來說非常合適,但對於事件監聽器這樣的喜歡並不奏效,因爲您希望您的客戶端代碼能夠接聽電話。

我相信如果您的事件偵聽器擴展RemoteObject,您可以完成這項工作。如果你這樣做,而不是複製你的對象,當你調用服務器時,它將作爲RMI服務公開。服務器而不是獲取對象的副本,將獲得您的事件偵聽器的代理。對事件偵聽器的調用將導致RMI調用在相反方向調用您的事件偵聽器。

請參閱RMI指南中的Passing Remote Objects瞭解更多詳情。

+0

傳遞遠程對象鏈接已經死亡 – ZbyszekKr