首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

基于AOP跟注解简化异步化处理

2013-08-16 
基于AOP和注解简化异步化处理Spring3中提供了一个功能,就是在一个方法上添加注解,调用这个方法的时候自动

基于AOP和注解简化异步化处理

Spring3中提供了一个功能,就是在一个方法上添加注解,调用这个方法的时候自动在线程池中异步话执行。

由于老系统暂时无法升级到spring的3版本,所以翻了一下Spring3中的实现代码。

Spring3中总体就是Spring的AOP和Schema,这两个方式,至于Spring3中注解异步化的使用,这里就不介绍了。

?

实现思路:

1、搞一个注解来做标志位(就是添加了这个注解,方法自动异步化);

2、用Aspect来处理注解;

3、系统直接使用;

?

1、注解代码

1234567891011121314package?org.iamzhongyong.framework;import?java.lang.annotation.ElementType;import?java.lang.annotation.Retention;import?java.lang.annotation.RetentionPolicy;import?java.lang.annotation.Target;/**?* 自定义的注解,添加了这个注解之后,方法执行的时候会异步来执行?* @author bixiao.zy?*/@Target({ElementType.METHOD, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)public?@interface?OrgAsync {????String value()?default?"";}

?

2、AOP的代码实现

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253package?org.iamzhongyong.framework;import?java.util.concurrent.ArrayBlockingQueue;import?java.util.concurrent.Callable;import?java.util.concurrent.ExecutorService;import?java.util.concurrent.Future;import?java.util.concurrent.ThreadPoolExecutor;import?java.util.concurrent.TimeUnit;import?org.aspectj.lang.ProceedingJoinPoint;import?org.aspectj.lang.annotation.Around;import?org.aspectj.lang.annotation.Aspect;/**?* 异步话执行含有@OrgAsync注解的方法?* @author bixiao.zy?*/@Aspectpublic?class?OrgAsyncAspect {????/**?????* 自定义的线程池?????*/????private?static?ExecutorService executor =?new?ThreadPoolExecutor(????????????????10,????????????????15,????????????????2000,????????????????TimeUnit.SECONDS,????????????????new?ArrayBlockingQueue<Runnable>(12),????????????????new?AsyncThreadFactory());????/**?????* 1、处理注解,也就是只有OrgAsync这个注解的方法才会起作用?????* 2、采用Aspect的环绕增强,然后ProceedingJoinPoint来实现代理的调用?????* 3、线程池执行,提交方法?????* @param joinPoint?????* @return?????* @throws Throwable?????*/????@Around("@annotation(org.iamzhongyong.framework.OrgAsync)")????public?Object asyncExecutor(final?ProceedingJoinPoint joinPoint)?throws?Throwable {????????Future<?> result = executor.submit(new?Callable<Object>() {????????????public?Object call()?throws?Exception {????????????????Object result =?null;????????????????try{????????????????????result = joinPoint.proceed();????????????????????if(result?instanceof?Future){????????????????????????return?((Future<?>) result).get();????????????????????}????????????????}catch?(Throwable e) {????????????????????//????????????????}????????????????return?result;????????????}????????});????????return?result.get();????}}

?

3、如何使用

第一步,在Spring的IOC容器中,添加这个标签 <aop:aspectj-autoproxy></aop:aspectj-autoproxy> ??

(这个是启动Aspect的Schema);

第二部,Spring中集成Aspect是采用IOC的思路,所以需要把方法的增强bean添加进来

(<bean id="aysncAspect" class="org.iamzhongyong.framework.OrgAsyncAspect"></bean>);

?

不足之处:

1、暂时线程池无法满足自定义coreSize和maxSize;

?

代码地址:https://github.com/iamzhongyong/async?

?

1 楼 mazzystar 1 小时前   感觉 result.get();时会阻塞当前线程吧? 确定这种方式比直接调用耗时短吗 ? 2 楼 hunan_java 9 分钟前   http://gotomao.com 上线了,在线免费视频,在线API文档,无广告,给技术屌丝带来福音了~~~

热点排行