@异步不适合我,尝试过多次调试它,但是api在同一个线程中运行。
我是在配置中遗漏了什么,还是在组件之间存在某种相互作用,而我看不到这些组件?
我通过使用固定时间间隔调用相同的api 2-3次进行调试,但它们都运行在同一个线程中。
配置类:
@Configuration
@EnableAsync
public class AsyncConfig {
@Bean("threadPoolTaskExecutor")
public TaskExecutor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(2);
executor.setMaxPoolSize(2);
executor.setQueueCapacity(100);
executor.setThreadNamePrefix("AsyncThread-");
executor.initialize();
return executor;
}
}方法,其中我要应用异步。
@Async("threadPoolTaskExecutor")
public static CompletableFuture<Object> getExecutionDatafromDb() {
long start = System.currentTimeMillis();
Object executionData = "";
db = mongoClient.getDatabase(database);
collection = db.getCollection("executiondata");
Document data = null;
BasicDBObject whereQuery = new BasicDBObject();
Document document = new Document();
ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
String json = null;
whereQuery.put(MACHINE_ID, 8);
whereQuery.put(PROJECT_ID, 121);
iterDoc = collection.find(whereQuery).cursor();
try {
if (iterDoc.hasNext()) {
data = iterDoc.next();
executionData = data.get("execution_data");
} else {
executionData = createExecutionDataJson();
document.put("execution_data", executionData);
document.put(MACHINE_ID, machineId);
document.put(PROJECT_ID, projectId);
}
} catch (Exception e) {
throw new BusinessException("605",
"Something went wrong in Service layer while fetching Execution Data From Db" + e.getMessage());
}
logger.info("Fecthing data "+Thread.currentThread().getName());
try {
json = ow.writeValueAsString(executionData);
} catch (JsonProcessingException e) {
e.printStackTrace();
} finally {
iterDoc.close();
}
long end = System.currentTimeMillis();
logger.info("Total time {}", (end - start));
return CompletableFuture.completedFuture(json);
}我想要点击的Api:
@SuppressWarnings("static-access")
@GetMapping(value = "/getExecutionDataByThread", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity getExecutionDataByThread() {
Object result1 = asyncService.getExecutionDatafromDb();
sleep(2); // for demonstration
Object result2 = asyncService.getExecutionDatafromDb();
sleep(2);
Object result3 = asyncService.getExecutionDatafromDb();
return ResponseEntity.status(HttpStatus.OK).build();
}发布于 2022-06-27 17:24:12
异步方法的工作方式是将对象与带注释的方法包装在代理中,该代理从池中获取线程并在其上执行任务。这对于spring托管对象的方法是有效的,对于静态方法则不起作用。使该方法成为实例方法。
https://stackoverflow.com/questions/72775994
复制相似问题