Spring monitor

本文介绍了一个基于Spring AOP的监控系统实现,通过定义`@ExecuteMonitor`注解并结合自定义切面类`ExecuteInterceptor`,可以在方法执行前后记录日志,并在超过预设时间阈值时进行特殊处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


@Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ExecuteMonitor
{
public abstract long timeout();
}


import org.springframework.aop.Pointcut;
import org.springframework.aop.support.ComposablePointcut;
import org.springframework.aop.support.annotation.AnnotationMatchingPointcut;
import org.springframework.beans.factory.FactoryBean;

public class ExecutePointcut
implements FactoryBean<Pointcut>
{
public Pointcut getObject()
throws Exception
{
ComposablePointcut cp = new ComposablePointcut(
AnnotationMatchingPointcut.forClassAnnotation(ExecuteMonitor.class));

cp.union(
AnnotationMatchingPointcut.forMethodAnnotation(ExecuteMonitor.class));
return cp;
}

public Class<?> getObjectType() {
return Pointcut.class;
}

public boolean isSingleton() {
return true;
}
}

import java.lang.reflect.Method;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.commons.lang.SystemUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.aop.support.DelegatingIntroductionInterceptor;

public class ExecuteInterceptor extends DelegatingIntroductionInterceptor
{
private static Logger logger = LoggerFactory.getLogger(ExecuteInterceptor.class);

private long getTimeout(Method m)
{
ExecuteMonitor em = (ExecuteMonitor)m.getAnnotation(ExecuteMonitor.class);
if (em == null)
{
em = (ExecuteMonitor)m.getDeclaringClass().getAnnotation(ExecuteMonitor.class);
}

if (em == null) {
return -1L;
}
return em.timeout();
}

private void printArguments(StringBuilder sb, Object[] args)
{
int i = 0;
sb.append("{");
for (Object arg : args) {
sb.append(i++).append("->");
sb.append(String.valueOf(arg));
sb.append(SystemUtils.LINE_SEPARATOR);
}
sb.append("}");
}

public Object invoke(MethodInvocation mi)
throws Throwable
{
logger.debug("invoke..." + mi.toString());

long timeout = getTimeout(mi.getMethod());
long l = 0L;

if (timeout > 0L)
l = System.currentTimeMillis();
try
{
long timeused;
StringBuilder sb;
return super.invoke(mi);
}
finally {
if (l > 0L) {
long timeused = System.currentTimeMillis() - l;

if (timeused >= timeout) {
StringBuilder sb = new StringBuilder("");
sb.append(mi.getMethod().toString());
sb.append(" executed in ").append(timeused)
.append("ms (> ").append(timeout).append(
"ms), Arguments :");
printArguments(sb, mi.getArguments());
logger.info(sb.toString());
sb = null;
}
}
}
}
}




<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator">
<property name="proxyTargetClass" value="true"></property>
<property name="advisorBeanNamePrefix" value="autoproxy"></property>
</bean>
<bean id="executeInterceptor" class="com.xxxxx.core.monitor.ExecuteInterceptor" />

<bean id="executePointcut" class="com.xxxxx.core.monitor.ExecutePointcut" />

<bean id="autoproxy.execute" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="pointcut" ref="executePointcut" />
<property name="advice" ref="executeInterceptor" />
</bean>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值