Java-Bean管理,实现同步/异步管理
本文介绍利用Spring的Bean管理,结合自己封装的ThreadPoolExecutor线程池,利用注解的方式,实现方法的异步管理;
常用异步方法:不影响系统正常执行、可后台操作、对数据安全性要求差、等等诸如此类的业务逻辑。如日志的操作,短信发送、用户信息的更新等。异步在一定程度上能够提升系统的响应度,但不合理的设计或是代码的不合理运用会导致一场灾难~
以下代码仅供学习参考,实用性、合理性及安全性仍需检测,也欢迎茫茫人海之中的你能够给一板砖~
1 环境搭建
1.1 引入Spring依赖
<properties>
<spring.version>4.3.2.RELEASE</spring.version>
</properties>
<dependencies>
<!-- spring support -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
2.核心实现
2.1 异步处理器:InvocationHandler
package com.nieli.proxy;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.nieli.base.config.Configuration;
/**
*@描述:
*@版权: Copyright (c) 2018
*@作者: nieli
*@版本: 1.0
*@创建日期: 2018年01月29日
*@创建时间: 10:17
*/
public class InvocationHandler<T> implements java.lang.reflect.InvocationHandler
{
private static final Logger logger = LoggerFactory
.getLogger(InvocationHandler.class);
//线程池线程名称前缀
public static final String POOL_THREAD_NAME_PREFIX = Configuration.getString(
"proxy.poolThreadNamePrefix",
"Async-Invoke-Thread-");
//异步执行线程池大小 默认:CPU个数 * 2
private static final int ASYNC_THREAD_POOL_CORE = Configuration
.getInt("proxy.asyncThreadPoolCore",
Runtime.getRuntime()
.availableProcessors() * 2);
//异步执行线程池队列大小 默认:10000
private static final int ASYNC_THREAD_POOL_QUEUE_CORE = Configuration
.getInt("proxy.asyncThreadPoolQ