2017-12-18 4 views
0

@Async 메서드로 @After 및 @Around를 사용할 수 있습니까?
는이 같은 주석의 모두 시도 : 부분이 방법 끝나기 전에이라고Async 메서드에서 Spring AOP 사용

@Override 
@SetUnsetEditingFleet 
public void modifyFleet(User user, FleetForm fleetForm) throws Exception{ 
    databaseFleetsAndCarsServices.modifyFleet(user, fleetForm); 
} 

@Around("@annotation(SetUnsetEditingFleet) && args(user, fleetForm)") 
public void logStartAndEnd(ProceedingJoinPoint pjp, User user, FleetForm fleetForm) throws Throwable{ 
    fleetServices.setEditingFleet(fleetForm.getIdFleet()); 
    for(Car car : carServices.findByFleetIdFleet(fleetForm.getIdFleet())){ 
     carServices.setEditingCar(car.getIdCar()); //Set cars associated with the fleet 
    } 
    pjp.proceed(); 
    fleetServices.unSetEditingFleet(fleetForm.getIdFleet());  
    for(Car car : carServices.findByFleetIdFleet(fleetForm.getIdFleet())){ 
     carServices.unSetEditingCar(car.getIdCar()); //Unset cars associated with the fleet 
    } 
} 

@Override 
@Async 
@Transactional(rollbackFor=Exception.class) 
public void modifyFleet(User currentUser, FleetForm fleetForm) throws Exception { 
    //method instructions 

애프터. @After@Before 주석을 사용하여 시도한 결과도 같습니다.

가능한지 알고 계십니까?

+0

처리가 새 스레드로 전달 되었기 때문에 메서드가 종료되었습니다. 따라서 호출 코드의 경우 메소드 실행이 종료되었습니다. 네, 당신이 그것을 사용할 수는 있지만, 당신이 그것을 사용하고 싶지 않습니다. –

+0

그래서'@ Before' 만 사용할 수 있습니다.'@ After' 부분은 새 스레드가 시작된 후에 호출되며 끝 부분은 호출되지 않습니다. 맞습니까? – luca

+2

NO 메소드의 마지막에서 호출됩니다. 메소드는 스레드가 시작하자마자 종료합니다. 호출 코드의 경우 메소드 실행이 끝났습니다. –

답변

0

@After가 @Async와 제대로 작동하지 않습니다. 아직 작업이 완료되지 않았습니다. 비동기 메서드의 경우 void 대신 CompletableFuture를 반환하고 콜백 메서드를 사용하여 논리를 처리하면 해결할 수 있습니다. 여기서 테스트하지 않으면 예가 있습니다 :

@Around("@annotation(AsyncBeforeAfter)") 
    public void asyncBeforeAfter(ProceedingJoinPoint pjp) throws Throwable{ 
     // before work 
     Object output = pjp.proceed(); 
     CompletableFuture future = (CompletableFuture) output; 
     future.thenAccept(o -> { 
      // after work 
     }); 

    } 

    @Override 
    @Async 
    @AsyncBeforeAfter 
    @Transactional(rollbackFor=Exception.class) 
    public CompletableFuture<String> modifyFleet(User currentUser, FleetForm fleetForm) throws Exception { 
     return CompletableFuture.supplyAsync(() -> { 
      //method instructions 
      return "done"; 
    }); 
    }