第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何異步接受 WebSocket?

如何異步接受 WebSocket?

皈依舞 2023-06-14 16:30:27
我有一個(gè)處理 WebSocket 請(qǐng)求的 Play 應(yīng)用程序。路由文件包含這一行:GET  /testsocket  controllers.HomeController.defaultRoomSocket一個(gè)已經(jīng)工作的同步版本如下所示:(改編自 2.7.x 文檔)public WebSocket defaultRoomSocket() {    return WebSocket.Text.accept(        request -> ActorFlow.actorRef(MyWebSocketActor::props, actorSystem, materializer));  }如https://www.playframework.com/documentation/2.7.x/JavaWebSockets#Accepting-a-WebSocket-asynchronously所述,我將簽名更改為public CompletionStage<WebSocket> defaultRoomSocket(){   //returning a CompletionStage here, using the "ask pattern"   //to get the needed Flow from an other Actor}從這里我遇到了以下問題:Cannot use a method returning java.util.concurrent.CompletionStage[play.mvc.WebSocket] as a Handler for requests此外,正如文檔所建議的那樣,“WebSocket”沒有類型參數(shù)。接受 WebSocket 請(qǐng)求異步的合適方法是什么?
查看完整描述

1 回答

?
翻翻過去那場(chǎng)雪

TA貢獻(xiàn)2065條經(jīng)驗(yàn) 獲得超14個(gè)贊

文檔確實(shí)需要更新,我認(rèn)為在#5055 的websockets 重構(gòu)中遺漏了一些位。

要獲得異步處理,您應(yīng)該使用acceptOrResult以 aCompletionStage作為返回類型而不是流的方法。然后可以使用函數(shù)式編程助手 ( ) 返回 aResult或 Akka?。事實(shí)上,下面是該方法的實(shí)現(xiàn)方式:FlowF.Eitheraccept

public?WebSocket?accept(Function<Http.RequestHeader,?Flow<In,?Out,??>>?f)?{?
??return?acceptOrResult(
???????request?->?CompletableFuture.completedFuture(F.Either.Right(f.apply(request))));
}

如您所見,它所做的只是調(diào)用帶有completedFuture.

為了完全使其異步并達(dá)到我認(rèn)為你想要實(shí)現(xiàn)的目標(biāo),你會(huì)做這樣的事情:

public WebSocket ws() {

? ? return WebSocket.Json.acceptOrResult(request -> {

? ? ? ? if (sameOriginCheck(request)) {

? ? ? ? ? ? final CompletionStage<Flow<JsonNode, JsonNode, NotUsed>> future = wsFutureFlow(request);

? ? ? ? ? ? final CompletionStage<Either<Result, Flow<JsonNode, JsonNode, ?>>> stage = future.thenApply(Either::Right);

? ? ? ? ? ? return stage.exceptionally(this::logException);

? ? ? ? } else {

? ? ? ? ? ? return forbiddenResult();

? ? ? ? }

? ? });

}


@SuppressWarnings("unchecked")

private CompletionStage<Flow<JsonNode, JsonNode, NotUsed>> wsFutureFlow(Http.RequestHeader request) {

? ? long id = request.asScala().id();

? ? UserParentActor.Create create = new UserParentActor.Create(Long.toString(id));


? ? return ask(userParentActor, create, t).thenApply((Object flow) -> {

? ? ? ? final Flow<JsonNode, JsonNode, NotUsed> f = (Flow<JsonNode, JsonNode, NotUsed>) flow;

? ? ? ? return f.named("websocket");

? ? });

}


private CompletionStage<Either<Result, Flow<JsonNode, JsonNode, ?>>> forbiddenResult() {

? ? final Result forbidden = Results.forbidden("forbidden");

? ? final Either<Result, Flow<JsonNode, JsonNode, ?>> left = Either.Left(forbidden);


? ? return CompletableFuture.completedFuture(left);

}


private Either<Result, Flow<JsonNode, JsonNode, ?>> logException(Throwable throwable) {

? ? logger.error("Cannot create websocket", throwable);

? ? Result result = Results.internalServerError("error");

? ? return Either.Left(result);

}

(這取自play-java-websocket-example,這可能很有趣)

如您所見,它首先經(jīng)過幾個(gè)階段,然后返回 websocket 連接或 HTTP 狀態(tài)。


查看完整回答
反對(duì) 回復(fù) 2023-06-14
  • 1 回答
  • 0 關(guān)注
  • 166 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)