Jetty 9, AsyncResponse не работает

У меня есть весеннее приложение, которое представляет API REST, реализованный в CXF. Я пытаюсь реализовать длинный опрос, для которого я использовал AsyncResponse вместе с Suspended. Если я запускаю этот кусок кода в tomcat (плагин maven или автономный), он работает. Но если я запускаю тот же код в Jetty, используя плагин Maven (MvN Jetty: Run), он не работает. CXF бросает NPE. я отладил его и увидел, что ContinuationProvider не был установлен для запроса. Поэтому при дальнейшей отладке я обнаружил, что jetty внутренне устанавливал логическую переменную AsyncSupport в объекте Request как false перед применением фильтра и затем в блоке finally, устанавливая его снова в значение true. Но цепочка фильтров также содержит сервлет, поэтому сервлет интерпретирует запрос с помощью AsyncSupport false.

Плагин Jetty Maven версия 9.1.3vxxxxxx ServletHandler.java из базы кода Jetty

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

Почему цепочка фильтров содержит сервлет? Почему запрос начинается с изменения до doFilter? Как мне заставить его работать в плагине Jetty Maven?

1 ответ

Решение

Нашел проблему. Это было с Log4jServletContainerInitializer, который автоматически регистрирует фильтр (Log4jServletFilter) для всех запросов. Проблема здесь была с версией, которую я использовал. Log4j2.0-beta-9 (проблематично), проблема заключалась в том, что когда Log4jServletFilter был зарегистрирован, он не был зарегистрирован в AsyncSupport (то есть поддерживается async true) . Поэтому я обновляюсь до log4j2.0-rc1, что решает проблему.:)

Другие вопросы по тегам