![](/img/trans.png)
[英]Spring Boot @Async method in controller is executing synchronously
[英]Spring Boot @Async method executing synchronously
这与此处的另一个问题非常相似: 控制器中的 Spring Boot @Async 方法正在同步执行。 但是我用@Async
注释的@Service
方法仍在同步执行。 我已经尝试了来自不同论坛的所有方法都没有用。 希望有人能帮我找出原因。 下面的一个简单的弹簧启动项目不起作用。
异步配置文件
@Configuration
@EnableAsync
public class AsyncConfiguration(){}
SomeService.java
@Service
public class SomeService() {
@Async
public void doSomething() {
try {
Thread.sleep(5000L);
} catch (Exception ignore){}
}
}
一些控制器.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
对不起我的英语不好。 同样的问题发生在我身上。 解决方案是添加
@Autowired
private SomeService someService;
在Controller类中,通过这种方式,它允许类包含与“SomeService”相关联的Beam Configurations,从而能够完美地执行异步方法。
这是一个具有功能性异步方法的项目: https : //github.com/JColmenares/async-method-api-rest.git
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.