2012-04-02 1 views
0

고객이 듣고 싶은 주제 (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() 메소드)를 구현해야합니까?

답변

1

이것은 원격 세션 패턴의 작업입니다. 모든 클라이언트가 할당하는 로그인 단계를 수행하고 정말 다시 세션 객체이며, 새로운 원격 객체 반환

  1. 다른를 제공하는 객체를 안 export logout() 방법을 가지고 있습니다를 클라이언트가 필요로하는 API 및

  2. Unreferenced을 구현하고 unreferenced() 메서드는 logout()을 호출합니다.

따라서 클라이언트가 logout()을 호출하거나 개체가 사라지면 개체가 사라집니다. 어떠한 부수적 인 조치가 필요한지는 모두 logout() 방법에서 발생할 수 있습니다.

+0

지금까지 관련 응용 프로그램 API를 제공 한 모든 클라이언트가 공유하는 단일 원격 객체 등록을 사용했습니다.내가 틀렸다면 해결책 하나의 Register 객체가 login() 메소드를 사용하는 일부 LoginService 원격 객체로 바뀌고 각 클라이언트마다 고유 한 RemoteSession 원격 객체가 반환됩니다. 나는 귀하의 솔루션이 내가 찾고있는 것이라고 믿습니다. RemoteSession 패턴 또는 분산 시스템 패턴에 대한 추가 정보는 무엇이 좋습니까? –

+1

@ Paweł 정확히 맞습니다. 필자가 알고있는 한, Java RMI에 관한 저의 책에서 원격 세션 패턴을 발명하고 명명했습니다.이 세션은 여전히 ​​간접적으로 찾을 수 있습니다. http://www.amazon.com//gp/offer-/0201700433/sr =/qid = /? 조건 = 사용 및 태그 = bf-dt-home-20 – EJP

+0

대단히 감사합니다! –

-1

remoteException이 발생하면 클라이언트가 작동하지 않는다는 의미는 아니며 ConnectException 등과 같이 remoteEception의 하위 유형을 검사해야만 더 이상 종단점이 없다는 것을 알려주며 클라이언트의 등록을 취소 할 수 있습니다.

클라이언트가 살아 있는지 확인하려면 클라이언트 측에 더미 API를 구현하고 타이머 태스크에서 클라이언트에 대해 ping을 수행하는 데 사용할 수 있습니다. 클라이언트 등록의 staleness의 심각도에 따라이 ping 간격을 최적화 할 수 있습니다.

+0

서버는 클라이언트와 통신 할 때 발생하는 RemoteExceptions을 catch 할 수 없습니다. 원격 메소드가 시작되기 전에 또는 반환 된 후에 발생합니다. 클라이언트 만 RemoteExceptions를 수신 할 수 있습니다. – EJP