【发布时间】:2020-06-18 23:26:40
【问题描述】:
我的 springboot 应用程序中有一个场景,我将任务提交到线程池以进行异步执行。现在子执行中的一些方法是 @AfterReturn 方面点建议的一部分。 我观察到,即使处理是异步完成的,我的主线程也会继续执行来自子线程的切入点建议,并且我的服务不会返回值,直到所有子线程完成执行。 任何指针如何使建议在执行线程本身上运行? 所以简而言之,控制器方法在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
}
}
【问题讨论】:
-
请说明为什么要从方面方法返回值?
-
嗨...我在谈论我的主 http 线程返回响应。就像这样 => 控制器方法 a=>。 @Async 方法 b()=> 方法 c()....等等。现在方法 c() 是 afterReturn 切入点的一部分。方法 a 在方法 c() 完成之前不会发送响应。基本上我的主线程被阻塞由于方面。我希望方面在线程方法 c() 正在运行或以某种方式在任务提交到 executorpool 后立即将响应发送回客户端。
-
请发布一个最小的代码示例。我很难确定我正确理解你在做什么。
-
我添加了一个示例代码。在子线程中完成 dao 方法执行并且它的建议在主线程中执行之前,我的控制器方法不会返回响应。所以我不会从异步执行中受益我的 api 的响应时间。
-
我能想到的唯一原因是你错过了
@EnableAsync注释。
标签: java spring multithreading asynchronous spring-aspects