Я опубликовал этот ответ, чтобы помочь коллегам-разработчикам с такими же требованиями (выполнить функцию void в отдельном потоке).
Поскольку у меня нет опыта работы в многопоточной / асинхронной среде, я хочу упростить его, используя пружинные асинхронные методы.
Итак, сначала я создал пул потоков
@Configuration
@EnableAsync
public class ThreadConfig {
@Bean
public TaskExecutor threadPoolTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(4);
executor.setMaxPoolSize(4);
executor.setThreadNamePrefix("WEBAPP");
executor.initialize();
return executor;
}
}
Затем я создал службу, которая будет выполнять мой код в отдельном потоке.
@Async
@Service
@Transactional
public class LoggingService {
public void logintransaction() throws Exception{
System.out.println("start login loggin");
Thread.sleep(5000);
System.out.println("exit");
}
}
Наконец, я вызвал вышеупомянутую службу на своемконтроллер. Как я вижу, сначала печатается Total Time Taken
, затем печатается "start login loggin".Это означает, что мой новый метод выполняется в новом потоке.
@Autowired
private LoggingService loggingService;
@PostMapping("login")
public TransactionResponse loginAuthentication(@Valid @RequestBody LoginRequestBody loginRequest) {
long startTime = System.currentTimeMillis();
TransactionResponse transactionResponse = new TransactionResponse();
try {
transactionResponse = loginService.validateUser(loginRequest);
//independent transaction needs to be executed in a separate thread
//loginSerice.addLoginLog(transactionResponse);
loggingService.logintransaction();
//return below response without waiting to compelete above log transaction
System.err.println("Total Time Taken=>"+(System.currentTimeMillis() - startTime));
return transactionResponse;
}
catch (Exception e) {
return CommonUtils.setErrorResponse(transactionResponse, e);
}
}
Спасибо