9장. 손상된 연결 감지
때때로 클라이언트는 예기치 않게 중지되고 리소스를 정리할 기회가 없습니다. 이 경우 리소스를 결함이 있는 상태로 두고 브로커가 메모리 또는 기타 시스템 리소스가 부족해질 수 있습니다. 브로커는 가비지 컬렉션 시 클라이언트 연결이 제대로 종료되지 않았음을 감지합니다. 연결이 닫히고 아래와 유사한 메시지가 로그에 기록됩니다. 로그는 클라이언트 세션이 인스턴스화된 정확한 코드 라인을 캡처합니다. 이를 통해 오류를 식별하고 수정할 수 있습니다.
[Finalizer] 20:14:43,244 WARNING [org.apache.activemq.artemis.core.client.impl.DelegatingSession] I'm closing a JMS Conection you left open. Please make sure you close all connections 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)
- 1
- 연결이 인스턴스화된 클라이언트 코드의 행입니다.
클라이언트 측에서 영구 연결 감지
브로커로부터 데이터를 수신하는 한 클라이언트는 연결을 활성으로 간주합니다. client-failure-check-period 속성에 대한 값을 제공하여 클라이언트가 실패 연결을 확인하도록 구성합니다. 네트워크 연결의 기본 검사 기간은 30000밀리초이며 In-VM 연결의 기본값은 -1 입니다. 즉, 데이터가 수신되지 않으면 클라이언트가 해당 측에서 연결을 실패하지 않습니다.
일반적으로 점검 기간을 브로커의 연결 시간-라이브에 사용된 값보다 훨씬 낮게 설정하여 일시적인 오류가 발생할 경우 클라이언트가 다시 연결할 수 있도록 합니다.
아래 예제에서는 코어 JMS 클라이언트를 사용하여 점검 기간을 10000밀리초로 설정하는 방법을 보여줍니다.
절차
손실된 연결 감지에 대한 검사 기간을 설정합니다.
Core JMS 클라이언트와 함께 JNDI를 사용하는 경우 JNDI 컨텍스트 환경(예:
jndi.properties) 내에서 검사 기간을 설정합니다.java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory connectionFactory.myConnectionFactory=tcp://localhost:61616?clientFailureCheckPeriod=10000JNDI를 사용하지 않는 경우
ActiveMQConnectionFactory.setClientFailureCheckPeriod()에 값을 전달하여 검사 기간을 직접 설정합니다.ConnectionFactory cf = ActiveMQJMSClient.createConnectionFactory(...) cf.setClientFailureCheckPeriod(10000);
9.1. 연결 Time-To-Live 링크 복사링크가 클립보드에 복사되었습니다!
클라이언트와 서버 간의 네트워크 연결이 실패하고 다시 온라인 상태가 될 수 있으므로 클라이언트가 다시 연결할 수 있으므로 AMQ Broker에서 비활성 서버 측 리소스를 정리할 때까지 기다립니다. 이러한 대기 기간을 TTL(Time-to-Live)이라고 합니다. 네트워크 기반 연결의 기본 TTL은 60000 밀리초(1분)입니다. In-VM 연결의 기본 TTL은 -1 이며, 이는 브로커가 브로커 측의 연결을 초과하지 않음을 의미합니다.
브로커에서 Time-To-Live 구성
클라이언트가 자체 연결 TTL을 지정하지 않도록 하려면 브로커 측에 글로벌 값을 설정할 수 있습니다. 이 작업은 브로커 구성에 connection-ttl-override 요소를 지정하여 수행할 수 있습니다.
connection-ttl-check-interval 요소에 의해 결정된 대로 TTL 위반에 대한 연결을 확인하는 논리가 브로커에서 주기적으로 실행됩니다.
절차
connection-ttl-override구성 요소를 추가하고 아래 예제와 같이 BROKER_INSTANCE_DIR/etc/broker.xml을 편집합니다.<configuration> <core> ... <connection-ttl-override>30000</connection-ttl-override>1 <connection-ttl-check-interval>1000</connection-ttl-check-interval>2 ... </core> </configuration>
클라이언트에서 Time-To-Live 구성
기본적으로 클라이언트는 자체 연결에 대한 TTL을 설정할 수 있습니다. 아래 예제에서는 코어 JMS 클라이언트를 사용하여 Time-To-Live를 설정하는 방법을 보여줍니다.
절차
클라이언트 연결의 Time-To-Live를 설정합니다.
JNDI를 사용하여 연결 팩토리를 인스턴스화하는 경우 매개 변수
connectionTTL을 사용하여 XML 구성에서 지정할 수 있습니다.java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory connectionFactory.myConnectionFactory=tcp://localhost:61616?connectionTTL=30000JNDI를 사용하지 않는 경우 연결 TTL은
ActiveMQConnectionFactory인스턴스의ConnectionTTL특성에 의해 정의됩니다.ConnectionFactory cf = ActiveMQJMSClient.createConnectionFactory(...) cf.setConnectionTTL(30000);