对于异步任务,我们常见的处理方式一般有以下几种:
1.开启一个新线程,执行指定任务(建议从线程池获取);
2.如果用springboot,框架本身自带了异步任务封装,使用起来也比较方便;
3.其他语言提供接口,如nodejs,在异步这方面还是很突出很好用的.
STEP1:启动类开启注解
@EnableAsync
STEP2:工具类
这边基于Java反射,可做到动态处理,LoggerUtil其实就是封装的日志工具类。
package com.dzh.config;
import com.dzh.extra.utils.LoggerUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;
@Component
public class AsyncTask {
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
/**
* 异步任务
* @param obj 一定要传一个已初始化对象(因为方法invoke的时候用此对象调用)
* @param methodName 方法名
* @param args 方法参数
*/
@Async()
public void taskCustomized(Object obj, String methodName, Object... args){
Class<?> clazz = obj.getClass();
try {
Class[] classes = null;
if (args != null && args.length != 0){
List<Object> parameters = Arrays.asList(args);
classes = new Class[parameters.size()];
for (int i = 0; i < parameters.size(); i++) {
classes[i] = parameters.get(i).getClass();
}
}
Method method = clazz.getMethod(methodName, classes);
method.invoke(obj, args);
} catch (Exception e) {
e.printStackTrace();
LoggerUtil.info(this, "ASYNC_REFLECT:出错了...");
}
}
}
STEP3:调用
STEP4:补充
1.异步线程池可以自定义:
2.调用本类新写的方法时,传入如下: