我有activemq在我的系统中使用,我看到的是以下消息: TopicSubscription:consumer = ...:等待消息游标[org.apache.activemq.broker.region .cursors.VMPendingMessageCursor @ 1684f89c]已满,达到临时使用(0%)或内存使用率(100%)限制,阻止消息添加(),等待释放资源。activemq缓慢消费者块生产者,虽然producerFlowControl是false
这是因为如果我理解正确,我的消费者速度很慢,而我的制片人速度很快。其结果是,最终我的制作人被阻止,直到消费者阅读消息并释放一些内存。我想知道的是,我的制作人没有被封锁,而且当内存已满时,旧信息正在被分散。
鉴于我的理解我已阅读以下配置应该做的伎俩(messageEvictionStrategy,pendingMessageLimitStrategy),但它不适合我,我不明白为什么。
由于测试的原因,我已经指定低存储空间限制低(35Mb),以使问题更快,但情况是我最终需要它,当问题发生时,activemq才放弃旧消息。
我发现在ActiveMQConnectionFactory useAsyncSend = true并指定sendTimeout中设置了一个令人不满意的解决方案。这使得生产者不被阻止,但是通过这种方式,最新的消息被丢弃,而不是旧的消息。
最后,我正在谈论非持久性话题。
任何帮助家伙会完美。下面我ActiveMQ的配置
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry topic=">" producerFlowControl="false" memoryLimit="35 Mb">
<pendingSubscriberPolicy>
<vmCursor />
</pendingSubscriberPolicy>
<messageEvictionStrategy>
<oldestMessageEvictionStrategy/>
</messageEvictionStrategy>
<pendingMessageLimitStrategy>
<constantPendingMessageLimitStrategy limit="10"/>
</pendingMessageLimitStrategy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
<systemUsage>
<systemUsage sendFailIfNoSpace="true">
<memoryUsage>
<memoryUsage limit="35 mb"/>
</memoryUsage>
<storeUsage>
<storeUsage limit="1 gb"/>
</storeUsage>
<tempUsage>
<tempUsage limit="5000 mb"/>
</tempUsage>
</systemUsage>
</systemUsage>
的ActiveMQ版本5.7.0
我使用Spring模板来发送邮件:
<bean class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="pooledJmsConnectionFactory"/>
<property name="timeToLive" value="100"/>
</bean>
我发送javax.jms.ObjectMessage,体积小relativelly。
我在客户前提中发现问题我在应用程序中有许多应用程序,但设法重现它从1个线程不断地发送,不停地发送消息总是到同一主题。发送的消息只是一个小字符串。
我只有一个生产者,当我有1个(或更多)慢消费者时,问题似乎就会出现 - 但是一个慢消费者就够了。如果不存在缓慢的消费者,则不会出现问题。
我不认为这有什么差别,但我使用
<transportConnectors>
<transportConnector name="openwire" uri="nio://0.0.0.0:33029?wireFormat.maxInactivityDuration=60000&wireFormat.maxInactivityDurationInitalDelay=60000"/>
</transportConnectors>
难题或我不描述的东西?请告诉我,如果有什么东西是未知的或需要进一步澄清 – Alexandros