ActiveMQ Artemis临时队列控制台展示问题及优化需求
解决方案
一、隐藏Jolokia控制台中的临时队列
Jolokia支持通过MBean过滤规则隐藏特定资源,直接在配置中排除临时队列对应的MBean即可:
- 找到Jolokia的配置文件(Spring Boot项目可在
application.properties/yaml中配置,独立部署则修改jolokia-agent.xml) - 添加匹配临时队列命名的过滤规则,示例如下(如果你的临时队列以
temp-开头):
根据实际临时队列的命名模式调整jolokia.mbean.exclude=org.apache.activemq:type=Broker,brokerName=*,destinationType=Queue,destinationName=temp-*destinationName的匹配表达式。
二、修复临时队列命名空间配置(实现归类)
之前配置<temporary-queue-namespace>temp</temporary-queue-namespace>未生效,大概率是配置位置或配套策略缺失,按以下步骤调整:
- 在ActiveMQ的
activemq.xml中,将命名空间配置放在<broker>节点下,同时配套地址策略:<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}"> <!-- 其他原有配置 --> <destinationPolicy> <policyMap> <policyEntries> <policyEntry queue="temp.#" /> </policyEntries> </policyMap> </destinationPolicy> <temporary-queue-namespace>temp</temporary-queue-namespace> <!-- 其他原有配置 --> </broker> - 重启ActiveMQ后,新创建的临时队列会自动以
temp://前缀命名,归到temp地址文件夹下。若仍不生效,检查Spring JmsTemplate是否有自定义配置覆盖了临时队列的创建逻辑。
三、从根源减少临时队列数量
每日产生上千个临时队列,说明存在队列未及时清理的情况,可从两方面优化:
- 手动管控临时队列生命周期:Spring JmsTemplate默认会清理临时队列,但异常场景下可能残留,可手动兜底:
TemporaryQueue tempQueue = session.createTemporaryQueue(); try { Message response = jmsTemplate.sendAndReceive(destination, session -> { Message msg = session.createTextMessage("request"); msg.setJMSReplyTo(tempQueue); return msg; }); } finally { tempQueue.delete(); } - 配置临时队列自动过期:在
activemq.xml中缩短闲置临时队列的清理周期:
上述配置会每30秒清理一次闲置临时队列。<broker> <systemUsage> <systemUsage> <tempUsage> <tempUsage limit="100 mb" expireMessagesPeriod="30000" /> </tempUsage> </systemUsage> </systemUsage> </broker>
四、自定义Jolokia控制台视图(进阶)
如果以上方案都不满足,可基于Jolokia的API自定义控制台视图:
- 调用Jolokia的
search接口过滤出非临时队列的MBean,自行构建只展示持久化队列的简化页面,或修改现有控制台的显示逻辑。
内容的提问来源于stack exchange,提问作者Mançaux Pierre-Alexandre
相关产品推荐
相关产品推荐

