2014-11-18 3 views
0

Я разрабатываю серверный элемент управления, чтобы избежать дублирования обработки одного и того же типа запроса на стороне сервера Java. Основной целью является то, что пользователь может наводнить мой серверный процессор, просто нажимая на запрос жесткой обработки повторно. Я разрабатываю сервлет-фильтр для управления потоком запросов, но я могу просто «отменить» второй запрос, возвратив статус HTTP 204, если есть предыдущий запрос, который все еще обрабатывается. С точки зрения сервера, все в порядке. Но веб-браузер будет обрабатывать только этот «прерванный» запрос, а не первый.Можно обменять HTTP-запросы и ответы на среду Java Servlet?

Browser sends request "A" 
Server starts to process the request "A" 
Browser sends request "B" 
Server aborts request "B" (HTTP 204) 
Browser receives response "B" (Aborted) 
Server finishes the request "A" 
Browser does not displays/receives the request "A" 

Итак, наконец-то вопрос. Возможно изменение ответа на запрос? Таким образом, я мог избежать дублирования обработки на стороне сервера, и браузер мог отображать запрошенный контент.

Можете ли вы предложить другой подход для решения этой проблемы?

Browser sends request "A" 
Server start processing request "A" 
Browser sends request "B" 
Server "holds" request "B" 
Server finishes the request "A" 
Server forwards the request "B" to the the response "A" 
Server aborts the request "A" (http 204) 
Browser displays/receives the request "B" with the response "A" content/headers 

Заранее спасибо.

+0

Я бы использовал атмосферу или какую-либо другую структуру websocket. – eduyayo

+0

Здравствуйте, @eduyayo, я согласен с вами, но я ищу подход, который не подразумевает большой редизайн существующего кода. –

+0

mh ... тогда вы должны держать «живым» в сеансе рабочий поток и продолжать кормить его. Аналогичная вещь выполняется в struts2 http://struts.apache.org/release/2.0.x/struts2- core/apidocs/org/apache/struts2/interceptor/ExecuteAndWaitInterceptor.html, но вам нужно расширить логику, чтобы продолжать кормить, когда cient снова звонит, чтобы проверить, выполнено ли это – eduyayo

ответ

0

Я сделаю кэш на основе этого ответа переполнения стека @BalusC. How to read and copy the HTTP servlet response output stream content for logging. Я не могу обменять ответ другого запроса, но я могу кэшировать предыдущий ответ на короткое время. Последующие запросы могут получать кешированный ответ, таким образом, это предотвратит наводнение процессора. Поблагодарите @eduyayo за предложения.

+0

Просто для упоминания, этот подход неверен. Когда я дважды нажимаю ссылку на запрос, браузер отменяет передачу первого, поэтому мой кеш остается незавершенным для обслуживания второго запроса: / –

0

Вместо использования этого подхода вы можете использовать micro-caching, то есть кешировать контент только с небольшими длительностями, например 1 с, 10 с. Таким образом, вместо http204 вы возвращаете кешированный контент. Ваши пользователи будут более довольны этим подходом. Вы можете ваш код сервлета, чтобы обработать только один запрос в вашем сервлет. Но имейте в виду, что synchronized servlet is not a good design.

+0

Здравствуйте @Atilla. Как вы думаете, я могу кэшировать содержимое ответа в области сеанса http? Я не хочу, чтобы пользователь видел содержимое, кэшированное другим пользователем. –