BlazeDS+Spring+activeMQ outofmemory blazedsactivemq
程序员文章站
2022-06-06 15:13:44
...
一、BlazeDS内存溢出修改方案:
BlazeDS在大数据量、频繁推送数据或者频繁刷新页面、且服务器session时间超长的情况下,会导致内存泄漏。由于http协议是无状态的,所以客户端不主动通知blazeds,blazeds是不知道客户端已经断开,一直会等到session超时,且客户端每链接一次服务器,都会产生一个FlexClient,FlexClient对象会维护一个消息队列,所以解决这个问题就应该从两个地方入手,客户端和服务器。
1、flex端代码修改(主动关闭链接)
(1)
//监听页面离开事件
//页面离开 主动关闭链接
修改配置文件flex-services-config.xml :
二、activeMQ内存溢出修改方案:
acitveMQ在5.4版本以后,能对慢消费者进行处理,比如blazeds+spring+activemq集成时,如果所有客户端与blazeds断开链接,但activemq还会继续向spring JMSAdapter发生数据,且spring JMSAdapter接受到消息后放消息队列里,且不通知activemq,从而导致内存溢出。
修改activemq配置文件
配置解释:
(1):客户端监听beforeunload事件,断开链接。工具类见附件“MessageConnectManager.as ”
(2)(3):服务器端保护措施,附件“TimeoutOutBoundQueueProcessor.java ”
messageTimeOut:队列中消息超时时间,单位毫秒,超过指定时间,剔除队列;
clientTimeOut:客户端超时时间,如果超过指定时间,blazeDS没有向客户端flush数据,说明客户端已经断开链接,目前测试blazeds最大flush时间1分钟
(4):activeMQ慢消费者处理策略
topicPrefetch:消费者收到但没有应答的队列长度,超过这个长度,mq就不会向这个消费者推送数据
slowConsumerStrategy:慢消费者策略(如何衡量一个消费者慢? 在指定时间内未响应消息长度达到topicPrefetch设置或者达到到指定慢的次数,目前使用前者)
checkPeriod:检查消费者是否慢的频度
maxSlowDuration:慢持续时间
abortConnection:是否中断链接(注意 不能中断)
(5):activeMQ占用系统资源限制,超过限制,持久化到磁盘。
BlazeDS在大数据量、频繁推送数据或者频繁刷新页面、且服务器session时间超长的情况下,会导致内存泄漏。由于http协议是无状态的,所以客户端不主动通知blazeds,blazeds是不知道客户端已经断开,一直会等到session超时,且客户端每链接一次服务器,都会产生一个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内存溢出修改方案:
acitveMQ在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):服务器端保护措施,附件“TimeoutOutBoundQueueProcessor.java ”
messageTimeOut:队列中消息超时时间,单位毫秒,超过指定时间,剔除队列;
clientTimeOut:客户端超时时间,如果超过指定时间,blazeDS没有向客户端flush数据,说明客户端已经断开链接,目前测试blazeds最大flush时间1分钟
(4):activeMQ慢消费者处理策略
topicPrefetch:消费者收到但没有应答的队列长度,超过这个长度,mq就不会向这个消费者推送数据
slowConsumerStrategy:慢消费者策略(如何衡量一个消费者慢? 在指定时间内未响应消息长度达到topicPrefetch设置或者达到到指定慢的次数,目前使用前者)
checkPeriod:检查消费者是否慢的频度
maxSlowDuration:慢持续时间
abortConnection:是否中断链接(注意 不能中断)
(5):activeMQ占用系统资源限制,超过限制,持久化到磁盘。
推荐阅读
-
Android 加载大图及多图避免程序出现OOM(OutOfMemory)异常
-
Android Bitmap OutOfMemory 解决办法
-
【JVM系列1】深入分析Java虚拟机堆和栈及OutOfMemory异常产生原因
-
BlazeDS+Spring+activeMQ outofmemory blazedsactivemq
-
BlazeDS+Spring+activeMQ outofmemory blazedsactivemq
-
android OutOfMemory时抓取heap快照
-
android OutOfMemory时抓取heap快照
-
【JVM系列1】深入分析Java虚拟机堆和栈及OutOfMemory异常产生原因
-
java.lang.OutOfMemory
-
java.lang.OutOfMemory