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
相关推荐
jQuery:简化js和Ajax编程,实现前端处理 SpringMVC:实现控制层,用于接收请求分发 给业务模型处理,并实现请求响应 SpringIOC:实现管理控制层,业务层,数据访问层 组件,采用注入方式建立关系(解耦) SpringAOP:实现事务...
MyBatis:作为持久层框架,MyBatis提供了对数据库的访问和操作,通过XML或注解映射SQL语句与Java方法,从而实现数据的持久化和查询。 用到的技术: HTML/CSS/JavaScript:前端技术用于构建用户界面和实现交互效果。...
定时任务和异步任务的使用方式。多个拦截器配置和使用场景。引入JdbcTemplate,和多数据源配置。集成Druid连接池,配置监控界面。集成Redis数据库,实现缓存管理。集成JPA持久层框架,简化数据库操作。整合Mybatis框架,...
3.12.1. @Component和更多典型化注解 3.12.2. 自动检测组件 3.12.3. 使用过滤器自定义扫描 3.12.4. 自动检测组件的命名 3.12.5. 为自动检测的组件提供一个作用域 3.12.6. 用注解提供限定符元数据 3.13. 注册一...
3.12.1. @Component和更多典型化注解 3.12.2. 自动检测组件 3.12.3. 使用过滤器自定义扫描 3.12.4. 自动检测组件的命名 3.12.5. 为自动检测的组件提供一个作用域 3.12.6. 用注解提供限定符元数据 3.13. 注册一...
第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 一个...
第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 一个...
11.2. 利用JDBC核心类实现JDBC的基本操作和错误处理 11.2.1. JdbcTemplate类 11.2.2. NamedParameterJdbcTemplate类 11.2.3. SimpleJdbcTemplate类 11.2.4. DataSource接口 11.2.5. SQLExceptionTranslator接口...
11.2. 利用JDBC核心类实现JDBC的基本操作和错误处理 11.2.1. JdbcTemplate类 11.2.2. NamedParameterJdbcTemplate类 11.2.3. SimpleJdbcTemplate类 11.2.4. DataSource接口 11.2.5. SQLExceptionTranslator接口 ...
11.2. 利用JDBC核心类实现JDBC的基本操作和错误处理 11.2.1. JdbcTemplate类 11.2.2. NamedParameterJdbcTemplate类 11.2.3. SimpleJdbcTemplate类 11.2.4. DataSource接口 11.2.5. SQLExceptionTranslator接口...
Bean的初始化和销毁 Java配置方式 注解方式 Profile @Profile 通过设定jvm的spring.profiles.active参数 web项目设置在Servlet的context parameter中 事件Application Event 自定义事件,...
1. 基于SpringBoot,简化了大量项目配置和maven依赖,让您更专注于业务开发,独特的分包方式,代码多而不乱。 2. 完善的日志记录体系,可记录登录日志,业务操作日志(可记录操作前和操作后的数据),异常日志到数据库,...
ADO.NET 2.0 异步处理 在ASP.NET中使用WINDOWS验证方式连接SQL SERVER数据库 改进ADO.Net数据库访问方式 ASP.NET 2.0 绑定高级技巧 简单实用的DataSet更新数据库的类+总结 [ADO.NET]由数据库触发器引发的问题 为ASP...
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:...
1、基于SpringBoot,简化了大量项目配置和maven依赖,让您更专注于业务开发,独特的分包方式,代码多而不乱。 2、完善的日志记录体系,可记录登录日志,业务操作日志(可记录操作前和操作后的数据),异常日志到数据库...
- chapter4-2-4:[使用AOP统一处理Web请求日志](http://blog.didispace.com/springbootaoplog/) - chapter4-2-5:[使用log4j记录日志到MongoDB](http://blog.didispace.com/springbootlog4jmongodb/) - chapter4-2-6...
25 3:ServicorTo 和 ServicorFrom 互换................................................................................................................25 2.3.3.1. 2.4.1. 如何确定垃圾 ......................