当前位置: 首页 > 知识库问答 >
问题:

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

南宫正阳
2023-03-14

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

我在考虑两种方法:

  1. 直接访问ActiveMQ统计信息
  2. 维护JMS消息使用者中的统计信息

对于(1),我没有找到如何使用Spring Boot获取thos统计数据的示例。对于(2),我想知道消费者本身是否需要维护统计数据,或者是否有更好的方法。

有没有人有任何有效的例子?

共有2个答案

齐迪
2023-03-14

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

https://docs.spring.io/spring-integration/docs/5.1.7.RELEASE/reference/html/#system-管理章节

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

曾奇略
2023-03-14

作为记录,我最终实现了一个特定于代理的解决方案(这里是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?
        }
    }
}

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

 类似资料:
  • 问题内容: 我正在使用Spring 3.1.1.RELEASE,JUnit 4.8.1和Hibernate 4.1.5.Final。我正在尝试测试二级缓存是否配置正确,但是不确定如何做。我正在使用像这样在Spring中配置的JPA实体管理器… 我已经像这样配置了二级缓存… 给定javax.persistence.EntityManager,如何访问org.hibernate.stat.Statis

  • 访问统计 功能介绍:线状图统计访问店铺记录,直观查看店铺经营情况。 步骤 【用户管理】→【访问统计】。

  • 我找到以下链接来读取JMS队列中的消息及其工作。 https://blogs.oracle.com/soaproactive/entry/jms_step_3_using_the 现在,我想以编程方式读取JMS队列统计信息,如消息数、挂起消息数和消息输入/输出时间等。weblogic或weblogic中是否有可能为此提供任何API? 请帮忙。

  • 我正在开发一个文件存储应用程序,需要读取 sd 存储和内部手机存储的内容。我已经签出了 react-native-fs 和 react-native-fetch-blob,但这两个应用程序都只允许我访问我的应用程序的存储。如何读取手机上的其他文件?

  • 我想做一个关于资源利用的统计!我知道有了'ResourcePool.Utility()'我就能做到!但问题是,资源工作,按时间表,为8小时..但统计是结束了一整天!有没有办法只在他们的工作时间内调查利用情况? 谢谢u Miriana

  • 从MySQL 8开始,标志默认启用。 因此,如果您尝试使用MySQL Workbase 8.0.12转储一些表,您会收到以下错误消息: 14:50:22 Dumping db (table_name) Running: mysqldump.exe --defaults-file="c:\users\username\appdata\local\temp\tmpvu0mxn.cnf" --user=