증상:
지속성 메시지를 보낼 때 send 메소드가 반환되지 않고 클라이언트가 차단됩니다.
지속성 메시지를 보낼 때 클라이언트에 예외가 발생합니다.
생성자 클라이언트가 느려집니다.
가능한 원인:
가능한 원인: 브로커가 백로그되고 느린 메시지 생성자로 응답했습니다.
백로그된 브로커가 브로커 메모리에 메시지를 누적시킵니다. 물리적 대상 메모리의 메시지 수와 메시지 바이트 수가 구성된 제한에 도달하면 브로커가 지정된 제한 동작에 따라 메모리 자원을 절약하려고 합니다. 다음 제한 동작은 메시지 생성자를 느리게 만듭니다.
FLOW_CONTROL: 브로커가 지속성 메시지의 수신을 바로 확인하지 않습니다. 따라서 생성자 클라이언트가 차단됩니다.
REJECT_NEWEST: 브로커가 새 지속성 메시지를 거부합니다.
마찬가지로 모든 물리적 대상의 브로커 전체 메모리에서 메시지 수나 메시지 바이트 수가 구성된 제한에 도달하면 브로커가 최신 메시지를 거부하여 메모리 자원을 절약하려고 합니다. 또한 물리적 대상이나 브로커 전체 제한이 제대로 설정되어 있지 않아 시스템 메모리 제한에 도달하면 브로커는 메모리 과부하를 막기 위해 점점 더 중대한 조치를 취합니다. 이러한 조치로는 메시지 생성자 억제가 있습니다.
문제의 원인을 확인하는 방법: 구성된 메시지 제한으로 인해 브로커가 메시지를 거부할 경우 브로커는 다음과 같은 예외를 반환합니다.
JMSException [C4036]: A server error occurred
브로커 로그에 다음 항목을 생성합니다.
[B2011]: Storing of JMS message from IMQconn failed
이 메시지 다음에는 제한에 도달했음을 나타내는 메시지가 표시됩니다.
[B4120]: Cannot store message on destination destName because capacity of maxNumMsgs would be exceeded.
이는 초과된 메시지 제한이 물리적 대상에 있거나
[B4024]: The maximum number of messages currrently in the system has been exceeded, rejecting message.
제한이 브로커 전체에 해당되는 경우에 표시됩니다.
좀 더 일반적으로 다음과 같은 방법으로 거부가 발생하기 전에 메시지 제한 조건을 확인할 수 있습니다.
물리적 대상과 브로커를 쿼리하여 각각에 구성된 메시지 제한 설정을 검사합니다.
적절한 imqcmd 명령을 사용하여 물리적 대상이나 브로커 전체에서 현재 메시지 수나 메시지 바이트 수를 모니터합니다. 모니터할 수 있는 메트릭 및 해당 메트릭을 가져오는 데 사용하는 명령에 대한 자세한 내용은 18 장, 메트릭 참조을 참조하십시오.
문제를 해결하는 방법:
메모리 자원을 초과하지 않도록 주의하면서 물리적 대상 또는 브로커 전체에 대한 메시지 제한을 수정합니다.
일반적으로는 브로커 전체 메시지 제한에 도달하는 일이 없도록 개별 대상 단위로 메모리를 관리해야 합니다. 자세한 내용은 브로커 조정을 참조하십시오.
메시지 제한에 도달하면 메시지 생성을 느리게 하기보다 메모리에서 메시지를 버리도록 대상의 제한 동작을 변경합니다.
예를 들어, 메모리에 누적되는 메시지를 삭제하는 REMOVE_OLDEST 및 REMOVE_LOW_PRIORITY 제한 동작을 지정할 수 있습니다(표 15–1 참조).
가능한 원인: 브로커가 지속성 메시지를 데이터 저장소에 저장할 수 없습니다.
브로커가 데이터 저장소에 액세스할 수 없거나 지속성 메시지를 데이터 저장소에 기록할 수 없는 경우 생성자 클라이언트가 차단됩니다. 위에 설명되어 있는 대상 또는 브로커 전체 메시지 제한에 도달한 경우에도 이러한 상태가 발생할 수 있습니다.
문제의 원인을 확인하는 방법: 브로커가 데이터 저장소에 기록할 수 없는 경우 브로커는 브로커 로그에 다음 항목 중 하나를 만듭니다.
[B2011]: Storing of JMS message from connectionID failed [B4004]: Failed to persist message messageID
문제를 해결하는 방법:
파일 기반 지속성의 경우 파일 기반 데이터 저장소의 디스크 공간을 늘립니다.
JDBC 호환 데이터 저장소의 경우 JDBC 기반 지속성이 제대로 구성되어 있는지 확인합니다( 영구 데이터 저장소 구성 참조). 제대로 구성되어 있는 경우 데이터베이스 관리자에게 문의하여 다른 데이터베이스 문제를 해결합니다.
가능한 원인: 브로커 확인 시간 제한이 너무 짧습니다.
느린 연결 또는 CPU 사용률이 높거나 메모리 자원이 부족하여 무기력해진 메시지 서버로 인해 브로커가 지속성 메시지의 수신을 확인하는 데 연결 팩토리의 imqAckTimeout 속성 값에서 허용하는 것보다 더 많은 시간이 필요할 수 있습니다.
문제의 원인을 확인하는 방법: imqAckTimeout 값이 초과되면 브로커가 예외를 반환합니다.
JMSException [C4000]: Packet acknowledge failed
문제를 해결하는 방법: imqAckTimeout 연결 팩토리 속성 값을 변경합니다( 안정성 및 흐름 제어 참조).
가능한 원인: 생성자 클라이언트에서 JVM 제한이 발생했습니다.
문제의 원인을 확인하는 방법:
클라이언트 응용 프로그램이 메모리 부족 오류를 수신하는지 확인합니다.
freeMemory, maxMemory 및 totalMemory와 같은 런타임 메서드를 사용하여 JVM 힙에서 사용 가능한 메모리를 확인합니다.
문제를 해결하는 방법: JVM을 조정합니다( Java 가상 머신 조정 참조).