2016-11-10 7 views
3

/fire 종점을 노출하는 akka-http로 작성된 REST 서비스가 있습니다. 해당 엔드 포인트가 호출되면 서비스는 ~ 50MB의 파일을 다른 서비스로 보내야합니다. 그러나 /fire 엔드 포인트는 호출자에게 즉시 반환하고 파일을 비동기 적으로 화재 및 잊어 버리는 방식으로 계속 보내야합니다.akka-http에서 응답 후에도 스칼라 선물이 계속 실행됩니까?

내 구현은 내가 그것을 시험이

path("fire") { 
    post { request: FireRequest => 
     complete { 
     sendFile(request.path) 
     StatusCodes.OK 
     } 
    } 
    } 
} 

def sendFile(path: String): Future[Unit] = Future { 
    // send the large file to another service 
} 

모양과 그것을 잘 작동합니다.

그러나 ASP.NET에서 비슷한 동작을 구현할 때 완성 된 요청에 의해 생성 된 스레드가 결국 사라지기 때문에 비동기 작업을 처리하기 위해 타사 프레임 워크 (Hangfire)를 사용해야했습니다.

내 질문 : 내 akka-http sendfile 성공적으로 완료 될 때까지 실행되도록 보장되거나 실행되는 스레드가 종료 될 수 있습니까?

답변

4

아마도 미래를 실행하는 ExecutionContext에 따라 달라질 수 있습니다.

글로벌 ExecutionContext를 사용하는 경우 요청 완료 후에도 Future가 계속 실행됩니다.

내가 아는 한, 요청 완성의 경우 Future 스레드를 중단/중단/취소하는 ExecutionContext를 본 적이 없습니다. 요청 완료 개념은 언어 수준에서는 존재하지 않지만 http 계층 프레임 워크와 더 관련이 있습니다. 따라서 HTTP 계층 프레임 워크에서 ExecutionContext를 사용하지 않는 한 이러한 동작을 수행 할 이유가 없습니다.

+0

또한, 의도적으로'scala.concurrent.Future'를 실패하는 개념이 없습니까, 아니면 제가 빠진 것이 있습니까? – rethab

+0

무슨 뜻인지 확실하지 않습니다. 성공한 미래를 실패한 약속으로 바꿀 수 있으며 실패한 약속을 만들 수 있습니다. 성공적인 약속을 실패한 것으로 바꾸는 것은 조건부로 수행 할 수 있습니다. 따라서 어떤 종류의 "미래 취소"를 구현할 수 있습니다 (단,이 취소는 제한적이며 현재의 약속이 실패로 바뀔뿐 아니라 " 출처") –