大型Java web应用
往往有很大的系统访问量
为了保护服务器免于出现过载的情况
一般都需要对流量进行控制
对于web页面的访问一般通过配置服务器或者apache可以起到保护的作用
但是对于webservice
在负载均衡之外还需要一些手段来防止系统过载
这些手段需要通过服务器端编码实现
一般地实现这类监控一般选择是用aop的方式在不影响功能代码的情况下进行这里spring aop是一个通常的选择无论通过xml配置的方式还是使用AspectJspring aop都必须由开发者通过代码形式确定织入点对于小型webservice应用来
说如果将一系列webservice接口放在同一的包中那么配置还相对简单但对于一个相对较大的webservice应用他的配置将变得非常繁琐并且对于个性化的需求并不好处理
AspectJ定义织入点是可以通过使用比如execution within target等函数声明切入点这些函数就不一一解释了这里要说明的是使用execution与annotation配合实现自定义织入点的方法方便灵活地配置需要监控的方法
先把代码贴上来
注解定义如下
@Target({ElementTypeMETHOD})
@Retention(RetentionPolicyRUNTIME)
public @interface Monitor {
String value() default ;
}
这样就可以在目标方法上使用注解了
切面
@Aspect
public class MonitorInterceptor {
@Around(execution(* ***()) && @annotation(monitor))
public void doMonitor (ProceedingJoinPoint joinPoint Monitor monitor) {
//业务代码
}
}
execution(* ***())表示执行任何方法
@annotation(monitor)表示方法上带有Monitor注解的
当满足这两个条件时即时满足条件的切入点
使用这种方式在doMonitor方法中必须要有一个Monitor类型的入参否则会抛出异常(试试就知道了)
如果不想使用这种方式可以考虑使用
@Around(execution(@Monitor * ***()))
接下来只要将目标webservice做为一个bean加载到spring容器中并且配置使用aspectJ即可如下
<?xml version=
encoding=UTF?><beans xmlns=/schema/beans
xmlns:xsi=//XMLSchemainstance
xmlns:context=/schema/context
xmlns:aop=/schema/aop
xsi:schemaLocation=/schema/context /schema/context/springcontextxsd
/schema/beans /schema/beans/springbeansxsd
/schema/aop /schema/aop/springaopxsd>
<aop:aspectjautoproxy /></beans>
测试类
public class Test {
@Monitor
public void test {
//业务代码
}
}
只要将Test类配置入spring就能发现aop生效了