嗨,我是 Java 多執行緒的新手。有人可以幫我解決這個問題:
我的服務:
@Async
public List<String> doSomething(int a){
//Do something
return list;
}
Springboot應用程式:
@SpringBootApplication
@EnableAsync
public class Test {
public static void main(String[] args) {
SpringApplication.run(Test.class, args);
}
}
異步配置:
@Configuration
@EnableAsync
public class AsyncConfig {
@Bean(name ="taskExecutor")
public Executor taskExecutor(){
ThreadPoolTaskExecutor executor=new ThreadPoolTaskExecutor();
executor.setCorePoolSize(2);
executor.setMaxPoolSize(2);
executor.setQueueCapacity(100);
executor.setThreadNamePrefix("userThread-");
executor.initialize();
return executor;
}
}
控制器:
@RestController
public class Controller{
@Autowired
private Service service;
@GetMapping("test")
public List<String> getAll(){
return service.doSomething(1);
}
}
當我從郵遞員那里收到這個獲取請求時,它在回應中顯示為空白。我知道我的呼叫是異步進行的,甚至在呼叫 my 方法之前回應就會回傳。有沒有辦法通過更改我的郵遞員或 Spring Boot 應用程式中的某些設定來查看此回應
uj5u.com熱心網友回復:
如果你想異步處理請求,又希望API客戶端在處理完成后接收回應,這樣從客戶端的角度來看,請求處理看起來還是同步的,關鍵是使用Servlet3異步處理。特征。
您無需將其配置為使用@Aysnc. 而是將控制器方法配置為 return CompletableFuture。在幕后,它將觸發 Servlet3 的異步請求處理,該處理將在接收請求的 HTTP 執行緒之外的另一個執行緒中處理請求。
所以你的代碼應該是這樣的:
public class Service {
//No need to add @Async
public List<String> doSomething(int a){
return list;
}
}
@RestController
public class Controller{
@Autowired
private Service service;
@GetMapping("test")
public CompletableFuture<List<String>> getAll(){
return CompletableFuture.supplyAsync(()->service.doSomething(1));
}
}
關于 spring-mvc 中支持的 Servlet3 異步請求處理的詳細資訊,可以參考這個博客系列從this開始。
uj5u.com熱心網友回復:
您可以回傳CompletableFuture。當 CompleteableFuture 完成時,您將收到 http 回應。
服務:
@Async
public CompletableFuture<List<String>> doSomething() {
return CompletableFuture.completedFuture(Arrays.asList("1", "2", "3"));
}
控制器:
@GetMapping("test")
public CompletableFuture<List<String>> getAll(){
return service.getAll();
}
uj5u.com熱心網友回復:
如果您想使用異步,我會將您的單個請求拆分為所謂的“開始任務”和“獲取任務結果”請求。您的應用程式為“開始任務”請求回傳“請求 ID”。然后在執行“獲取任務結果”時使用“請求 ID”。這樣的場景是批處理任務中的常見方式。如果您使用 Spring,您可能會對研究Spring Batch框架感興趣,該框架具有啟動/停止/重新啟動作業功能等。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/461376.html
