2013-10-29 107 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