문제

ActiveMQ에서 성능 테스트를 구현하려고 노력하고 있으므로 기본 생산자와 소비자를 설정하여 대기열을 통해 메시지를 보내고받습니다. 문제가없는 프로듀서를 만들어 특정 수의 메시지를 대기열에 작성하도록했습니다.

 for(int i = 0; i < numberOfMessages; i++){
                try{
                    String message = generateText(sizeOfMessage);
                    produceMessage(message);
                }
                catch (Exception e) {
                    logger.error("Caught exception while sending message", e);
                }
            }

이것은 아무런 문제없이 계속 완료되며, 올바른 수의 메시지가 보류중인 관리 웹 사이트에서 확인하여이를 확인했습니다.

큐에서 메시지를 받으려고 할 때 문제가 발생합니다. 간단한 소비자를 사용하여 대기열에서 읽으면 큐에서 다양한 수의 메시지를 읽지 만 메시지 중 하나를 받으려고 할 때 중지됩니다. 큐에 읽을 메시지가 여전히 있다는 것을 알 수 있지만 클라이언트는 메시지 중 하나를 전달하지 않습니다. 간단한 방법을 사용하여 메시지를 받고 있습니다.

Message message = jmsTemplate.receive();

그리고 일부 메시지 (약 20-30)에서 작동하지만 잠금됩니다. 메시지의 일부 캐릭터는 탈출 문자 일 수 있다고 제안되었습니다 (실제로는 성능 테스트이기 때문에 실제로 어떤 콘텐츠도 전송하는 것이 아니라) 모든 메시지를 변경 했으므로 모든 메시지를 변경했습니다. char '2'의 반복이고 여전히 운이없는 같은 문자열로. Spring 구성을 사용하여 ActiveMQ 대기열에 액세스하는 데 필요한 모든 구성 요소를로드하고 있으며 큐가 LocalHost에서 실행 중입니다.

도움이 되었습니까?

해결책

아직 이에 대한 견해는 많지 않지만, 나중에 참조 할 수 있도록 누군가가 같은 문제가 있다면 솔루션을 찾았습니다. ActiveMQ에 대한 구성은 발신자와 수신자가 사용하는 메모리의 양을 속도를 늦추기 전에 다음과 같습니다.

<systemUsage>
            <systemUsage>
                <memoryUsage>
                    <memoryUsage limit="20 mb"/>
                </memoryUsage>
                <storeUsage>
                    <storeUsage limit="1 gb" name="foo"/>
                </storeUsage>
                <tempUsage>
                    <tempUsage limit="100 mb"/>
                </tempUsage>
            </systemUsage>
        </systemUsage>

나는이 구성을 완전히 제거했고 이제는 꿈이 작동합니다. 나는 성능 테스트를 수행하고 있으므로 자신의 제약을 넣고 싶을 수도 있지만 이것이 확실히 내 문제의 원인이었습니다!

다른 팁

메시징의 고전적인 문제; 느린 소비자와해야 할 일. FWIW 최신 ActiveMQ 릴리스 5.2와 같은 ActiveMQ 릴리스는 메모리가 낮아질 때 생산자를 차단하지 않고 디스크로 스풀을 할 수 있습니다.

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