고객이 듣고 싶은 주제 (0 개 이상) 및 주제 (0 개 또는 1 개)를 등록하고자하는 Java RMI를 사용하여 애플리케이션을 개발 중입니다. 등록 서비스를 제공하는 중앙 서버가 있습니다. 클라이언트의 통신은 ListenerCallback 또는 SpeakerCallback의 초기 등록을 제외하고 서버를 피합니다. 클라이언트와 서버는 옵저버 패턴에 따라 작동합니다.Java RMI, 클라이언트 메소드를 호출하지 않을 때 서버가 비정상적인 클라이언트 종료를 어떻게 관리해야합니까?
콜백 인터페이스 : 서버에 등록 방법
public interface ListenerCallback extends Remote{
void notify(String topic, String msg) throws RemoteException;
}
public interface SpeakerCallback extends Remote{
Unregister accept(ListenerCallback listenerCallback) throws RemoteException;
}
단편, 화자와 청취자가 모두 원격 참조 같습니다에서 // TODO 위에 작성된
for (SpeakerCallback speaker : registeredSpeakers){
try {
speaker.accept(listener);
} catch (RemoteException e){
//TODO should I unregister speaker?
}
}
, I는 I 스피커의 등록을 취소한다 가정 RemoteException은 클라이언트와의 연결이 끊어 졌음을 나타냅니다.
내가 고민하고있는 문제는 일부 주제 만 듣고 아무 것도 말하지 않는 비정상적인 클라이언트 종료를 어떻게 관리해야하는지입니다. 서버는 응용 프로그램 레지스트리에 보유하고 있지만 notify() 메소드를 호출하지 않기 때문에 유효한지 여부를 판별 할 수있는 방법이 없습니다.
Shoud 클라이언트가 여전히 도달 가능한지 여부를 확인하기 위해 ListenerCallback 인터페이스에 일부 가짜 메소드를 추가합니까?
또는 일부 청취 클라이언트가 더 이상 사용할 수 없다는 것을 특정 주제 알림 서버에 대해 이야기하는 클라이언트 (이러한 호출 notify() 메소드)를 구현해야합니까?
지금까지 관련 응용 프로그램 API를 제공 한 모든 클라이언트가 공유하는 단일 원격 객체 등록을 사용했습니다.내가 틀렸다면 해결책 하나의 Register 객체가 login() 메소드를 사용하는 일부 LoginService 원격 객체로 바뀌고 각 클라이언트마다 고유 한 RemoteSession 원격 객체가 반환됩니다. 나는 귀하의 솔루션이 내가 찾고있는 것이라고 믿습니다. RemoteSession 패턴 또는 분산 시스템 패턴에 대한 추가 정보는 무엇이 좋습니까? –
@ Paweł 정확히 맞습니다. 필자가 알고있는 한, Java RMI에 관한 저의 책에서 원격 세션 패턴을 발명하고 명명했습니다.이 세션은 여전히 간접적으로 찾을 수 있습니다. http://www.amazon.com//gp/offer-/0201700433/sr =/qid = /? 조건 = 사용 및 태그 = bf-dt-home-20 – EJP
대단히 감사합니다! –