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

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

如何在 spring mvc 中使用 servlet 3.1?

如何在 spring mvc 中使用 servlet 3.1?

qq_笑_17 2023-03-02 10:02:19
有 2 種不同的功能可用:servlet 3.0允許在不同于容器線程的線程中處理請(qǐng)求。servlet 3.1允許在不阻塞讀/寫線程的情況下讀/寫套接字網(wǎng)上有很多關(guān)于 servlet 3.0 特性的例子。我們可以很容易地在Spring中使用它。我們只需要返回DefferedResult或CompletableFuture但是我找不到 spring 中使用 servlet 3.1 的示例。據(jù)我所知,我們必須登記WriteListener并ReadListener在里面做一些骯臟的工作。但是我找不到那個(gè)聽眾的例子。我相信這不是很容易。您能否提供 spring 中 servlet 3.1 功能的示例以及 Listener implementaion 的解釋?
查看完整描述

4 回答

?
三國(guó)紛爭(zhēng)

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

對(duì)于 servlet 3.1,您可以使用 Reactive Streams 橋支持非阻塞 I/O

Servlet 3.1+ 容器

要作為 WAR 部署到任何 Servlet 3.1+ 容器,您可以在 WAR 中擴(kuò)展和包含 {api-spring-framework}/web/server/adapter/AbstractReactiveWebInitializer.html[AbstractReactiveWebInitializer]。該類使用 ServletHttpHandlerAdapter 包裝 HttpHandler 并將其注冊(cè)為 Servlet。

所以你應(yīng)該擴(kuò)展AbstractReactiveWebInitializer來添加異步支持

registration.setAsyncSupported(true);

以及ServletHttpHandlerAdapter中的支持

AsyncContext asyncContext = request.startAsync();


查看完整回答
反對(duì) 回復(fù) 2023-03-02
?
慕桂英3389331

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

追查一些例子不應(yīng)該太難。我在WASdev/sample.javaee7.servlet.nonblocking找到了來自 IBM 的一個(gè)。在 Spring 或 Spring Boot 中使用javax.servletAPI 只是要求 Spring 注入HttpServletRequest或HttpServletResponse. 所以,一個(gè)簡(jiǎn)單的例子可能是:


@SpringBootApplication

@Controller

public class Application {


    public static void main(String[] args) {

        SpringApplication.run(Application.class, args);

    }


    @RequestMapping(path = "")

    public void writeStream(HttpServletRequest request, HttpServletResponse response) throws IOException {

        ServletOutputStream output = response.getOutputStream();

        AsyncContext context = request.startAsync();

        output.setWriteListener(new WriteListener() {

            @Override

            public void onWritePossible() throws IOException {

                if ( output.isReady() ) {

                    output.println("WriteListener:onWritePossible() called to send response data on thread : " + Thread.currentThread().getName());

                }

                context.complete();

            }

            @Override

            public void onError(Throwable t) {

                context.complete();

            }

        });

    }

}

這只是創(chuàng)建一個(gè)WriteListener并將其附加到請(qǐng)求輸出流,然后返回。沒有什么花哨。


編輯:重點(diǎn)是 servlet 容器(例如 Tomcat)onWritePossible在可以無阻塞地寫入數(shù)據(jù)時(shí)調(diào)用。有關(guān)更多信息,請(qǐng)參見使用 Servlet 3.1 的非阻塞 I/O:使用 Java EE 7 的可擴(kuò)展應(yīng)用程序(TOTD #188)。.


偵聽器(和編寫器)具有回調(diào)方法,當(dāng)內(nèi)容可供讀取或可以無阻塞寫入時(shí)調(diào)用這些回調(diào)方法。


因此因此onWritePossible只有在out.println可以無阻塞地調(diào)用時(shí)才被調(diào)用。


調(diào)用 setXXXListener 方法表示使用非阻塞 I/O 而不是傳統(tǒng)的 I/O。


大概你必須做什么檢查output.isReady才能知道你是否可以繼續(xù)寫字節(jié)。似乎您必須與發(fā)送方/接收方就塊大小達(dá)成某種隱式協(xié)議。我從來沒有使用過它,所以我不知道,但是你在 Spring 框架中要求了一個(gè)這樣的例子,這就是所提供的。


因此 onWritePossible 僅在可以無阻塞地調(diào)用 out.println 時(shí)調(diào)用。 這聽起來是正確的,但我如何理解可以寫入多少字節(jié)?我應(yīng)該如何控制它?


編輯 2:這是一個(gè)非常好的問題,我無法給你一個(gè)確切的答案。我假設(shè)onWritePossible當(dāng)服務(wù)器在與主 servlet 分開的(異步)線程中執(zhí)行代碼時(shí)調(diào)用它。從您檢查的示例中,input.isReady()或者output.isReady()我假設(shè)它會(huì)阻塞您的線程,直到發(fā)送方/接收方準(zhǔn)備好接收更多消息。由于這是異步完成的,服務(wù)器本身不會(huì)被阻塞并且可以處理其他請(qǐng)求。我從來沒有用過這個(gè),所以我不是專家。


當(dāng)我說發(fā)送方/接收方將就塊大小達(dá)成某種隱式協(xié)議時(shí),這意味著如果接收方能夠接受 1024 字節(jié)的塊,那么您將在為真時(shí)寫入該數(shù)量output.isReady。您必須通過閱讀文檔來了解這一點(diǎn),而 api 中沒有關(guān)于它的內(nèi)容。否則你可以寫單個(gè)字節(jié),但 oracle 的示例使用 1024 字節(jié)塊。1024 字節(jié)塊是流式 I/O 的相當(dāng)標(biāo)準(zhǔn)的塊大小。上面的示例必須擴(kuò)展為在while循環(huán)中寫入字節(jié),就像在 oracle 示例中顯示的那樣。這是留給讀者的練習(xí)。


Project reactor 和 Spring Webflux 的概念backpressure可能會(huì)更仔細(xì)地解決這個(gè)問題。那將是一個(gè)單獨(dú)的問題,我沒有仔細(xì)研究發(fā)送者和接收者是如何結(jié)合的(反之亦然)。


查看完整回答
反對(duì) 回復(fù) 2023-03-02
?
皈依舞

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

Servlet 3.0 - 解耦容器線程和處理線程。返回 DeferredResult 或 CompletableFuture。所以控制器處理可以在與服務(wù)器請(qǐng)求處理線程不同的線程中。服務(wù)器線程池可以自由處理更多傳入請(qǐng)求。

但是,IO 仍然處于阻塞狀態(tài)。讀取和寫入輸入和輸出流(接收和發(fā)送對(duì)慢速客戶端的響應(yīng))。

Servlet 3.1 - 一路非阻塞,包括 IO。直接在 Spring 上使用 Servlet 3.1 意味著你必須使用ReadListenerWriteListener接口,太麻煩了。此外,您必須避免使用同步和阻塞的 Servlet API,例如 Servlet 和 Filter。使用 Spring Webflux,它使用 Reactive Streams API 并支持 Servlet 3.1。


查看完整回答
反對(duì) 回復(fù) 2023-03-02
?
慕村225694

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

如果您正在尋找 Spring/Servlet 3.1 非阻塞 HTTP API 聲明的示例,請(qǐng)嘗試以下操作:


@GetMapping(value = "/asyncNonBlockingRequestProcessing")

public CompletableFuture<String> asyncNonBlockingRequestProcessing(){

        ListenableFuture<String> listenableFuture = getRequest.execute(new AsyncCompletionHandler<String>() {

            @Override

            public String onCompleted(Response response) throws Exception {

                logger.debug("Async Non Blocking Request processing completed");

                return "Async Non blocking...";

             }

        });

        return listenableFuture.toCompletableFuture();

}

需要在 Servlet 容器級(jí)別支持 Spring Web 5.0+ 和 Servlet 3.1(Tomcat 8.5+、Jetty 9.4+、WildFly 10+)


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

添加回答

舉報(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)