문제

서버 애플리케이션에 주기적으로 "살아남기" 메시지를 보내야 하는 Java로 작성된 RMI 클라이언트 애플리케이션이 있습니다.우리는 이것을 별도의 하트비트 스레드로 구현했습니다. 이 스레드는 연결 유지 메시지를 서버에 보낸 다음 Thread.sleep()을 사용하여 15초 동안 휴면합니다.

스레드가 높은 우선순위로 설정되었습니다.

Thread heartbeatThread = new Thread(new HeartbeatRunnable(server));
heartbeatThread.setPriority(Thread.MAX_PRIORITY);
heartbeatThread.start();

그러나 클라이언트가 실행 중인 시스템이 많은 CPU를 사용하는 경우 하트비트가 누락되어 서버가 클라이언트 애플리케이션이 종료된 것으로 가정하게 됩니다.

메인 스레드에 Thread.yield() 호출을 추가했지만 이로 인해 문제가 사라지지는 않았습니다.

내 애플리케이션이 계속 실행되는 동안 하트비트가 제 시간에 전송되도록 보장할 수 있는 방법이 있습니까?

도움이 되었습니까?

해결책

코드에서 자체 작성된 "수율"기능을 자유롭게 산란시켜 스레드되지 않은 환경에서 사용자 모드 스레딩을 구현할 수 있습니다.

마찬가지로 코드에 심장 박동 점검 기능 호출을 자유롭게 산란시킬 수 있습니다. 스레드를 포기하고, 심장 박동 기능을 정기적으로 호출하여 심장 박동이 아직 보내야하는지 확인하기 위해 확인하십시오.

그것은 원유 솔루션이지만, 적절한 솔루션을 시도했지만 작동하지 않으면 아마도 당신이 돌아와야 할 것일 것입니다.

실제로 당신이 할 수있는 일은 모든 기능 호출의 시작 부분에 매크로를 배치하는 것입니다. 시간을 빠르게 확인하고 필요할 때 하트 비트 기능을 호출합니다.

(아, 자바에 매크로가 있습니까? 나는 생각하지 않지만 아이디어를 얻는다).

다른 팁

당신은 실제로 그것을 보장 할 수 없습니다. 하트 비트를 다른 실로 보내서 심장 박동을 추가하는 데 걸리는 시간을 지연시킬 수 있습니다. 서버가 클라이언트를 결정하는 데 사용하는 시간의 절반으로 두 개의 하트 비트 사이의 지연을 설정하는 것이 좋습니다. 즉, 서버가 15 초 후에 클라이언트를 시간에 빠뜨리는 경우 (시도) 7.5 초마다 하트 비트를 보냅니다.

CPU를 사용하는 프로세스에 따라 다릅니다.

귀하의 프로세스가 아니고 클라이언트 프로세스가 실제로 응답하지 않는 경우 모든 의도와 목적이 살아 있지 않은 것이므로 하트비트를 보내지 않는 것이 적절합니다.상자에 너무 많은 짐을 싣고 '나는 일어나서 메시지를 처리할 수 있습니다'라고 말하는 하트비트 메시지가 있으면 오해의 소지가 있습니다.

하트비트 메시지의 의도가 '이 프로세스가 실행 중이지만 다시 연락할 때까지 30분 정도 걸릴 수 있습니다'라고 말하는 것이라면 해당 처리를 수행하는 모든 작업이 해당 메시지를 서버로 보내도록 합니다.또는 클라이언트의 응답성에 맞는 제한 시간을 설정하세요.

클라이언트를 사용할 수 없다고 결정하기 전에 서버가 기다리는 "누락 된 심장 박동"수를 구성해야합니다.

예를 들어, 심장 박동 간격이 15 초이고 누락 된 심장 박동 수가 4 인 경우 서버는 클라이언트가 도달 할 수 없다고 결정하기 전에 최대 60 초 (1 분)까지 기다립니다.

아마도 최상의 솔루션은 타이머를 사용하는 것입니다. scheduleatfixedrate. 이를 통해 하나의 실행이 지연되면 (Java에서 피할 수없는) 후속 통화는 영향을받지 않습니다.

서버가 살아 있다고 발표하기를 원한다면 열린 소켓을 제시하는 것이 좋습니다. 클라이언트에서는 그 소켓에서 단순히 읽습니다. 서버가 아무것도 쓰지 않기 때문에 차단되며 서버가 사라지거나 종료되면 클라이언트가 서버 소켓/포트가 사라 졌음을 나타내는 IOException이 나타납니다.

이것은 적시에 심장 박동을 제공하는 서버에 의존하지 않습니다. 몇 가지 리소스 (서버 끝의 TCP 포트 및 대역폭 없음)를 사용하며 서버 (또는 서버 시스템)를 사용할 수 없을 때시기 적절하게 드러납니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top