大型Java web应用,往往有很大的系统访问量。为了保护服务器免于出现过载的情况,一般都需要对流量进行控制。对于web页面的访问一般通过配置服务器或者apache可以起到保护的作用,但是对于webservice,在负载均衡之外还需要一些手段来防止系统过载。这些手段需要通过服务器端编码实现。
一般地,实现这类监控一般选择是用aop的方式,在不影响功能代码的情况下进行。这里spring aop是一个通常的选择。无论通过xml配置的方式,还是使用AspectJ,spring aop都必须由开发者通过代码形式确定织入点。对于小型webservice应用来
说,如果将一系列webservice接口放在同一的包中,那么配置还相对简单。但对于一个相对较大的webservice应用,他的配置将变得非常繁琐,并且对于个性化的需求并不好处理。
AspectJ定义织入点是,可以通过使用比如execution, within, target等函数声明切入点。这些函数就不一一解释了。这里要说明的,是使用execution与annotation配合,实现自定义织入点的方法,方便灵活地配置需要监控的方法。
先把代码贴上来。
注解定义如下
- @Target({ElementType.METHOD})
- @Retention(RetentionPolicy.RUNTIME)
- 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即可。如下:
" xmlns:xsi=" " xmlns:context=" " |
测试类:
- public class Test {
- @Monitor
- public void test {
- //业务代码
- }
- }
只要将Test类配置入spring就能发现,aop生效了
阅读(4136) | 评论(0) | 转发(0) |