java - 在执行线程上运行 Spring 方面建议

标签 java spring multithreading asynchronous spring-aspects

我的 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/

相关文章:

java - 如何从 IP 范围中获取单独的连续 IP block ?

java - Android 中用于谷歌云数据存储的谷歌 protobuf api

spring - 如何在 jms-spring 集成中向消息监听器 bean 注入(inject)消息选择器?

java - 从 Eclipse 运行找不到 tld 文件,但在 jar 中运行它可以工作

Python 线程和锁 : Deadlock

python - 如何使用 Django Channels 多线程 AsyncConsumer

java - 安卓 java.lang.IllegalArgumentException : byteCount

java - 如何根据我的消息更改每个像素的 LSB

spring - 寻找Java系统参数的Spring-Hadoop Job-Runner问题

Java:尽管执行非常简单的任务,线程仍需要很长时间才能完成