配置类中添加 @EnableAsync开启对异步任务的支持,
并在相应的方法中使用 @Async注解来声明一个异步任务
Environment 可以直接获取配置文件的值
@Configuration
@EnableAsync
public class TaskExecutorConfig {
/***
* 创建异步任务执行线程池
* @return
*/
@Bean("taskExecutor")
public TaskExecutor getAsyncExecutor(Environment env) {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setMaxPoolSize(Integer.valueOf(env.getProperty("spring.asyn.max.size")));
taskExecutor.setCorePoolSize(Integer.valueOf(env.getProperty("spring.asyn.core.size")));
taskExecutor.setQueueCapacity(Integer.valueOf(env.getProperty("spring.asyn.queue.size")));
taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
taskExecutor.initialize();
return taskExecutor;
}
}
线程池已满的拒绝策略
RejectedExecutionHandler handler =
new ThreadPoolExecutor.DiscardPolicy();
taskExecutor.setRejectedExecutionHandler(handler);
AbortPolicy -- 当任务添加到线程池中被拒绝时,它将抛出 RejectedExecutionException 异常。
CallerRunsPolicy -- 当任务添加到线程池中被拒绝时,会在线程池当前正在运行的Thread线程池中处理被拒绝的任务。
DiscardOldestPolicy -- 当任务添加到线程池中被拒绝时,线程池会放弃等待队列中最旧的未处理任务,然后将被拒绝的任务添加到等待队列中。
DiscardPolicy -- 当任务添加到线程池中被拒绝时,线程池将丢弃被拒绝的任务。
定义一个事件
/**
* @desc 定义监听事件
* @author yule
* @create 2019/1/25
**/
public class ContentEvent extends ApplicationEvent {
//消息体,需要异步处理的数据
private ScanData content;
public ContentEvent(Object source, ScanData content){
super(source);
this.content = content;
}
public ScanData getData(){
return content;
}
}
监听事件,异步处理
/**
* @desc 监听事件
* @author yule
* @create 2019/1/25
**/
@Component
public class ContentListener implements ApplicationListener<ContentEvent> {
@Async
@Override
public void onApplicationEvent(ContentEvent contentEvent) {
ScanData a = contentEvent.getData();
int b=0;
for(int i=0;i<10000;i++){
b=i+b;
}
System.out.println(Thread.currentThread().getName()+a.toString());
}
}
测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class TestThread {
@Autowired
private ApplicationContext applicationContext;
@Test
public void handler(){
Long start=System.currentTimeMillis();
for(int i=1;i<100;i++){
ScanData a = new ScanData();
a.setDoc_id(i);
a.setProductName("aa"+i);
ContentEvent event = new ContentEvent("aa", a);
applicationContext.publishEvent(event);
}
Long end=System.currentTimeMillis();
System.out.println("处理完毕:"+(end-start));
}
}