Springboot非同步任務執行緒池
1. 啟動類新增@EnableAsync註解
package com.gblfy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
@EnableAsync
@SpringBootApplication
public class JavaEscapeApplication {
public static void main(String[] args) {
SpringApplication.run(JavaEscapeApplication.class, args);
}
}
2. 非同步方法新增@Async註解
package com.gblfy.async_task;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.stereotype.Service;
import java.util.concurrent.Future;
@Slf4j
@Service
public class AsyncService {
@Async
public void asyncProcess01() throws Exception {
log.info("AsyncService Start to asyncProcess01 ->{}", Thread.currentThread().getName());
Thread.sleep(2000);
log.info("AsyncService Start to asyncProcess01 ->{}", Thread.currentThread().getName());
}
@Async
public Future<String> asyncProcess02() throws Exception {
log.info("AsyncService Start to asyncProcess02->{}", Thread.currentThread().getName());
Thread.sleep(2000);
log.info("AsyncService Done to asyncProcess02->{}", Thread.currentThread().getName());
return new AsyncResult<>("imooc");
}
@Async
public void asyncProcess03() {
log.info("AsyncService Start to asyncProcess03->{}", Thread.currentThread().getName());
throw new RuntimeException("throw exception asyncProcess03");
}
}
3. 自定義執行緒池以及執行緒池異常策略
package com.gblfy.async_task;
import lombok.extern.slf4j.Slf4j;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
/**
* 自定義非同步任務執行緒池
*/
@Slf4j
@Configuration
public class AsyncTaskConfig implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setThreadNamePrefix("cmiip-");
executor.setCorePoolSize(15);
executor.setMaxPoolSize(20);
executor.setKeepAliveSeconds(5);
executor.setQueueCapacity(100);
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.setAwaitTerminationSeconds(60);
executor.initialize();
return executor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return new AsyncUncaughtExceptionHandler() {
@Override
public void handleUncaughtException(Throwable ex, Method method, Object... params) {
// 報警郵件,發簡訊等等
log.error("async task some Error: {} ,{} , {}", ex.getMessage(),
method.getDeclaringClass().getName() + "." + method.getName(),
Arrays.toString(params));
}
};
}
}
測試
package com.gblfy.async_task;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
@Slf4j
@SpringBootTest
class AsyncServiceTest {
@Autowired
private AsyncService asyncService;
@Test
void contextLoads() throws Exception {
// asyncService.asyncProcess01();
Future<String> future= asyncService.asyncProcess02();
log.info("Async Process02 return :->{}", future.get(1, TimeUnit.SECONDS));
}
@Test
void contextLoads2() throws Exception {
asyncService.asyncProcess03();
Thread.sleep(3000);
}
}
相關文章
- 玩轉SpringBoot之定時任務@Scheduled執行緒池配置Spring Boot執行緒
- Java非同步判斷執行緒池所有任務是否執行完成的方法Java非同步執行緒
- 【進階之路】執行緒池擴充與CompletionService操作非同步任務執行緒非同步
- SpringBoot 整合執行緒池Spring Boot執行緒
- Spring Boot使用執行緒池處理事務任務Spring Boot執行緒
- SpringBoot執行緒池和Java執行緒池的實現原理Spring Boot執行緒Java
- springboot使用執行緒池(ThreadPoolTaskExecutor)Spring Boot執行緒thread
- 死磕 java執行緒系列之執行緒池深入解析——普通任務執行流程Java執行緒
- Java幾種執行緒池及任務佇列Java執行緒佇列
- 執行緒池遇到父子任務,有大坑,要注意!執行緒
- 非同步/同步,阻塞/非阻塞,單執行緒/多執行緒概念梳理非同步執行緒
- 死磕 java執行緒系列之執行緒池深入解析——未來任務執行流程Java執行緒
- springboot中如何使用執行緒池Spring Boot執行緒
- 同步任務與非同步任務執行順序非同步
- 執行緒池監控2-監控執行緒池狀態、執行緒數量和佇列任務數量等執行緒佇列
- springboot配置執行緒池使用多執行緒插入資料Spring Boot執行緒
- ThreadPoolExecutor執行緒池任務執行失敗的時候會怎樣thread執行緒
- 深入分析3種執行緒池執行任務的邏輯方法執行緒
- Java同步之執行緒池詳解Java執行緒
- jdk排程任務執行緒池ScheduledThreadPoolExecutor工作原理解析JDK執行緒thread
- suging閒談-netty 的非同步非阻塞IO執行緒與業務執行緒分離Netty非同步執行緒
- Spring Boot中有多個@Async非同步任務時,記得做好執行緒池的隔離!Spring Boot非同步執行緒
- 程式執行緒、同步非同步、阻塞非阻塞、併發並行執行緒非同步並行
- Java執行緒池二:執行緒池原理Java執行緒
- Java CompletableFuture:allOf等待所有非同步執行緒任務結束Java非同步執行緒
- Java中命名執行器服務執行緒和執行緒池Java執行緒
- 執行緒和執行緒池執行緒
- 執行緒 執行緒池 Task執行緒
- 多執行緒【執行緒池】執行緒
- SpringBoot執行定時任務@ScheduledSpring Boot
- C# 執行緒與任務C#執行緒
- 執行緒池執行緒
- Springboot中使用執行緒池的三種方式Spring Boot執行緒
- Springboot執行緒池的使用和擴充套件Spring Boot執行緒套件
- Springboot-之定時任務,啟動執行任務Spring Boot
- SpringBoot使用非同步執行緒池實現生產環境批量資料推送Spring Boot非同步執行緒
- 執行緒池以及四種常見執行緒池執行緒
- java執行緒池趣味事:這不是執行緒池Java執行緒