BlazeDS+Spring+activeMQ outofmemory
BlazeDS는 빅데이터 양, 데이터 전송 빈번, 페이지 리셋이 빈번하고 서버session 시간이 너무 긴 경우 메모리 유출을 초래할 수 있습니다.http 프로토콜은 무상태이기 때문에 클라이언트가blazeds에게 주동적으로 알리지 않는다.blazeds는 클라이언트가 끊어진 것을 모르고 세션이 시간을 초과할 때까지 기다린다. 그리고 클라이언트가 서버를 연결할 때마다 FlexClient가 생기고 FlexClient 대상은 하나의 메시지 대기열을 유지하기 때문에 이 문제를 해결하려면 두 곳에서 시작해야 한다. 클라이언트와 서버.
1. flex 사이드 코드 수정(링크 자동 닫기)
(1)
//페이지 종료 이벤트 감청
var connectManager:MessageConnectManager = MessageConnectManager.getInstance();
connectManager.regist();
connectManager.addEventListener(MessageConnectManager.DISCONNECT,disConnectHandler);
//페이지 비활성화 링크 닫기
protected function disConnectHandler(e:Event):void
{
if(this.consumer && this.consumer.channelSet){
this.consumer.channelSet.disconnectAll();
}
}
2, blazeDS 프로필 수정(네트워크가 끊기거나 사용자가 페이지를 자주 새로 고쳐 메모리 유출)프로필 flex-services-config를 수정합니다.xml :
<channel-definition id="my-polling-amf" class="mx.messaging.channels.AMFChannel">
<endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amfpolling" class="flex.messaging.endpoints.AMFEndpoint"/>
<properties>
.....(2)
<flex-client-outbound-queue-processor class="processor.TimeoutOutBoundQueueProcessor">
<properties>
<!--message time out in millisecond-->
<messageTimeOut>30000</messageTimeOut>
<!--client time out in millisecond-->
<clientTimeOut>12000</clientTimeOut>
</properties>
</flex-client-outbound-queue-processor>
</properties>
</channel-definition>
<channel-definition id="my-longpolling-amf" class="mx.messaging.channels.AMFChannel">
<endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amflongpolling" class="flex.messaging.endpoints.AMFEndpoint"/>
<properties>
.....(3)
<flex-client-outbound-queue-processor class="processor.TimeoutOutBoundQueueProcessor">
<properties>
<!--message time out in millisecond-->
<messageTimeOut>30000</messageTimeOut>
<!--client time out in millisecond-->
<clientTimeOut>12000</clientTimeOut>
</properties>
</flex-client-outbound-queue-processor>
</properties>
</channel-definition>
둘째, activeMQ 메모리 넘침 수정 방안:
acitve MQ는 5.4 버전 이후에 느린 소비자를 처리할 수 있습니다. 예를 들어blazeds+spring+activemq가 통합될 때 모든 클라이언트가blazeds와 링크를 끊으면,activemq는spring JMSAdapter에 데이터를 계속 발생시키고spring JMSAdapter가 메시지를 받은 후에 메시지 대기열에 넣고activemq에 알리지 않아 메모리가 넘칩니다.
activemq 프로필 수정
<broker xmlns="http://activemq.apache.org/schema/core"
brokerName="messagebus" dataDirectory="activemq/data"
destroyApplicationContextOnStop="true" persistent="true">
<destinationPolicy>
<policyMap>
<policyEntries>
........(4)
<policyEntry topic=">" producerFlowControl="false" memoryLimit="1mb" topicPrefetch="100" >
<slowConsumerStrategy>
<abortSlowConsumerStrategy checkPeriod="30000" maxSlowDuration="120000" abortConnection="false" />
</slowConsumerStrategy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
.......(5)
<systemUsage>
<systemUsage>
<memoryUsage>
<memoryUsage limit="20 mb"/>
</memoryUsage>
<storeUsage>
<storeUsage limit="1 gb"/>
</storeUsage>
<tempUsage>
<tempUsage limit="100 mb"/>
</tempUsage>
</systemUsage>
</systemUsage>
</broker>
구성 설명:
(1): 클라이언트가 beforeunload 이벤트를 감청하고 링크를 끊습니다.도구 클래스는 첨부 파일 "MessageConnectManager.as"를 참조하십시오.
(2)(3): 서버 측 보호 조치, 첨부 파일 "TimeoutOutBoundQueue Processor.java"
messageTimeOut: 대기열의 메시지 시간 초과 시간, 단위 밀리초, 지정된 시간을 초과하여 대기열을 제거합니다.
client Time Out: 클라이언트의 시간 초과 시간, 지정된 시간을 초과하면blazeDS가 클라이언트flush 데이터에 대한 데이터가 없습니다. 클라이언트가 링크를 끊었음을 의미합니다. 현재 테스트blazeds의 최대 flush 시간 1분입니다.
(4): activeMQ 느린 소비자 처리 전략
topicPrefetch: 소비자가 받았지만 응답하지 않은 대기열 길이, 이 길이를 초과하면 mq는 이 소비자에게 데이터를 전송하지 않습니다
slowConsumerStrategy: 느린 소비자 정책(소비자가 느린 것을 어떻게 평가합니까? 지정된 시간 내에 응답하지 않은 메시지의 길이가 topicPrefetch 설정에 도달하거나 느린 횟수에 도달했습니다. 현재 전자를 사용하고 있습니다)
checkPeriod: 소비자의 느린 빈도 확인
maxSlowDuration: 느린 지속 시간
abortConnection: 링크 중단 여부(중단할 수 없음 주의)
(5): activeMQ는 시스템 자원 제한을 차지하고 제한을 초과하여 디스크로 지속됩니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
activeMQ의 질문오늘은 mule로 activeMQ와 통합할 때, mule를 시작할 때 항상 activeMQ의 시작에 머물러 있습니다.원본 코드를 보니 active MQ에 사순환이 생겼습니다. 위의 코드에서dolock은 시종일관fal...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.