我的 springboot 应用程序中有一个场景,我将任务提交到线程池中以进行异步执行。现在,子执行中的一些方法是 @AfterReturn 方面点建议的一部分。 我观察到,即使处理完成 asnyc,我的主线程也会继续执行子线程的切点建议,并且我的服务不会返回值,直到所有子线程完成执行。 任何指针如何使建议在执行线程本身上运行? 所以简而言之,controller方法只有在dao方法执行及其对应的切入点执行完毕后才会返回响应。
@Controller
@RequestMapping(value = "/api")
public class SampleController {
@Autowired
SampleService service;
@RequestMapping(value = "/action", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
@ResponseBody
public String action(@RequestBody String request){
service.action(request);
return "Success";
}
}
@Service
public class SampleService{
@Autowired
SampleDao dao;
@Async("threadPoolExecutor")
public void action(String request){
dao.action(request);
}
}
@Repository
public class SampleDao{
public void action(String request){
//do some db things
}
}
@Aspect
@Component
public class SampleAspect{
@AfterReturning(
pointcut = "execution( * com.sample.*.*.SampleDao.action(..))",
returning = "result")
public void audit(JoinPoint joinPoint, Object result) {
//dosome thing
}
}
最佳答案
服务方法上的@Async
并不意味着它将被提交到执行器服务然后立即返回,而是您可以对端点进行多次传入调用,然后该端点将被调用。并发处理(无论如何,这是默认情况,@Async
几乎只是一个标记)。
您可以阅读this guide看看如何正确完成此操作。
要点是您的服务需要创建(并可选择返回)某种Future
(在帖子的情况下,CompletableFuture
,如
@Async
void serviceMethod(String request) {
CompletableFuture.submit(() -> dao.action(request));
}
听起来您确实想等待结果到达,所以虽然这可行,但我预计您稍后会遇到问题。
关于java - 在执行线程上运行 Spring 方面建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60560469/