Handing asynchronous results

4816 단어

Handing asynchronous results


Make controllers asynchronous


내부에서 플레이는 아래에서 위로 비동기적이다.Play는 asynchronous,non-blocking 방식으로 모든 요청을 처리합니다.
기본 설정은 asynchronous controllers를 시작합니다.다시 말하면 응용된 코드는 controllers에 막히는 것을 피해야 한다. 즉, controller의 코드는 하나의 조작으로 인해 기다리는 것이다.JDBC calls, streaming API, HTTP requests and long computations와 같은 일반적인 차단 작업
기본 실행 환경의 스레드 수를 늘려서 더 많은 병렬 요청을 차단 컨트롤러가 처리할 수 있도록 할 수 있지만, 아래의 추천을 따라 가능한 한 컨트롤러의 비동기화를 유지하는 것은 시스템 부하의 신속한 응답을 신축하고 유지하는 데 더욱 쉽다.

Creating non-blocking actions


플레이의 작업 방식 때문에, 액션 코드는 가능한 한 빨리, 즉 non-blocking을 해야 한다.그러면 저희가 액션에서 뭘 되돌려야 돼요. 만약에 저희가 이 결과를 계산하지 못했다면?우리는 돌아가야 한다promise.
Java 8은 공통 promise API CompletionStage 를 제공합니다.하나 CompletionStage 는 최종적으로 하나 Result 유형의 값에 의해 상환될 것이다.CompletionStage를 사용하여 정상적인 Result를 대체하면 우리는 액션에서 어떤 것도 막지 않고 빠르게 되돌아갈 수 있다.Result가 상환되면 Play가 반환됩니다.
웹 클라이언트는 응답할 때까지 막힐 것입니다. 그러나 서버는 아무런 막힘도 없습니다. 또한 서버의 자원은 다른 클라이언트를 서비스할 수 있습니다.

How to create a CompletionStage

CompletionStage를 만들려면 다른 프로미스트가 필요합니다. 이 프로미스는 우리에게 진실한 값을 줍니다. - 우리가 필요로 하는 계산 결과:
CompletionStage promiseOfPIValue = computePIAsynchronously();
CompletionStage promiseOfResult = promiseOfPIValue.thenApply(pi ->
                ok("PI value computed: " + pi)
);

Play의 비동기 API 방법을 하나 드릴게요CompletionStage.외부 웹 서비스 사용 play.libs.WS API를 호출하거나, Akka to schedule asynchronous tasks를 사용하거나, Actor 통과 play.libs.Akka 를 사용하여 통신할 수도 있습니다.
코드 블록을 다른 방식으로 실행하고 가져오는 간단한 방법 CompletionStageCompletableFuture.supplyAsync() helper:
CompletionStage promiseOfInt = CompletableFuture.supplyAsync(() -> intensiveComputation());

주의:promises의 코드가 어느 라인에서 실행되는지 아는 것이 매우 중요합니다.이곳의 밀집 연산은 다른 노선에서 운행될 것이다.패키지CompletionStage를 통해 synchronous IO를 asynchronous로 변환할 수 없습니다.만약 이 응용 프로그램의 구조를 바꾸어 막히는 작업을 피할 수 없다면, 일부 지역에서 작업이 실행될 때, 라인이 막힐 것이다.그래서 CompletionStage를 사용하여 소포 작업을 할 때 분리된 excution context에서 실행할 수 있도록 충분한 라인을 설정해야 합니다. 예상된 병발을 처리할 수 있습니다.자세한 내용은 Understanding Play thread pools 를 참조하십시오.여기에 Actors를 사용하여 차단 작업을 처리하는 것도 도움이 됩니다.Actors는 timeouts와failures를 깨끗하게 처리하고 실행을 막는 contexts를 설정하며 이 서비스와 연결될 수 있는 임의의 상태를 관리합니다.Actors는 유사ScatterGatherFirstCompletedRouter 모드 to address simultaneous cache and database requests and allow remote execution on a cluster of backend servers를 제공합니다.But an Actor may be overkill depending on what you need.

Using CompletionStage inside an Action


Action에서 JavaCompletionStage를 사용할 때 HTTP 실행 컨텍스트를 실행기로 명시적으로 제공하여 HTTP를 확보해야 합니다.Context는 범위 내에 유지됩니다.HTTP execution context를 사용하지 않으면 "There is no HTTP Context available from here"오류를 호출할 때request() 또는 다른 의존Http.Context 방법을 얻을 수 있습니다.play.libs.concurrent.HttpExecutionContext의 실례를 통해 의존 주입을 할 수 있다.
public class Application extends Controller {
    @Inject HttpExecutionContext ec;

    public CompletionStage index() {
        someCompletableFuture.supplyAsync(() -> { 
          // do something with request()
        }, ec.current());
    }
}

Async results


We have been returning Result up until now.비동기적인 결과를 보내려면 우리의 액션이 하나 되돌아와야 한다CompletionStage:
public CompletionStage index() {
    return CompletableFuture.supplyAsync(() -> intensiveComputation())
            .thenApply(i -> ok("Got result: " + i));
}

Actions are asynchronous by default


Play actions는 기본적으로 비동기식입니다.예를 들어 다음 controller 코드는 Result의 내부 패키지에 promise를 포함합니다.
public Result index() {
    return ok("Got request " + request() + "!");
}

주의: 액션 코드가 하나Result나 하나CompletionStage로 되돌아오든지 간에 이 두 가지 되돌아오는 대상은 모두 같은 방식으로 내부에서 처리됩니다.여기에 또 하나의 단독 Action은 비동기적이며 두 가지가 아니다.되돌아오기 CompletionStage 는 비저항 코드를 작성하는 기술이다.

Handling time-outs


시간 초과를 정확하게 처리하는 것은 웹 브라우저의 막힘과 기다림을 피하는 데 도움이 된다.너는 play.libs.concurrent.Timeout.timeout 방법으로 CompletionStage 막히지 않는 시간 초과를 소포할 수 있다.
class MyClass implements play.libs.concurrent.Timeout {
    CompletionStage callWithOneSecondTimeout() {
        return timeout(computePIAsynchronously(), Duration.ofSeconds(1));
    }
}

주의: Timeout은 cancellation과 달리 시간이 초과된 경우에도 완성된 값을 되돌려 주지 않아도 주어진future는 완성됩니다.

좋은 웹페이지 즐겨찾기