java - Jersey REST 2.0 异步请求在底层容器中失败(Tomcat 7)

标签 java rest maven tomcat jersey-2.0

我很好奇是否有人能够解决这个问题?我已经做了一些搜索,但它似乎仍然是 Jersey 2 异步 REST 实现的一个突出问题。 我有以下代码:

@Path("myresource")
public class MyResource {
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public void asyncGet(@Suspended final AsyncResponse asyncResponse) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                String result = veryExpensiveOperation();
                asyncResponse.resume(result);
            }
            private String veryExpensiveOperation() {
                return "got it too";
            }
        }).start();
    }
}

我使用的是 Servlet 3.0,所以没有 web.xml ... Tomcat 版本是 7.0.54,我在 server.xml 中添加了以下行

<Connector connectionTimeout="20000" port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8443"/>

这是一个 Jersey Maven 项目,所以我在下面发表了评论

<artifactId>jersey-container-servlet</artifactId>

并注释掉

<artifactId>jersey-container-servlet-core</artifactId>

我不确定我还能在这里做什么,这是堆栈跟踪

javax.servlet.ServletException: javax.ws.rs.ProcessingException: Attempt to suspend a connection of an asynchronous request failed in the underlying container.
    org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:391)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:381)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:344)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:221)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)


root cause 

javax.ws.rs.ProcessingException: Attempt to suspend a connection of an asynchronous request failed in the underlying container.
    org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:312)
    org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:103)
    org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:271)
    org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
    org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
    org.glassfish.jersey.internal.Errors.process(Errors.java:315)
    org.glassfish.jersey.internal.Errors.process(Errors.java:297)
    org.glassfish.jersey.internal.Errors.process(Errors.java:267)
    org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:297)
    org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:254)
    org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1028)
    org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:372)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:381)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:344)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:221)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

有什么想法吗???

最佳答案

确保您使用的是最新版本,截至发布之日,请使用 v2.13

在您的 web.xml 中,确保将以下内容添加到 servlet 标记中

<async-supported>true</async-supported>

关于java - Jersey REST 2.0 异步请求在底层容器中失败(Tomcat 7),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25828425/

相关文章:

java - java中 'new'的语法

java - 如何在通用静态方法中获取类型的字符串表示形式

java - Java中是否可以在没有新文件实例的情况下删除文件?

mysql - Spring Boot BCryptPasswordEncoder 编码的密码看起来不像 BCrypt

rest - Jenkins : execute HTTP request without 3rd party libraries 的 Groovy 脚本

java - AspectJ 和 Maven

java - 使用 maven 与 ant : Differences 编译相同的枚举

java - 如何使用Vert.x将Blob插入到oracle数据库11g中?

java - Web 服务操作中的变量未更新

java - 如何使用 maven 和 jboss-as-maven-plugin 运行 JBoss 6.2 EAP 服务器?