当将消息添加到没有订阅者的 ActiveMQ 代理中的队列时,队列会填满,最终生产者线程挂起,无法再发布任何消息。
为了解决这个问题,我在消息上设置了一个过期时间,认为这会释放内存,但不幸的是这不起作用。有谁知道我该如何解决问题?
我的代理 ActiveMQ 版本是 5.7,代理定义是:
<bean id="mqBroker" class="org.apache.activemq.broker.BrokerService" init-method="start" destroy-method="stop">
<property name="brokerName" value = "mainBroker"/>
<property name="persistent" value="false"/>
<property name="useJmx" value="false"/>
<property name="transportConnectorURIs">
<list>
<value>tcp://localhost:7000</value>
</list>
</property>
</bean>
当 JConsole 无法向代理发布更多消息时,查看内存使用情况看起来不错(0% 使用情况)和过期计数 = 已发布计数。
我用来发布消息的代码是带有 spring 集成的:
<jms:outbound-channel-adapter
channel="jsonChannel"
connection-factory="jmsConnectionFactory"
pub-sub-domain="false"
destination-name="MY_QUEUE"
time-to-live="60000"
wxplicit-qos-enabled="true" />
代理会定期扫描队列以丢弃过期的消息。 问题是过期的消息发生了什么。 鉴于您拥有的配置,它们可能最终出现在 DLQ 中,因此您可能需要考虑配置丢弃策略以不将过期邮件添加到 DLQ。 有关此问题,请参阅 ActiveMQ 文档。
你
- 将
message.setJMSExpiration(...);
用于您的javax.jms.Message
或 - 设置"生存时间"属性(专为主题发布而设计,但在特殊情况下也可用于队列)
?