如何在 Spring Boot 中访问 JMS 统计信息?

How to access JMS statistics in Spring Boot?

我知道 JMS 没有统计规范,因此没有标准的方式来读取 "count of messages processed"、"average time in queue" 等内容

我正在寻找两种方法:

  1. 直接访问 ActiveMQ 统计数据
  2. 在 JMS 消息消费者中维护统计信息

对于 (1),我没有找到如何使用 Spring Boot 获取这些统计信息的示例。对于(2),我想知道消费者是否需要自己维护统计信息,或者是否有更好的方法。

有人有任何工作示例吗?

如果您使用带有 Spring 集成的 JMS,其系统管理功能会提供在 spring 启动应用程序中注册为千分尺指标的统计信息。

https://docs.spring.io/spring-integration/docs/5.1.7.RELEASE/reference/html/#system-management-chapter

https://docs.spring.io/spring-boot/docs/2.1.7.RELEASE/reference/html/boot-features-integration.html

https://docs.spring.io/spring-boot/docs/2.1.7.RELEASE/reference/html/production-ready-metrics.html

郑重声明,我最终实现了一个特定于代理的解决方案(此处:ActiveMQ)

import org.springframework.stereotype.Component
import javax.jms.*

typealias QueueName = String

@Component
class BrokerFacade(private val connectionFactory: ConnectionFactory) {
    private val statisticsBrokers = mutableMapOf<QueueName, StatisticsBrokerAccess>()

    @Throws(JMSException::class)
    fun getStatistics(queueName: QueueName): QueueStatistics? {
        val brokerAccess = statisticsBrokers.getOrPut(queueName, { StatisticsBrokerAccess(queueName) })
        return brokerAccess.getCurrentStatistics()?.let {
            QueueStatistics(
                queueName,
                it.getLong("size"),
                it.getLong("dequeueCount"),
                it.getDouble("minEnqueueTime"),
                it.getDouble("maxEnqueueTime"),
                it.getDouble("averageEnqueueTime"),
                it.getLong("memoryUsage"),
                it.getLong("memoryPercentUsage")
            )
        }
    }

    inner class StatisticsBrokerAccess(queueName: QueueName) {
        private val statisticsMessageConsumer: MessageConsumer;
        private val statisticsMessageProducer: MessageProducer;
        private val statisticsMessage: Message;

        init {
            val connection = connectionFactory.createConnection()
            connection.start()
            val session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE)
            val statisticsReplyQueue = session.createTemporaryQueue()
            statisticsMessageConsumer = session.createConsumer(statisticsReplyQueue)
            val statisticsQueue = session.createQueue("ActiveMQ.Statistics.Destination.$queueName")
            statisticsMessageProducer = session.createProducer(statisticsQueue)
            statisticsMessage = session.createMessage()
            statisticsMessage.setJMSReplyTo(statisticsReplyQueue)
        }

        fun getCurrentStatistics(): MapMessage? {
            statisticsMessageProducer.send(statisticsMessage)
            return statisticsMessageConsumer.receive(2000) as MapMessage?
        }
    }
}

QueueStatistics 是保存统计值的数据class。