簡體   English   中英

如何在Spring Boot中訪問JMS統計信息?

[英]How to access JMS statistics in Spring Boot?

我了解JMS沒有統計數據規范,因此沒有標准的讀取方式,例如“已處理的郵件數”,“隊列中的平均時間”等。

我正在研究兩種方法:

  1. 直接訪問ActiveMQ統計信息
  2. 維護JMS消息使用者中的統計信息

對於(1),我沒有找到如何使用Spring Boot獲取統計信息的示例。 對於(2),我想知道消費者本身是否需要維護統計信息,或者是否有更好的方法。

有人有可行的例子嗎?

作為記錄,我最終實現了特定於代理的解決方案(此處: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是保存統計值的數據類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM