`
iamzhongyong
  • 浏览: 797174 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

    博客分类:
  • java
 
阅读更多

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

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

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

 

实现思路:

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

2、用Aspect来处理注解;

3、系统直接使用;

 

1、注解代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package 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的代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package 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
 */
@Aspect
public 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 

 

0
8
分享到:
评论
1 楼 mazzystar 2013-08-16  
感觉 result.get();时会阻塞当前线程吧? 确定这种方式比直接调用耗时短吗 ?

相关推荐

    java云笔记 项目+sql文件+超清晰注释+项目经验

    jQuery:简化js和Ajax编程,实现前端处理 SpringMVC:实现控制层,用于接收请求分发 给业务模型处理,并实现请求响应 SpringIOC:实现管理控制层,业务层,数据访问层 组件,采用注入方式建立关系(解耦) SpringAOP:实现事务...

    Java+SSM+订餐系统

    MyBatis:作为持久层框架,MyBatis提供了对数据库的访问和操作,通过XML或注解映射SQL语句与Java方法,从而实现数据的持久化和查询。 用到的技术: HTML/CSS/JavaScript:前端技术用于构建用户界面和实现交互效果。...

    SpringBoot2 基础教程,日志配置,数据源配置,事务管理等

    定时任务和异步任务的使用方式。多个拦截器配置和使用场景。引入JdbcTemplate,和多数据源配置。集成Druid连接池,配置监控界面。集成Redis数据库,实现缓存管理。集成JPA持久层框架,简化数据库操作。整合Mybatis框架,...

    Spring中文帮助文档

    3.12.1. @Component和更多典型化注解 3.12.2. 自动检测组件 3.12.3. 使用过滤器自定义扫描 3.12.4. 自动检测组件的命名 3.12.5. 为自动检测的组件提供一个作用域 3.12.6. 用注解提供限定符元数据 3.13. 注册一...

    Spring API

    3.12.1. @Component和更多典型化注解 3.12.2. 自动检测组件 3.12.3. 使用过滤器自定义扫描 3.12.4. 自动检测组件的命名 3.12.5. 为自动检测的组件提供一个作用域 3.12.6. 用注解提供限定符元数据 3.13. 注册一...

    Spring.3.x企业应用开发实战(完整版).part2

    第7章 基于@AspectJ和Schema的AOP 7.1 Spring对AOP的支持 7.2 JDK 5.0注解知识快速进阶 7.2.1 了解注解 7.2.2 一个简单的注解类 7.2.3 使用注解 7.2.4 访问注解 7.3 着手使用@AspectJ 7.3.1 使用前的准备 7.3.2 一个...

    Spring3.x企业应用开发实战(完整版) part1

    第7章 基于@AspectJ和Schema的AOP 7.1 Spring对AOP的支持 7.2 JDK 5.0注解知识快速进阶 7.2.1 了解注解 7.2.2 一个简单的注解类 7.2.3 使用注解 7.2.4 访问注解 7.3 着手使用@AspectJ 7.3.1 使用前的准备 7.3.2 一个...

    Spring 2.0 开发参考手册

    11.2. 利用JDBC核心类实现JDBC的基本操作和错误处理 11.2.1. JdbcTemplate类 11.2.2. NamedParameterJdbcTemplate类 11.2.3. SimpleJdbcTemplate类 11.2.4. DataSource接口 11.2.5. SQLExceptionTranslator接口...

    Spring-Reference_zh_CN(Spring中文参考手册)

    11.2. 利用JDBC核心类实现JDBC的基本操作和错误处理 11.2.1. JdbcTemplate类 11.2.2. NamedParameterJdbcTemplate类 11.2.3. SimpleJdbcTemplate类 11.2.4. DataSource接口 11.2.5. SQLExceptionTranslator接口 ...

    spring chm文档

    11.2. 利用JDBC核心类实现JDBC的基本操作和错误处理 11.2.1. JdbcTemplate类 11.2.2. NamedParameterJdbcTemplate类 11.2.3. SimpleJdbcTemplate类 11.2.4. DataSource接口 11.2.5. SQLExceptionTranslator接口...

    springboot学习思维笔记.xmind

    Bean的初始化和销毁 Java配置方式 注解方式 Profile @Profile 通过设定jvm的spring.profiles.active参数 web项目设置在Servlet的context parameter中 事件Application Event 自定义事件,...

    代码生成器-可自定义模版-guns

    1. 基于SpringBoot,简化了大量项目配置和maven依赖,让您更专注于业务开发,独特的分包方式,代码多而不乱。 2. 完善的日志记录体系,可记录登录日志,业务操作日志(可记录操作前和操作后的数据),异常日志到数据库,...

    asp.net知识库

    ADO.NET 2.0 异步处理 在ASP.NET中使用WINDOWS验证方式连接SQL SERVER数据库 改进ADO.Net数据库访问方式 ASP.NET 2.0 绑定高级技巧 简单实用的DataSet更新数据库的类+总结 [ADO.NET]由数据库触发器引发的问题 为ASP...

    springboot学习

    chapter4-2-4:使用AOP统一处理Web请求日志 chapter4-2-5:使用log4j记录日志到MongoDB chapter4-2-6:Spring Boot 1.5.x新特性:动态修改日志级别] 安全管理 chapter4-3-1:使用Spring Security chapter4-3-2:...

    Guns后台管理系统-其他

    1、基于SpringBoot,简化了大量项目配置和maven依赖,让您更专注于业务开发,独特的分包方式,代码多而不乱。 2、完善的日志记录体系,可记录登录日志,业务操作日志(可记录操作前和操作后的数据),异常日志到数据库...

    spring boot 全面的样例代码

    - chapter4-2-4:[使用AOP统一处理Web请求日志](http://blog.didispace.com/springbootaoplog/) - chapter4-2-5:[使用log4j记录日志到MongoDB](http://blog.didispace.com/springbootlog4jmongodb/) - chapter4-2-6...

    JAVA核心知识点整理(有效)

    25 3:ServicorTo 和 ServicorFrom 互换................................................................................................................25 2.3.3.1. 2.4.1. 如何确定垃圾 ......................

Global site tag (gtag.js) - Google Analytics