Chinaunix首页 | 论坛 | 博客
  • 博客访问: 83601
  • 博文数量: 5
  • 博客积分: 140
  • 博客等级: 民兵
  • 技术积分: 60
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-01 10:08
文章分类
文章存档

2015年(1)

2013年(1)

2012年(3)

我的朋友

分类: Java

2012-06-13 22:28:45

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

  1. @Aspect
  2. public class MonitorInterceptor {
  3.     @Around("execution(* *..*.*(..)) && @annotation(monitor)")
  4.     public void doMonitor (ProceedingJoinPoint joinPoint, Monitor monitor) {
  5.         //业务代码
  6.     }
  7. }
execution(* *..*.*(..))表示执行任何方法
@annotation(monitor)表示方法上带有Monitor注解的
当满足这两个条件时即时满足条件的切入点

使用这种方式,在doMonitor方法中必须要有一个Monitor类型的入参,否则会抛出异常(试试就知道了)
如果不想使用这种方式,可以考虑使用

  1. @Around("execution(@Monitor * *..*.*(..))")

接下来只要将目标webservice做为一个bean加载到spring容器中,并且配置使用aspectJ即可。如下:

"
    xmlns:xsi="" xmlns:context=""
    xmlns:aop=""
    xsi:schemaLocation=" /spring-context-2.5.xsd
                         /spring-beans-2.5.xsd
                         /spring-aop-2.5.xsd">
    

测试类:

  1. public class Test {
  2.     @Monitor
  3.     public void test {
  4.         //业务代码
  5.     }
  6. }
只要将Test类配置入spring就能发现,aop生效了
阅读(3922) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~