gpt4 book ai didi

java - Spring Boot @Async 方法同步执行

转载 作者:行者123 更新时间:2023-11-29 02:57:49 24 4
gpt4 key购买 nike

这与这里的另一个问题非常相似:Spring Boot @Async method in controller is executing synchronously .然而,我的 @Service 方法用 @Async 注释仍然同步执行。我已经尝试了来自不同论坛的所有方法,但没有用。希望有人能帮我弄清楚原因。如下所示的简单 spring boot 项目不起作用。

AsyncConfiguration.java

@Configuration
@EnableAsync
public class AsyncConfiguration(){}

SomeService.java

@Service
public class SomeService() {
@Async
public void doSomething() {
try {
Thread.sleep(5000L);
} catch (Exception ignore){}
}
}

SomeController.java

@Controller
public class SomeController() {

@Inject SomeService someService;

@RequestMapping(value="/", method=RequestMethod.POST)
public String doStuff() {
someService.doSomething();
return "mytemplate";
}
}

最佳答案

这是一个使用@Async 的简单示例。按照以下步骤让@Async 在您的 Spring Boot 应用程序中工作:

第 1 步:添加 @EnableAsync 注解并将 TaskExecutor Bean 添加到应用程序类。

例子:

@SpringBootApplication
@EnableAsync
public class AsynchronousSpringBootApplication {

private static final Logger logger = LoggerFactory.getLogger(AsynchronousSpringBootApplication.class);

@Bean(name="processExecutor")
public TaskExecutor workExecutor() {
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setThreadNamePrefix("Async-");
threadPoolTaskExecutor.setCorePoolSize(3);
threadPoolTaskExecutor.setMaxPoolSize(3);
threadPoolTaskExecutor.setQueueCapacity(600);
threadPoolTaskExecutor.afterPropertiesSet();
logger.info("ThreadPoolTaskExecutor set");
return threadPoolTaskExecutor;
}

public static void main(String[] args) throws Exception {
SpringApplication.run(AsynchronousSpringBootApplication.class,args);
}
}

第 2 步:添加执行异步进程的方法

@Service
public class ProcessServiceImpl implements ProcessService {

private static final Logger logger = LoggerFactory.getLogger(ProcessServiceImpl.class);

@Async("processExecutor")
@Override
public void process() {
logger.info("Received request to process in ProcessServiceImpl.process()");
try {
Thread.sleep(15 * 1000);
logger.info("Processing complete");
}
catch (InterruptedException ie) {
logger.error("Error in ProcessServiceImpl.process(): {}", ie.getMessage());
}
}
}

第三步:在Controller中添加API来执行异步处理

@Autowired
private ProcessService processService;

@RequestMapping(value = "ping/async", method = RequestMethod.GET)
public ResponseEntity<Map<String, String>> async() {
processService.process();
Map<String, String> response = new HashMap<>();
response.put("message", "Request is under process");
return new ResponseEntity<>(response, HttpStatus.OK);
}

我还使用这些步骤在 GitHub 上编写了一个博客和一个工作应用程序。请检查: http://softwaredevelopercentral.blogspot.com/2017/07/asynchronous-processing-async-in-spring.html

关于java - Spring Boot @Async 方法同步执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32561530/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com