Как обновить фильтры для поддержки асинхронного сервлета Servlet 3.0

У меня есть сервлет, который используется для извлечения данных из многих сторонних точек данных REST, интеграции всех данных и представления данных в формате HTML. У меня также есть фильтр со следующим потоком:

  1. Создайте запись о событии, когда запрос попадет в фильтр, и добавьте в запрос объект eventrecord.
  2. выполнить chain.doFilter, который позволяет сервлету добавлять дополнительные сведения к записи о событии.
  3. на обратном пути к браузеру filter получает объект eventrecord и регистрирует его.

Теперь, если я использую асинхронный сервлет с использованием AsyncContext context = request.getAsyncContext();, который будет обращаться к тем же точкам данных REST, но когда данные будут готовы, он будет записывать в поток ответов вместо ожидания ответа всех точек данных REST, как бы я переписал свой фильтр? Будет ли он прикреплен к потоку, который отвечает за сброс данных из точек данных REST, чтобы после обработки и сброса всех данных он регистрировал запись события? Есть ли какой-либо общий шаблон, который я могу изучить, чтобы понять, как такие варианты использования могут обрабатываться с помощью асинхронных сервлетов Servlet 3.0? Я использую JDK 6.0, Tomcat 7.0.


person Shamik    schedule 28.05.2012    source источник


Ответы (3)


Просто добавьте @WebFilter(urlPatterns = {"/*" }, asyncSupported = true) в web-xml для вашего фильтра.

Или добавьте <async-supported>true</async-supported>

person Tim    schedule 04.07.2012
comment
это все для обновления фильтра до асинхронного? В вопросе фильтр также будет обрабатывать ответ. не нужно менять фильтр, чтобы использовать AsyncContext? Я запутался. - person Roy Ling; 03.05.2018
comment
Это не помогает при обработке на обратном пути (см. третий пункт вопроса), ИМХО это не отвечает на вопрос. - person oberlies; 10.09.2018

Я назначил награду, так как сам не уверен, как правильно поддерживать инструментальные или диагностические фильтры (например, Фильтры показателей Codahales).

Хотя добавление <async-supported>true</async-supported> к вашим фильтрам, безусловно, заставит их работать, это может не дать ожидаемых результатов (в случае метрик все ваши запросы будут казаться очень быстрыми).

Может показаться хорошей идеей сразу получить AsyncContext в фильтре для привязки данных метрик но у различных контейнеров, по-видимому, есть проблемы с этим, и я полагаю, что такие фреймворки, как Spring, также имеют проблемы (это может быть просто моя старая версия Spring). То есть большинство фреймворков ожидают, что первая половина обработки запроса будет синхронной (возможно, я сильно ошибаюсь в этом).

Следовательно, кажется, что единственный надежный способ — интегрировать фильтры на уровне фреймворка. Например, Spring предлагает org.springframework.web.context.request.async.DeferredResultProcessingInterceptor, что несколько аналогично событиям AsyncContext.

Это несколько прискорбно, так как не все запросы могут быть обработаны веб-платформой, но опять же существует разница между обработкой первой части запроса и фактическим выполнением (то есть теперь это две метрики, которые вы, возможно, захотите отслеживать).

person Adam Gent    schedule 07.07.2016

@WebFilter Annotation была введена в Java EE 6. Она определяет различные элементы, такие как filterName, asyncSupported и servletNames и т. д. @WebFilter нельзя использовать без web.xml, поскольку @WebFilter не определяет порядок. @WebFilter уменьшает другую конфигурацию в web.xml.

@WebFilter(filterName="filterOne")
public class FilterOne implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        System.out.println("Inside filter one.");
        chain.doFilter(request, response);
    }
    @Override
    public void destroy() {
    }
} 
person Pavan    schedule 14.07.2016