如何在春季 mvc 中使用 servlet 3.1?

2022-09-02 22:41:46

有2种不同的功能可用:

  1. Servlet 3.0 允许在与容器线程不同的线程中处理请求。

  2. servlet 3.1 允许在不阻塞读/写线程的情况下读/写套接字

互联网上有很多关于 servlet 3.0 功能的例子。我们可以在春天很容易地使用它。我们只需要返回或DefferedResultCompletableFuture

但是我找不到春天使用servlet 3.1的例子。据我所知,我们必须注册并在里面做圆顶脏活。但我找不到那个听众的例子。我认为这并不容易。WriteListenerReadListener

你能提供春季 servlet 3.1 功能的例子,并解释一下 Listener 实现吗?


答案 1

对于 servlet 3.1,您可以使用反应式流桥接来支持非阻塞 I/O

Servlet 3.1+ 容器

要作为 WAR 部署到任何 Servlet 3.1+ 容器,您可以在 WAR 中扩展并包含 {api-spring-framework}/web/server/adapter/AbstractReactiveWebInitializer.html[AbstractReactiveWebInitializer]。该类使用ServletHttpHandlerAdapter包装HttpHandler,并将其注册为Servlet。

因此,您应该扩展 AbstractReactiveWebInitializer,它正在添加异步支持

registration.setAsyncSupported(true);

以及ServletHttpHandlerAdapter中的支持

AsyncContext asyncContext = request.startAsync();

答案 2

如果你正在寻找Spring/Servlet 3.1非阻塞HTTP API声明的示例,请尝试以下操作:

@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();
}

需要 Spring Web 5.0+ 和 Servlet 3.1 在 Servlet Container 级别(Tomcat 8.5+、Jetty 9.4+、WildFly 10+)的支持


推荐