`

SPRING INTERCEPTOR 监控 JMS 发送接受性能

阅读更多
   将spring aspectj 和 jms 整合了一下,用spring interceptor 监控jms 发送接受方法。通过方法注解 标记执行总次数,拦截器在指定的方法执行到目标执行次数后,将性能跟踪信息记录日志。
    
aop-conf.xml
  <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:oxm="http://www.springframework.org/schema/oxm" xmlns:cache="http://www.springframework.org/schema/cache"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
				http://www.springframework.org/schema/beans/spring-beans.xsd
				http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
     			http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
				http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
				http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-3.2.xsd
				http://www.springframework.org/schema/cache
				http://www.springframework.org/schema/cache/spring-cache.xsd">
				
	<bean id="jmsMessageHanderMonitor"
		class="com.cn.ld.modules.jms.monitor.JmsMessageHanderMonitor">
		<property name="useDynamicLogger" value="false" />
		<constructor-arg index="0">
			<value>1</value>
		</constructor-arg>
	</bean>

	<aop:config>
		<aop:pointcut id="allServiceMethods"
			expression="execution(* com.cn.ld.modules.jms.worker..*(..))" />
		<aop:advisor pointcut-ref="allServiceMethods" advice-ref="jmsMessageHanderMonitor"
			order="2" />
	</aop:config>
</beans>
 



log4j.properties 开启监控interceptor race 日志功能
log4j.logger.com.cn.ld.modules.jms.monitor.JmsMessageHanderMonitor=TRACE



applicationContext.xml
<!-- aop source -->
	<import resource="aop-config.xml" />
 


MethodMonitorCount 注解接口
package com.cn.ld.modules.annotation;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
import java.lang.annotation.RetentionPolicy;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodMonitorCount {
    int value() default 1;
}



JmsMessageHanderMonitor  性能监控的aspect

package com.cn.ld.modules.jms.monitor;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.text.MessageFormat;
import java.util.concurrent.ConcurrentHashMap;

import org.aopalliance.intercept.MethodInvocation;
import org.apache.commons.logging.Log;
import org.springframework.aop.framework.ReflectiveMethodInvocation;
import org.springframework.aop.interceptor.AbstractMonitoringInterceptor;
import org.springframework.util.StopWatch;

import com.cn.ld.modules.annotation.MethodMonitorCount;

public class JmsMessageHanderMonitor extends AbstractMonitoringInterceptor {

	private static final long serialVersionUID = 1L;
	private ConcurrentHashMap<java.lang.reflect.Method, PerformanceSampl> methodPerfSampl = new ConcurrentHashMap<java.lang.reflect.Method, PerformanceSampl>();

	private int monitorCount = 1;

	public JmsMessageHanderMonitor(int monitorCount) {
		this.monitorCount = monitorCount;
	}

	public JmsMessageHanderMonitor(boolean useDynamicLogger) {
		setUseDynamicLogger(useDynamicLogger);
	}

	@Override
	protected Object invokeUnderTrace(MethodInvocation methodinvocation,
			Log logger) throws Throwable {
		ReflectiveMethodInvocation reflectMethod = (ReflectiveMethodInvocation) methodinvocation;
		Method m = reflectMethod.getMethod();
		Annotation[] annotations = m.getAnnotations();

		if (null == annotations || annotations.length == 0) {
			return methodinvocation.proceed();
		}

		PerformanceSampl sampl = null;
		// 将追踪的目标方法作为key缓存,如果已经存在,直接获取该方法的跟踪内容对象PerformanceSampl
		if (methodPerfSampl.containsKey(m)) {
			sampl = methodPerfSampl.get(m);
		} else {
			sampl = new PerformanceSampl();
			methodPerfSampl.put(m, sampl);
		}
		String target = m.toString();
		// 首次目标对象调用,初始化跟踪信息
		if (sampl.getReceNo() == 0) {

			StopWatch sw = new StopWatch(target);
			sampl.setStopWatch(sw);
			MethodMonitorCount mmc = (MethodMonitorCount) annotations[0];
			sampl.setMaxReceNo(mmc.value());
			sw.start(m.getName());
		}

		// 目标方法执行
		Object obj = methodinvocation.proceed();

		// 每次调用累加调用次数
		sampl.setReceNo(sampl.getReceNo() + 1);

		// 目标方法调用次数等于目标最大调用次数时,统计目标方法执行性能指标
		if (sampl.getReceNo() == sampl.getMaxReceNo()) {
			sampl.getStopWatch().stop();

			// 记录日志
			showTraceInfo(logger, sampl, target);

			// 追踪结束,将该方法的cache信息清空
			methodPerfSampl.remove(m);
		}

		return obj;
	}

	private void showTraceInfo(Log logger, PerformanceSampl sampl, String target) {
		String formatStr = "monitor target method:{0} ; expect execute times:{1};actual execute times:{2};execution Speed:{3}/s";
		MessageFormat paramMf = new MessageFormat(formatStr);
		long costTime = (sampl.getStopWatch().getTotalTimeMillis() / 1000);
		int executeTimes = sampl.getReceNo();
		costTime = costTime == 0 ? costTime : (executeTimes / costTime);
		logger.trace(paramMf.format(new Object[] { target,
				sampl.getMaxReceNo(), executeTimes, costTime }));
	}
         /*
          *性能信息
          */
	private static class PerformanceSampl {
		private StopWatch stopWatch;
		private int maxReceNo;
		// 接受数量
		private int receNo;

		public void setReceNo(int receNo) {
			this.receNo = receNo;
		}

		public StopWatch getStopWatch() {
			return stopWatch;
		}

		public void setStopWatch(StopWatch stopWatch) {
			this.stopWatch = stopWatch;
		}

		public int getMaxReceNo() {
			return maxReceNo;
		}

		public void setMaxReceNo(int maxReceNo) {
			this.maxReceNo = maxReceNo;
		}

		public int getReceNo() {
			return receNo;
		}

	}

	public int getMonitorCount() {
		return monitorCount;
	}

	public void setMonitorCount(int monitorCount) {
		this.monitorCount = monitorCount;
	}
}




console 信息如下
[2013-07-18 17:12:00,645][TRACE]<main>(JmsMessageHanderMonitor.java:87) - monitor target method:public void com.cn.ld.modules.jms.worker.JmsSender.sendSingle(java.lang.String,javax.jms.Destination) ; expect execute times:10,000;actual execute times:10,000;execution Speed:10,000/s
[2013-07-18 17:12:00,784][TRACE]<jmsContainer-1>(JmsMessageHanderMonitor.java:87) - monitor target method:public abstract void com.cn.ld.modules.jms.handler.MessageHandler.handleMessage(java.lang.String) ; expect execute times:10,000;actual execute times:10,000;execution Speed:10,000/s




2
2
分享到:
评论

相关推荐

    Spring Boot Aspect 切面 AOP 拦截器 Interceptor 监控control请求耗时

    首先,我们来看看标题提到的"Interceptor",这是Spring MVC中的一个关键组件。拦截器(HandlerInterceptor)用于在请求被实际处理之前和之后执行一些额外的任务,如记录请求日志、性能监控等。在Spring Boot中,我们...

    Spring MVC Interceptor 实现性能监控的功能代码

    对于更深入的性能分析,如内存使用、数据库查询性能等,可能需要借助专门的性能监控工具,如Java Profiler(如VisualVM、JProfiler)、APM工具(如Dynatrace、New Relic)或Spring Boot Actuator等。

    spring boot加入拦截器Interceptor过程解析

    "Spring Boot 中的拦截器Interceptor 配置和使用详解" Spring Boot 框架提供了拦截器Interceptor机制,用于在请求处理前、后执行某些操作。拦截器Interceptor可以用来实现身份验证、日志记录、缓存、权限控制等...

    Postman Interceptor:通过Postman发送请求

    4. **系统代理设置**:Interceptor可以配置为系统代理,这样所有的网络流量都可以通过Postman进行监控和拦截,提供了一个全面的网络请求视图。 5. **版本匹配**:为了确保Interceptor正常工作,必须确保其与Chrome...

    spring boot jwt Interceptor 例子

    spring boot jwt 和 interceptor的例子。 其中jwt的例子网上有很多,但是都是要数据库支持,这个只是用假数据模拟,不需要数据库支持。另外还有一个拦截器的简单例子。已经在sts 4 测试通过。

    springAOP与Interceptor

    SpringAOP与SpringMVC拦截器两种方式实现权限管控,前台xml读取配置根据登录用户判断button是否enable

    springmvc-interceptor

    在Spring MVC框架中,拦截器(Interceptor)是一个至关重要的组件,它允许开发者在请求处理之前、之后或在处理过程中执行自定义逻辑。拦截器可以用于实现日志记录、权限检查、性能统计、事务管理等多种功能,极大地...

    postman interceptor

    4. **网络监控**:Interceptor可以作为一个网络监控工具,记录所有通过浏览器的网络活动,这对于开发者跟踪和理解应用的网络行为大有裨益。 二、Interceptor的使用步骤 1. **安装插件**:首先需要在Chrome浏览器上...

    Interceptor框架的实现

    在诸如日志记录、性能监控、事务管理等场景下,拦截器可以提供灵活且可复用的解决方案。在Java中,我们可以使用两种主要的方式来实现拦截器:JDK动态代理和CGLIB。 1. JDK动态代理:这是Java内置的一种代理机制,...

    interceptor

    在IT行业中,拦截器(Interceptor)是一个非常关键的概念,尤其在框架如Spring MVC或Struts2中被广泛应用。拦截器是一种设计模式,它允许我们插入一个逻辑层在调用目标对象之前和之后,用于实现一些共同的行为或者...

    Java 模拟Interceptor 过程

    Interceptor广泛应用于框架如Spring、MyBatis等,用于实现事务管理、日志记录、权限控制等功能。在本篇文章中,我们将探讨如何在没有现成框架支持的情况下,模拟实现一个简单的Interceptor过程。 首先,我们需要...

    spring-method-interceptor:Spring Handler Interceptor反思Web方法

    这在很多场景下都非常有用,比如权限验证、日志记录、性能监控等,大大增强了我们的应用程序功能和灵活性。通过深入理解和实践这个示例,你可以更好地掌握Spring MVC的高级特性,并将其应用到实际项目中。

    Postman Interceptor for Chrome 0.2.26

    通过持续的版本更新和优化,如0.2.26_0版本,Postman Interceptor致力于提供更好的性能和稳定性,以满足不断增长的开发者需求。如果你在使用Chrome进行Web开发或API测试,这款插件无疑是必备的工具之一。

    Postman-Interceptor-V1.1.2.zip

    在Postman的生态系统中,Interceptor是一个重要的组件,它扩展了Postman的功能,使其能够实时捕获和修改浏览器发送的网络请求。这个"Postman-Interceptor-V1.1.2.zip"文件就是Interceptor的安装包,版本为1.1.2,...

    Postman-Interceptor_0.2.20压缩文件

    通常,随着Postman主程序的更新,Interceptor也会进行相应的升级,以确保兼容性和性能。然而,对于某些用户或特定项目,旧版本的Interceptor可能更稳定或者更适合他们的需求,因此保留并使用Interceptor_0.2.20是有...

    谷歌浏览器插件—— Ajax Interceptor

    Ajax Interceptor 是一款专为谷歌浏览器(Chrome)设计的插件,它允许开发者在Ajax请求发送后和响应返回前进行干预,从而实现对AJAX请求数据的修改。这款插件对于前端开发、调试以及测试来说是一个强大的工具,特别...

    spring-web-5.2.4_spring-web_SSM框架_

    4. **Filter和Interceptor**:Spring Web支持自定义过滤器(Filter)和拦截器(Interceptor),可以实现全局的功能,如登录验证、日志记录、性能监控等。 5. **RESTful支持**:Spring Web提供对RESTful服务的良好...

    Interceptor.zip

    MyBatis-Spring的拦截器主要用于对SqlSession的操作进行增强,比如事务管理、性能监控等。它们通常通过实现Interceptor接口并注册到SqlSessionFactoryBean中来实现。 在Interceptor.zip中,可能包含了一个或多个...

    各种Interceptor的不同效果

    在很多框架中,如Spring MVC、Struts2等,拦截器被广泛用于处理请求前后的逻辑,例如日志记录、权限验证、性能监控等。在这个主题“各种Interceptor的不同效果”中,我们将深入探讨四种不同类型的拦截器及其在实际...

    postman+postman interceptor(亲测可用)

    Interceptor是Postman的一个扩展插件,它为Postman增加了更多功能,比如实时同步浏览器的网络请求、捕获和发送SSL证书等。 Postman Interceptor的主要功能包括: 1. **实时同步**:当你在浏览器中浏览网页时,...

Global site tag (gtag.js) - Google Analytics