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, что решает проблему.:)