【问题标题】:Jetty 9, AsyncResponse not working码头 9,AsyncResponse 不工作
【发布时间】:2014-05-17 12:35:24
【问题描述】:

我有一个 spring 应用程序,它公开了在 CXF 中实现的 REST API。我正在尝试实现使用AsyncResponseSuspended 的长轮询。如果我在 tomcat(maven 插件或独立)中运行这段代码,它就可以工作。但是,如果我使用 maven 插件 (mvn jetty:run) 在码头运行相同的代码,它会失败。 CXF 抛出 NPE。我已经对其进行了调试,发现没有为请求设置 ContinuationProvider。因此,在进一步调试中,我发现 jetty 在应用过滤器之前在内部将 Request 对象中的 AsyncSupport 布尔变量设置为 false,然后在 finally 块中再次将其设置为 true。但是过滤器链也包含 servlet,因此导致 servlet 以 AsyncSupport 为假来解释请求。

jetty maven 插件版本 9.1.3vxxxxxx 来自码头代码库的 ServletHandler.java

 @Override
    public void doFilter(ServletRequest request, ServletResponse response)
        throws IOException, ServletException
    {
        final Request baseRequest=(request instanceof Request)?((Request)request):HttpChannel.getCurrentHttpChannel().getRequest();

        // pass to next filter
        if (_filterHolder!=null)
        {
            if (LOG.isDebugEnabled())
                LOG.debug("call filter " + _filterHolder);
            Filter filter= _filterHolder.getFilter();
            if (_filterHolder.isAsyncSupported())
                filter.doFilter(request, response, _next);
            else
            {
                final boolean suspendable=baseRequest.isAsyncSupported();
                if (suspendable)
                {
                    try
                    {
                        baseRequest.setAsyncSupported(false);
                        filter.doFilter(request, response, _next);
                    }
                    finally
                    {
                        baseRequest.setAsyncSupported(true);
                    }
                }
                else
                    filter.doFilter(request, response, _next);
            }
            return;
        }

为什么过滤器链包含 servlet ? 为什么 reuest 在 doFilter 之前开始修改? 如何让它在 jetty maven 插件中工作?

【问题讨论】:

    标签: java cxf servlet-3.0 maven-jetty-plugin jetty-9


    【解决方案1】:

    发现问题。它与 Log4jServletContainerInitializer 一起为所有请求自动注册一个过滤器(Log4jServletFilter)。这里的问题在于我使用的版本。 Log4j2.0-beta-9(有问题),问题是当 Log4jServletFilter 注册时,它没有注册到 AsyncSupport (i.e async-supported true) 。所以我升级到 log4j2.0-rc1 解决了这个问题。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-19
      • 2015-07-11
      • 2016-12-20
      • 1970-01-01
      • 2015-12-27
      相关资源
      最近更新 更多