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

如何在Spring Boot中访问JMS统计信息?,spring,spring-boot,activemq,spring-jms,Spring,Spring Boot,Activemq,Spring Jms,我知道JMS没有统计规范,所以没有标准的方式来读取诸如“处理的消息数”、“队列中的平均时间”等内容 我正在研究两种方法: 直接访问ActiveMQ统计信息 在JMS消息使用者中维护统计信息 关于(1),我没有找到如何使用Spring Boot获取这些统计数据的示例。对于(2),我想知道消费者本身是否需要维护统计数据,或者是否有更好的方法 有人有任何工作示例吗?如果您在Spring integration中使用JMS,它的系统管理功能提供的统计数据将在Spring boot应用程序中注册为千分尺度

我知道JMS没有统计规范,所以没有标准的方式来读取诸如“处理的消息数”、“队列中的平均时间”等内容

我正在研究两种方法:

  • 直接访问ActiveMQ统计信息
  • 在JMS消息使用者中维护统计信息
  • 关于(1),我没有找到如何使用Spring Boot获取这些统计数据的示例。对于(2),我想知道消费者本身是否需要维护统计数据,或者是否有更好的方法


    有人有任何工作示例吗?

    如果您在Spring integration中使用JMS,它的系统管理功能提供的统计数据将在Spring boot应用程序中注册为千分尺度量


    如果您将JMS与Spring集成在一起,那么它的系统管理功能将提供统计信息,这些统计信息将在Spring boot应用程序中注册为千分尺度量


    作为记录,我最终实现了一个特定于代理的解决方案(这里是ActiveMQ)

    import org.springframework.stereotype.Component
    导入javax.jms*
    typealias QueueName=字符串
    @组成部分
    类BrokerFacade(专用val连接工厂:连接工厂){
    私有val statisticsBrokers=mutableMapOf()
    @抛出(JMSException::类)
    有趣的getStatistics(queueName:queueName):QueueStatistics{
    val brokerAccess=statisticsBrokers.getOrPut(queueName,{StatisticsBrokerAccess(queueName)})
    return brokerAccess.getCurrentStatistics()?.let{
    排队统计(
    队列名称,
    it.getLong(“大小”),
    it.getLong(“出列计数”),
    it.getDouble(“mineQueueTime”),
    it.getDouble(“maxEnqueueTime”),
    it.getDouble(“averageEnqueueTime”),
    it.getLong(“memoryUsage”),
    it.getLong(“memoryPercentUsage”)
    )
    }
    }
    内部类StatisticsBrokerAccess(queueName:queueName){
    私有val统计MessageConsumer:MessageConsumer;
    私有val统计MessageProducer:MessageProducer;
    专用val统计报文:报文;
    初始化{
    val connection=connectionFactory.createConnection()
    connection.start()
    val session=connection.createSession(假,session.AUTO_确认)
    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)
    }
    有趣的getCurrentStatistics():MapMessage{
    statisticsMessageProducer.send(statisticsMessage)
    返回statisticsMessageConsumer.receive(2000)作为MapMessage?
    }
    }
    }
    

    QueueStatistics是一个保存统计值的数据类。

    作为记录,我最终实现了一个特定于代理的解决方案(这里是ActiveMQ)

    import org.springframework.stereotype.Component
    导入javax.jms*
    typealias QueueName=字符串
    @组成部分
    类BrokerFacade(专用val连接工厂:连接工厂){
    私有val statisticsBrokers=mutableMapOf()
    @抛出(JMSException::类)
    有趣的getStatistics(queueName:queueName):QueueStatistics{
    val brokerAccess=statisticsBrokers.getOrPut(queueName,{StatisticsBrokerAccess(queueName)})
    return brokerAccess.getCurrentStatistics()?.let{
    排队统计(
    队列名称,
    it.getLong(“大小”),
    it.getLong(“出列计数”),
    it.getDouble(“mineQueueTime”),
    it.getDouble(“maxEnqueueTime”),
    it.getDouble(“averageEnqueueTime”),
    it.getLong(“memoryUsage”),
    it.getLong(“memoryPercentUsage”)
    )
    }
    }
    内部类StatisticsBrokerAccess(queueName:queueName){
    私有val统计MessageConsumer:MessageConsumer;
    私有val统计MessageProducer:MessageProducer;
    专用val统计报文:报文;
    初始化{
    val connection=connectionFactory.createConnection()
    connection.start()
    val session=connection.createSession(假,session.AUTO_确认)
    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)
    }
    有趣的getCurrentStatistics():MapMessage{
    statisticsMessageProducer.send(statisticsMessage)
    返回statisticsMessageConsumer.receive(2000)作为MapMessage?
    }
    }
    }
    

    QueueStatistics是一个保存统计值的数据类。

    使用Spring Boot从ActiveMQ获取统计数据与仅使用普通Java获取统计数据有什么区别吗?在使用者中维护统计数据或从Spring集成组件获取类似统计数据只会从使用者的角度为您提供信息。经纪人的统计数据将提供更多(和不同)的信息。您实际需要什么统计数据?使用Spring Boot从ActiveMQ获取统计数据与仅使用普通Java获取统计数据之间是否存在差异?在使用者中维护统计数据或从Spring集成组件获取类似统计数据只会从使用者的角度为您提供信息。统计
    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?
            }
        }
    }