|
|
|
Servlet 3.1 и timeout
|
|||
|---|---|---|---|
|
#18+
Все привет По форуму и в интернетах не нашел, если плохо искал, дайте ссылки Следующая проблема. используются servlet 3.1 на сервере tomcat. необходимо ограничить максимальное время выполнение запроса, например в 500мс. если запрос не успели за это время обработать, то слать стандартный ответ. Подскажите как это правильно реализовать. есть у меня несколько мыслей. но пока все попахивает костылями )) может спецификация предлагает какое-то стандартное решения для этого? пример использования servlet (стандартный) Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2016, 12:14 |
|
||
|
Servlet 3.1 и timeout
|
|||
|---|---|---|---|
|
#18+
Как вариант - Запрос приходит в сервлет, там тупо разбираете параметры и запускаете асинхронную обработку в неком Future, вызываете блокирующий future.get(timeout), если результата нет - то стандартный ответ, если есть - то выплевываем его ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2016, 12:39 |
|
||
|
Servlet 3.1 и timeout
|
|||
|---|---|---|---|
|
#18+
Tivakможет спецификация предлагает какое-то стандартное решения для этого? нужно в паре решать с клиентом. Он ведь тоже может одной строкой)) Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2016, 12:47 |
|
||
|
Servlet 3.1 и timeout
|
|||
|---|---|---|---|
|
#18+
Tivakесли запрос не успели за это время обработать, то слать стандартный ответ. может сразу асинхронный ответ? Чтоб не ждал? Или это теория для школьников? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2016, 12:49 |
|
||
|
Servlet 3.1 и timeout
|
|||
|---|---|---|---|
|
#18+
забыл никКак вариант - Запрос приходит в сервлет, там тупо разбираете параметры и запускаете асинхронную обработку в неком Future, вызываете блокирующий future.get(timeout), если результата нет - то стандартный ответ, если есть - то выплевываем его Это получается отдельный пул потоков для обработки + блокировка текущего потока. Не кажется это избыточным? Petro123Tivakможет спецификация предлагает какое-то стандартное решения для этого? нужно в паре решать с клиентом. Он ведь тоже может одной строкой)) Код: java 1. У нас нет доступа к клиенту. но мы точно знаем, что ответ, который придет позже 500 мс не имеет смысла. поэтому коннект можно спокойно закрывать со стандартным ответом. Petro123Tivakесли запрос не успели за это время обработать, то слать стандартный ответ. может сразу асинхронный ответ? Чтоб не ждал? Или это теория для школьников? Вот этого я не понял. а про школьников как-то пристыдило немного ((( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2016, 13:07 |
|
||
|
Servlet 3.1 и timeout
|
|||
|---|---|---|---|
|
#18+
TivakУ нас нет доступа к клиенту. но мы точно знаем, что ответ, который придет позже 500 мс не имеет смысла. поэтому коннект можно спокойно закрывать со стандартным ответом. просто согласовать это с клиентом. Т.к. вы просто сделает двойную работу. "Не имеет смысла" - это БЛ. А бизнес логику надо согласовать с клиентом. TivakВот этого я не понял. сначала расскажите про Не имеет смвсла после 0,5 сек. TivakНе кажется это избыточным? можно сделать в фильтре. Там где вызывается сам сервлет.Т.е. перед ним. навешаете на любой сервлет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2016, 13:17 |
|
||
|
Servlet 3.1 и timeout
|
|||
|---|---|---|---|
|
#18+
Petro123можно сделать в фильтре. Там где вызывается сам сервлет.Т.е. перед ним. навешаете на любой сервлет. Чем это поможет? Ответ нужен через 500 мс, успела выполниться логика - судесно, нет - слать стандартную ошибку, фильтр тут не при чем ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2016, 13:21 |
|
||
|
Servlet 3.1 и timeout
|
|||
|---|---|---|---|
|
#18+
TivakЭто получается отдельный пул потоков для обработки + блокировка текущего потока. Не кажется это избыточным? Тут палка о двух концах. Можно сделать либо точно 500ms, либо в один поток. Но с одним потоком у вас нет шансов выдать точно 500ms, потому что за пределами 500ms - нужно распараллеливать. Один поток возвращает отклик, другой доводит запрос до ближайшей точки выхода. Хотя это можно пропробовать оптимизировать, фоновую задачу вы выполняете тем же потоком что обработал запрос, а вот отклик возвращаете новым потоком только если не успели обработать запрос. Подозреваю что на асинхронных сервлетах можно это провернуть. Но тут много вопросов уточнять надо. Что именно в эти 500ms происходит? Может у вас там блокирующая работа с БД, которую можно прервать. Тогда можно и в один поток решить, если 500ms не очень строгое требование. Ещё меня в приципе смущает желание работать с сервлетами при таких своеобразных требованиях. Может работать с более низкоуровнывым API HTTP сервера? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2016, 13:28 |
|
||
|
Servlet 3.1 и timeout
|
|||
|---|---|---|---|
|
#18+
Petro123, согласовать с клиентом таймауты запроса не всегда возможно. да и странное это решение. клиентов может быть очень много и мы не имеем доступ ко всем клиентам. про 500 мс. очень простой пример - курс на валютном рынке. если мы отдадим цену позже чем через 500 мс, то эта цена может быть уже не актуальной и лучше в этом случае сказать клиенту "извини", чем вводить в заблуждение ответом через 2-3-4 секунды. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2016, 13:30 |
|
||
|
Servlet 3.1 и timeout
|
|||
|---|---|---|---|
|
#18+
Tivakпро 500 мс. очень простой пример - курс на валютном рынке. если мы отдадим цену позже чем через 500 мс, то эта цена может быть уже не актуальной и лучше в этом случае сказать клиенту "извини", чем вводить в заблуждение ответом через 2-3-4 секунды. пример хороший. Но почему тогда даты-время нет в ответе курса? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2016, 13:34 |
|
||
|
Servlet 3.1 и timeout
|
|||
|---|---|---|---|
|
#18+
забыл никЧем это поможет? Ответ нужен через 500 мс, т.е. Код: java 1. должен только 500мс. //Конечно можно спустить таймер и ответ пониже к БД или туда где тормозит. Пусть сам решает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2016, 13:44 |
|
||
|
Servlet 3.1 и timeout
|
|||
|---|---|---|---|
|
#18+
BlazkowiczХотя это можно пропробовать оптимизировать, фоновую задачу вы выполняете тем же потоком что обработал запрос, а вот отклик возвращаете новым потоком только если не успели обработать запрос. Подозреваю что на асинхронных сервлетах можно это провернуть. Вот что-то такое и хочется сделать. в servlet 3.0 есть механиз timeout и перехват событие при помощи AsyncListener. этот механиз конечно ничего не гарантирует, но делает то что хочется. в servlet 3.1 я ничего похожего не нашел. придумал пока только отслеживать время от вызова doPost, и если за 500мс onAllDataRead не завершил работу, то передавать в outputStream стандартный ответ и закрывать asyncContext. Это позволяет нам выполнить до конца onAllDataRead и залогировать результат (для анализа) при этом ответ клиенту мы пошлем не позже 500мс (не или примерно 500 мс) BlazkowiczНо тут много вопросов уточнять надо. Что именно в эти 500ms происходит? Может у вас там блокирующая работа с БД, которую можно прервать. Тогда можно и в один поток решить, если 500ms не очень строгое требование. Не будем вдаваться в подробности и пытаться полностью использовать возможности NIO. Произойти может все что угодно, поэтому считаем, что обработка запроса без блокирующих вызовов. BlazkowiczЕщё меня в приципе смущает желание работать с сервлетами при таких своеобразных требованиях. Может работать с более низкоуровнывым API HTTP сервера? почему же? сейчас нет необходимости лезть в недра. сервлеты в данном сучае предоставляют все что необходимо для работы. нужно только понять как править сделать этот таймаут )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2016, 13:52 |
|
||
|
Servlet 3.1 и timeout
|
|||
|---|---|---|---|
|
#18+
Tivakв servlet 3.1 я ничего похожего не нашел вмешиваться в работу контейнера типа: Код: java 1. очень странная задача (от программистов) IMHO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2016, 13:56 |
|
||
|
Servlet 3.1 и timeout
|
|||
|---|---|---|---|
|
#18+
Petro123забыл никЧем это поможет? Ответ нужен через 500 мс, т.е. Код: java 1. должен только 500мс. //Конечно можно спустить таймер и ответ пониже к БД или туда где тормозит. Пусть сам решает. Я подумаю, но в целом решение решение похоже на то что я выше предложил, только на другом уровне. и этот уровень нам не позволит корректировать время отклика в зависимости от содержимого запрос. пока это не требуется, но есть вероятность, что потребуется ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2016, 14:01 |
|
||
|
Servlet 3.1 и timeout
|
|||
|---|---|---|---|
|
#18+
Petro123Tivakв servlet 3.1 я ничего похожего не нашел вмешиваться в работу контейнера типа: Код: java 1. очень странная задача (от программистов) IMHO Вот и не хочется туда вмешиваться. хочется решить все это на уровне сервлета, причем красиво и правильно ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2016, 14:03 |
|
||
|
Servlet 3.1 и timeout
|
|||
|---|---|---|---|
|
#18+
Tivakв servlet 3.1 я ничего похожего не нашел. придумал пока только отслеживать время от вызова doPost, и если за 500мс onAllDataRead не завершил работу, то передавать в outputStream стандартный ответ и закрывать asyncContext. посмотрел доку: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. тут обратная задача. Нужно вывести в ответ Долгую задачу. А у тебя ответ не интересует). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2016, 14:06 |
|
||
|
Servlet 3.1 и timeout
|
|||
|---|---|---|---|
|
#18+
Tivakпричем красиво красиво выше сказано: BlazkowiczЕщё меня в приципе смущает желание работать с сервлетами при таких своеобразных требованиях. Может работать с более низкоуровнывым API HTTP сервера? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2016, 14:07 |
|
||
|
Servlet 3.1 и timeout
|
|||
|---|---|---|---|
|
#18+
Tivak, Да, в приципе и на синхронных сервлетах должно работать. Идея такая: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Надо только немного упростить и продумать синхронизацию. Можно ещё CompletableFuture притянуть за уши. Там вроде, что-то уже есть для реализации таймаута. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2016, 14:18 |
|
||
|
Servlet 3.1 и timeout
|
|||
|---|---|---|---|
|
#18+
Petro123Tivakв servlet 3.1 я ничего похожего не нашел. придумал пока только отслеживать время от вызова doPost, и если за 500мс onAllDataRead не завершил работу, то передавать в outputStream стандартный ответ и закрывать asyncContext. посмотрел доку: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. тут обратная задача. Нужно вывести в ответ Долгую задачу. А у тебя ответ не интересует). Пока не понял о чем ты ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2016, 14:23 |
|
||
|
Servlet 3.1 и timeout
|
|||
|---|---|---|---|
|
#18+
BlazkowiczTivak, Да, в приципе и на синхронных сервлетах должно работать. Идея такая: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Надо только немного упростить и продумать синхронизацию. Можно ещё CompletableFuture притянуть за уши. Там вроде, что-то уже есть для реализации таймаута. ну да, примерно об этом я и говорил, только тут видимо sf.cancel(false) лишнее. Похоже так и придется, раз в спеке 3.1 отказались от таймаутов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2016, 14:27 |
|
||
|
Servlet 3.1 и timeout
|
|||
|---|---|---|---|
|
#18+
Tivak, А AsyncContext.setTimeout() никак вопрос не решает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2016, 14:27 |
|
||
|
Servlet 3.1 и timeout
|
|||
|---|---|---|---|
|
#18+
BlazkowiczTivak, А AsyncContext.setTimeout() никак вопрос не решает? Я тестировал и этот момент меня больше всего бесит в этом. этот метод от спеки 3.0 и при использовании 3.1 он не работает, так же как и addListener неужели они не могли эти 2 спеки полностью разнести, чтобы они не пересекались ?!?!?! извините, крик души... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2016, 14:36 |
|
||
|
Servlet 3.1 и timeout
|
|||
|---|---|---|---|
|
#18+
Tivak, А точно ли в спеке дело? Может контейнер пошаливает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2016, 14:38 |
|
||
|
Servlet 3.1 и timeout
|
|||
|---|---|---|---|
|
#18+
TivakBlazkowiczTivak, А AsyncContext.setTimeout() никак вопрос не решает? Я тестировал и этот момент меня больше всего бесит в этом. этот метод от спеки 3.0 и при использовании 3.1 он не работает, так же как и addListener неужели они не могли эти 2 спеки полностью разнести, чтобы они не пересекались ?!?!?! извините, крик души... setTimeout и addListener работают при вызове asyncContext.start ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2016, 14:38 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39349108&tid=2123467]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
195ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
81ms |
get tp. blocked users: |
2ms |
| others: | 231ms |
| total: | 559ms |

| 0 / 0 |
