저는 스프링 프레임 워크를 사용하여 모바일 및 웹 애플리케이션 용 API를 빌드하고 있습니다. 내가 이해하는 한, 주석 @Async
은이 메소드 처리를 처리하기 위해 새 스레드가 생성 될 것임을 의미합니다. 그래서 비동기 적으로 실행하는 과정을 유지하기 위해, 컨트롤러 코드는 다음과 같습니다 : 여기@Async 주석은 어디로 이동합니까?
@Async
@RequestMapping(path = "", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody CompletableFuture<ResponseEntity<ApiResponse>> DoSomething()
{
log.info("Get something done with the request received from user ");
return (CompletableFuture.supplyAsync(() -> DoSomethingProcessor()));
}
내가 요청을 수신 컨트롤러가 다음 (도 @Async
입니다) 프로세서 방식에 보내기. 이 경우 컨트롤러는 더 많은 요청을받을 수 있으며 요청은 동시에 실행됩니다. 프로세서 메서드의 코드는 다음과 같습니다.
@Async
private ResponseEntity<ApiResponse> GetPermissionsProcessor() {
//Do things here
return new ApiResponse()
}
프로세서는 필요할 경우 리포지토리를 호출하는 서비스 메서드를 호출합니다.
UPDATE : 서비스 계층은 다음과 같습니다
@Async
public static ApiResponse CreateRole (Object anObject) throws Exception{
//Do things and call repository
return new ApiResponse(x);
}
이 저장소 코드 :
이public static Integer InsertRole (Object newObject, DataSourceConfig dsc)
{
String sql = "INSERT INTO table";
dsc.insertObject(sql, NewObject);
return dsc.insertObject(sql, newRole);
}
내 질문에 내가 @Async
주석을 추가 중지합니까입니까? 컨트롤러 레벨 또는 서비스 레벨 (비즈니스 로직 레이어) 또는 저장소에서? 아니면 여기서 잘못된 접근을하고 있습니까? 처리가 많은 무언가가있을 때만 서비스 및 저장소 계층에만 추가해야합니까?
제거하십시오 ... 이미 이미 async 인'CompletableFuture'를 사용하고 있습니다. 다른 '@ ASync'를 추가 할 필요가 없습니다. 당신은 지나치게 복잡 해지고 있습니다. 또한 클래스의 새 인스턴스를 직접 생성하므로 주석을 추가하거나 자동 배선을 시도하면 봄에 의해 관리되지 않는 것과 같이 아무 것도하지 않습니다. –
'CompletableFuture'을 제거하고 스프링 프레임 워크의'@Async' 주석만을 고수하고 싶다면 어떻게해야할까요? 지금 당장은 코드가 둘다 조금씩 있습니다. 그 중 하나에 정착하고 싶습니다 –
참조 http://stackoverflow.com/questions/28908229/how-to-implement-an-asynchronous-rest-request-to-a- controller-using-springboot를 사용하여 비동기 요청 처리로 비동기 메서드 호출을 혼란스럽게합니다. – Kayaman