【问题标题】:Run Spring aspect advice on executing thread在执行线程上运行 Spring 方面的建议
【发布时间】: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


【解决方案1】:

service 方法上的@Async 并不意味着它会被提交到执行器服务然后立即返回,而是可以有多个对端点的传入调用,然后将同时处理(这是无论如何,默认情况下,@Async 几乎只是一个标记)。

您可以阅读this guide 了解如何正确完成此操作。

要点是您的服务需要创建(并可选择返回)某种Future(在帖子的情况下为CompletableFuture,如

@Async
void serviceMethod(String request) {
    CompletableFuture.submit(() -> dao.action(request));
}

听起来你确实想等待结果的到来,所以虽然这会起作用,但我希望你以后会遇到问题。

【讨论】:

  • 感谢您的解释!但是我已经调试并发现如果我禁用方面,我会立即得到响应,并且我的主线程不会等待子线程执行完成。我需要尽快成功响应由于提交了任务。所以我的主要问题不是异步。而是阻止请求完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-01
  • 1970-01-01
  • 2017-02-12
  • 1970-01-01
  • 2016-12-01
相关资源
最近更新 更多