如何在Spring Boot中访问JMS统计信息?
我知道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应用程序中注册为千分尺度
有人有任何工作示例吗?如果您在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?
}
}
}