如何在 Spring Boot 中访问 JMS 统计信息?
How to access JMS statistics in Spring Boot?
我知道 JMS 没有统计规范,因此没有标准的方式来读取 "count of messages processed"、"average time in queue" 等内容
我正在寻找两种方法:
- 直接访问 ActiveMQ 统计数据
- 在 JMS 消息消费者中维护统计信息
对于 (1),我没有找到如何使用 Spring Boot 获取这些统计信息的示例。对于(2),我想知道消费者是否需要自己维护统计信息,或者是否有更好的方法。
有人有任何工作示例吗?
如果您使用带有 Spring 集成的 JMS,其系统管理功能会提供在 spring 启动应用程序中注册为千分尺指标的统计信息。
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。
我知道 JMS 没有统计规范,因此没有标准的方式来读取 "count of messages processed"、"average time in queue" 等内容
我正在寻找两种方法:
- 直接访问 ActiveMQ 统计数据
- 在 JMS 消息消费者中维护统计信息
对于 (1),我没有找到如何使用 Spring Boot 获取这些统计信息的示例。对于(2),我想知道消费者是否需要自己维护统计信息,或者是否有更好的方法。
有人有任何工作示例吗?
如果您使用带有 Spring 集成的 JMS,其系统管理功能会提供在 spring 启动应用程序中注册为千分尺指标的统计信息。
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。