2013-10-29 73 views
0

方法getReservationSession屬於CarRentalAgency這個類實現了接口RemoteCarRentalAgency的一個實例通過RMI註冊表進行註冊,並由不同虛擬機中的某個類查找。這工作正常。但是(總是有一個但是)方法getReservationSession返回一個IReservationSession實例,它也實現了接口Remote(因爲我想在服務器上主持會話)。我收到了很多例外。然後,我導出了IReservationSession並返回了存根,而不是「原始」newSession(請參閱return語句)。但這是正確的策略嗎?我認爲Java RMI或多或少是透明的,但是這種導出對於返回引用似乎很難看?通過遠程引用返回

@Override 
public IReservationSession getReservationSession(String sessionId, String clientName) 
     throws RemoteException, IllegalArgumentException { 

    if (sessionId == null) { 
     throw new IllegalArgumentException(); 
    } 
    IReservationSession session = this.activeReservationSessions.get(sessionId); 

    if (session != null) { 
     return session; 
    } else { 
     ReservationSession newSession = new ReservationSession(this.namingService, sessionId, clientName); 
     this.activeReservationSessions.put(sessionId, newSession); 
     return (IReservationSession) UnicastRemoteObject.exportObject(newSession, 0); 
    } 
} 

回答

1

如果您的ReservationSession對象擴展了UnicastRemoteObject,它會在構造時自動導出自身。如果不是這樣,那麼你必須自己做。

+0

這是否也意味着您可以不在本地(僅遠程)調用該方法了? – Matthias

+0

如果對象未導出,則它不是遠程對象,因此無法遠程調用。 – EJP