30.8. 데드 커넥션 감지

이 섹션에서는 TTL(연결 시간)에 대해 설명하고, JBoss EAP 메시징에서 리소스를 완전히 닫지 않고 종료한 충돌한 클라이언트 및 클라이언트를 처리하는 방법을 설명합니다.

서버에서 Dead 연결 리소스 정리

JBoss EAP 클라이언트 애플리케이션이 종료되기 전에 finally 블록을 사용하여 제어된 방식으로 리소스를 종료해야 합니다.

다음은 finally 블록에서 세션 및 세션 팩토리를 적절하게 닫는 핵심 클라이언트의 예입니다.

ServerLocator locator = null;
ClientSessionFactory sf = null;
ClientSession session = null;

try {
   locator = ActiveMQClient.createServerLocatorWithoutHA(..);

   sf = locator.createClientSessionFactory();;

   session = sf.createSession(...);

   ... do some stuff with the session...
}
finally {
   if (session != null) {
      session.close();
   }

   if (sf != null) {
      sf.close();
   }

   if(locator != null) {
      locator.close();
   }
}

다음은 제대로 작동하는 자카르타 메시징 클라이언트 애플리케이션의 예입니다.

Connection jmsConnection = null;

try {
   ConnectionFactory jmsConnectionFactory = ActiveMQJMSClient.createConnectionFactoryWithoutHA(...);

   jmsConnection = jmsConnectionFactory.createConnection();

   ... do some stuff with the connection...
}
finally {
   if (connection != null) {
      connection.close();
   }
}

안타깝게도 클라이언트가 충돌하여 리소스를 정리할 기회가 없는 경우가 있습니다. 이 경우 서버 측 리소스가 서버에 중단될 수 있습니다. 이러한 리소스가 제거되지 않으면 서버에서 리소스 누수가 발생하고 시간이 지남에 따라 서버에 메모리 또는 기타 리소스가 부족해질 수 있습니다.

배달되지 않은 클라이언트 리소스를 정리하는 경우 클라이언트와 서버 간에 네트워크가 실패하고 다시 돌아와 클라이언트가 다시 연결할 수 있다는 사실을 알고 있어야 합니다. JBoss EAP는 클라이언트 재커넥션을 지원하므로 너무 빨리 "데드" 서버 측 리소스를 정리하지 않아야 합니다. 그렇지 않으면 클라이언트가 서버에서 이전 세션을 다시 연결하고 다시 얻을 수 없게 됩니다.

JBoss EAP는 이 모든 구성 가능한. ClientSessionFactory가 구성된 각 ClientSessionFactory, Time-To-Live 또는 TTL에 대해 속성을 사용하여 클라이언트에서 데이터가 없을 때 서버에서 연결을 밀리초 단위로 활성 상태로 유지하는 기간을 설정할 수 있습니다. 클라이언트는 서버가 연결을 종료하지 못하도록 주기적으로 "ping" 패킷을 자동으로 전송합니다. 서버가 TTL 시간 동안 연결 시 패킷을 받지 않으면 해당 연결과 관련된 서버의 모든 세션을 자동으로 종료합니다.

Jakarta Messaging을 사용하는 경우 연결 TTL은 ActiveMQConnectionFactory 인스턴스의 ConnectionTTL 속성에 의해 정의되거나 서버 측의 JNDI로 직접 Jakarta Messaging 연결 팩토리 인스턴스를 배포하는 경우 connectionTtl 매개 변수를 사용하여 xml 구성에서 지정할 수 있습니다.

http-connector 와 같은 네트워크 기반 연결의 ConnectionTTL 기본값은 60000 입니다(예: 1분). 내부 연결의 연결 TTL 기본값(예: in-vm 연결)은 -1 입니다. ConnectionTTL 의 값 -1 은 서버가 서버 측의 연결이 시간 초과되지 않음을 의미합니다.

클라이언트가 자체 연결 TTL을 지정하지 않도록 하려면 서버 측에 전역 값을 설정할 수 있습니다. 이 작업은 서버 구성에 connection-ttl-override 특성을 지정하여 수행할 수 있습니다. connection-ttl-override 의 기본값은 -1 이므로 클라이언트가 자체 값을 사용할 수 있게 합니다.

코어 세션 또는 자카르타 메시징 연결 닫기

모든 핵심 클라이언트 세션 및 Jakarta Messaging 연결은 사용을 완료하면 항상 finally 블록에서 명시적으로 닫혀야 합니다.

이렇게 하지 못하면 JBoss EAP는 가비지 컬렉션 시 이를 감지합니다. 그런 다음 연결을 종료하고 다음과 유사한 경고를 기록합니다.

[Finalizer] 20:14:43,244 WARNING [org.apache.activemq.artemis.core.client.impl.DelegatingSession]  I'm closing a ClientSession you left open. Please make sure you close all ClientSessions explicitly before let
ting them go out of scope!
[Finalizer] 20:14:43,244 WARNING [org.apache.activemq.artemis.core.client.impl.DelegatingSession]  The session you didn't close was created here:
java.lang.Exception
   at org.apache.activemq.artemis.core.client.impl.DelegatingSession.<init>(DelegatingSession.java:83)
   at org.acme.yourproject.YourClass (YourClass.java:666)

Jakarta Messaging을 사용하는 경우 경고에는 클라이언트 세션이 아닌 Jakarta Messaging 연결이 포함됩니다. 또한 로그는 닫지 않은 자카르타 메시징 연결 또는 코어 클라이언트 세션이 인스턴스화된 정확한 코드 행을 알려줍니다. 이렇게 하면 코드의 오류를 찾아 적절하게 수정할 수 있습니다.

클라이언트 측에서 오류 감지

클라이언트가 서버에서 데이터를 수신하는 한 연결은 활성 상태로 간주됩니다. 클라이언트에서 client-failure-check-period 밀리초 패킷을 수신하지 못하면 연결이 실패하고 페일오버를 시작하거나 클라이언트 구성 방법에 따라 Jakarta Messaging을 사용하는 경우 FailureListener 인스턴스 또는 ExceptionListener 인스턴스를 호출합니다.

Jakarta Messaging을 사용하는 경우 이 동작은 ActiveMQConnectionFactory 인스턴스의 ClientFailureCheckPeriod 특성에 의해 정의됩니다.

네트워크 연결의 클라이언트 장애 확인 기간(예: HTTP 연결)의 기본값은 30000 또는 30초입니다. in-vm 연결의 클라이언트 장애 확인 기간의 기본값은 -1 입니다. 값 -1 은 서버에서 데이터를 수신하지 않으면 클라이언트가 클라이언트 측에서 연결이 실패하지 않음을 의미합니다. 어떤 연결 유형이건 간에 일반적으로 확인 기간은 서버의 연결 TTL 값보다 훨씬 낮으므로 클라이언트가 전송 오류가 발생할 경우 다시 연결할 수 있습니다.

비동기 연결 실행 구성

서버 측에서 수신된 대부분의 패킷은 원격 스레드에서 실행됩니다. 이러한 패킷은 단기 작업을 나타내며 성능상의 이유로 항상 리모팅 스레드에서 실행됩니다.

그러나 기본적으로 스레드 풀의 스레드를 사용하여 일부 종류의 패킷이 실행되므로 원격 스레드가 너무 오랫동안 연결되어 있지 않습니다. 다른 스레드에서 처리 작업을 비동기적으로 수행할 경우 약간의 대기 시간이 추가됩니다. 이러한 패킷은 다음과 같습니다.

org.apache.activemq.artemis.core.protocol.core.impl.wireformat.RollbackMessage

org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionCloseMessage

org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionCommitMessage

org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXACommitMessage

org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXAPrepareMessage

org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXARollbackMessage

비동기 연결 실행을 비활성화하려면 매개 변수 async-connection-execution-enabledfalse로 설정합니다. 기본값은 true입니다.