Выполнить совет аспекта Spring по выполнению потока - PullRequest
0 голосов
/ 06 марта 2020

У меня есть сценарий в моем приложении Springboot, где я отправляю задачи в пул потоков для асинхронного выполнения c. Некоторые методы внутри дочернего выполнения являются частью советов по аспектам @AfterReturn. Я замечаю, что даже если обработка выполняется как c, мой основной поток продолжает выполнять рекомендации по вырезанию точек из дочернего потока, и моя служба не возвращает значение до тех пор, пока весь дочерний поток не завершит выполнение. Любой указатель, как заставить совет работать на самом исполняющем потоке? Короче говоря, метод контроллера не возвращает ответ до тех пор, пока не будет выполнено 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
    }



}

1 Ответ

0 голосов
/ 06 марта 2020

@Async в методе службы не означает, что он будет передан в службу исполнителя и затем немедленно возвращен, но вы можете иметь несколько входящих вызовов к конечной точке, которые затем будут обрабатываться одновременно (это в любом случае, по умолчанию, @Async - это всего лишь маркер).

Вы можете прочитать это руководство , чтобы увидеть, как это можно сделать правильно.

Суть в том, что вашему сервису необходимо создать (и при желании вернуть) какой-то Future (в случае сообщения CompletableFuture, как в

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

Звучит так, как будто вы действительно хотите подождать хотя для достижения результата, так что пока это сработает, я надеюсь, что позже у вас возникнут проблемы.

...