|
|
|
Отправка асинхронных http запросов
|
|||
|---|---|---|---|
|
#18+
Подскажите, какой вариант вы бы предпочли использовать (или уже используете) и почему, в случае потребности в отправке как синхронных, так и асинхронных запросов (с сервера на сервер, Java 6): 1. HttpURLConnection + java.util.concurrent 2. Apache Http Components (HttpClient / HttpAsyncClient) https://hc.apache.org/index.html 3. https://github.com/AsyncHttpClient/async-http-client ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2016, 16:01 |
|
||
|
Отправка асинхронных http запросов
|
|||
|---|---|---|---|
|
#18+
just_vladimir, Всё сильно зависит от требований. HttpURLConnection + Нет надобности тащить дополнительных либ. Для коробочного продукта это важно. Для сервера - не шибко. - Сильная трудоёмкость составления не примитивных HTTP запросов. POST, мультиформ и т.п. - Обычный блокирующий IO В чем принципиальная разница между Apache и Ning я не знаю. И гугл тоже не шибко чего толкового пишет на этот счет. Вроде оба должны через NIO работать. Во всех трех вариантах для сервера надо смотреть как либа работает с потоками. Если не использовать JEE API для асинхронных задач, то можно выхватить PermGen/MetaSpace leak на ExecutorServices, даже если использовать shutdown(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2016, 16:13 |
|
||
|
Отправка асинхронных http запросов
|
|||
|---|---|---|---|
|
#18+
BlazkowiczВо всех трех вариантах для сервера надо смотреть как либа работает с потоками. Если не использовать JEE API для асинхронных задач, то можно выхватить PermGen/MetaSpace leak на ExecutorServices, даже если использовать shutdown(). Можно подробнее с этого места? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2016, 17:16 |
|
||
|
Отправка асинхронных http запросов
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevМожно подробнее с этого места? http://rsdn.ru/forum/java/5974292.1 Мы по-моему уже с тобой спорили на этот счет. Когда внутри JEE модуля создаётся новый поток, то у него ThreadContextClassloader ссылается на ClassLoader JEE модуля. Через какие ещё сопли это утекает дальше я не разбирался. Но утекает. Вот тут чуть более детально: http://stackoverflow.com/a/6540248 Это одна из причин почему JEE спека требует не создавать новых потоков, а использовать API контейнера или JEE чтобы потоки создавал сам контейнер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2016, 17:33 |
|
||
|
Отправка асинхронных http запросов
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, про треды интересно, я запускаю без линих заморочек, вроде OOM по этому поводу не выхватывал, хотя у меня есть гарантированный рестарт раз в неделю, надо будет по тестировать. По сабжевой теме еще вопросик, для случая, если запросы синхронные (от пользователя с клиента пришел http запрос, в процессе его обработки помимо всего прочего нужно сходить с http запросом еще на другой бэкэнд и уже по итогу сформировать ответ пользователю), то никакого профита от неблокирующего IO я ведь не получу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2016, 17:52 |
|
||
|
Отправка асинхронных http запросов
|
|||
|---|---|---|---|
|
#18+
just_vladimirпро треды интересно, я запускаю без линих заморочек, вроде OOM по этому поводу не выхватывал, хотя у меня есть гарантированный рестарт раз в неделю, надо будет по тестировать. Утечку, обычно, видно только если у вас релизы деплоятся на много чаще, чем перезагружается сервер. just_vladimirПо сабжевой теме еще вопросик, для случая, если запросы синхронные (от пользователя с клиента пришел http запрос, в процессе его обработки помимо всего прочего нужно сходить с http запросом еще на другой бэкэнд и уже по итогу сформировать ответ пользователю), то никакого профита от неблокирующего IO я ведь не получу? Ну, да. Никакого профита особого не будет. Не знаю, что там в HTTP, но в NIO Socket API можно блокировку просто флагом регулировать. В результате, один и тот же код можно использовать в разных сценариях, как синхронных так и асинхронных. Но это всё больше "в теории". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2016, 18:22 |
|
||
|
Отправка асинхронных http запросов
|
|||
|---|---|---|---|
|
#18+
BlazkowiczМы по-моему уже с тобой спорили на этот счет. Вряд ли спорили ))) Т.к. эту багу знаю, но это больше не Subj, а достаточно известные баги Tomcat'а. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2016, 19:05 |
|
||
|
Отправка асинхронных http запросов
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevВряд ли спорили ))) Угу. Не с тобой: 18216361 Leonid KudryavtsevТ.к. эту багу знаю, но это больше не Subj, а достаточно известные баги Tomcat'а. Возможно. Буду благодарен за ссылку. Но это никак не отменяет того факта что JEE спека настоятельно не рекомендует порождать потоки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2016, 19:37 |
|
||
|
Отправка асинхронных http запросов
|
|||
|---|---|---|---|
|
#18+
BlazkowiczНо это никак не отменяет того факта что JEE спека настоятельно не рекомендует порождать потоки. А какие еще потенциальные проблемы могут возникать, из-за того, что я, например, руками создаю потоки? Ну кроме вышеописанного и того, что мой EE сервер чувствует себя неполноценным от того, что я что то делаю, что не находится у него под чутким контролем. А то я по наивняку создавал и запускал треды и вроде бы все было более менее хорошо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2016, 17:43 |
|
||
|
Отправка асинхронных http запросов
|
|||
|---|---|---|---|
|
#18+
just_vladimirА какие еще потенциальные проблемы могут возникать, из-за того, что я, например, руками создаю потоки? Ну кроме вышеописанного и того, что мой EE сервер чувствует себя неполноценным от того, что я что то делаю, что не находится у него под чутким контролем. А то я по наивняку создавал и запускал треды и вроде бы все было более менее хорошо. Ну, на сколько я понимаю, ты просто в новых потоках должен быть аккуратнее при использовании JEE API. Контейнер может в ThreadLocal держать любой контекст, и в потоках, которые ты создаешь, этот контекст, понятное дело, не виден. Но так как у нас pure JEE приложения почти никто не пишет, то эта проблема и не актуальна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2016, 17:50 |
|
||
|
Отправка асинхронных http запросов
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, один чел говорит чтобы создать leak: start a thread in a servlet container and don't return from it's run method непонятно... если так, то в веб-приложении такой пример это leak..? ерунда какая-то... Код: java 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2016, 21:04 |
|
||
|
Отправка асинхронных http запросов
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2016, 01:33 |
|
||
|
Отправка асинхронных http запросов
|
|||
|---|---|---|---|
|
#18+
grasoff.net http://square.github.io/okhttp/ Спасибо за вариант, буду иметь в виду на будущее, на текущий момент реализовал самый простой вариант через HttpURLConnection. А Вы у себя использовали эту библиотечку? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2016, 06:36 |
|
||
|
Отправка асинхронных http запросов
|
|||
|---|---|---|---|
|
#18+
rema174один чел говорит чтобы создать leak: start a thread in a servlet container and don't return from it's run method непонятно... Живой поток это GC Root. Это вообще leak, а не PermGen leak. rema174если так, то в веб-приложении такой пример это leak..? ерунда какая-то... Код: java 1. 2. 3. 4. 5. 6. 7. У тебя тут есть возврат из run(). Добавь while(true) и будет утечка. Но! Как тут пишут, только в Tomcat, new Thread().start() приводит к утечке в PermGen. Это другая утечка вообще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2016, 08:38 |
|
||
|
Отправка асинхронных http запросов
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, давайте поподробнее. Утечка PermGen на Thread.start или при ре-деплои приложения? 1) Первое - критично, т.к. будет утечка на работающем сервере. 2) Второе - значительно менее критично, просто значит, что при редиплое приложения нужно обязательно перегружать томкат. Неприятно, но если об этом помнить, не смертельно. Утечка при редиплое видел и без всяких Thread в своем коде (был ли Thread в коде библиотек - не очень понятно). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2016, 10:32 |
|
||
|
Отправка асинхронных http запросов
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevBlazkowicz, давайте поподробнее. Утечка PermGen на Thread.start или при ре-деплои приложения? Утечка PermGen на Thread.start(). При чем тут редеплой вообще? Редеплой просто создаёт ещё один ClassLoader, а старый никуда не дивается, потому что ссылка на него засела где-то во внутренностях Java. Leonid Kudryavtsev1) Первое - критично, т.к. будет утечка на работающем сервере. Я вообще не врубаюсь о чем ты. Речь про ссылки, которые не дают GC собрать WebAppClassloader. В этом и есть суть утечки в PermGen. Leonid Kudryavtsev2) Второе - значительно менее критично, просто значит, что при редиплое приложения нужно обязательно перегружать томкат. Неприятно, но если об этом помнить, не смертельно. Утечка при редиплое видел и без всяких Thread в своем коде (был ли Thread в коде библиотек - не очень понятно). Не смертельно, но не приятно. У меня нет никакого желания перезагружать публичный сервис. 24x7 вполне себе объяснимое желание. При этом апдейты я переодически накатываю по несколько раз на день. Когда у тебя внутрикорпоративная система и ночью все пользователи спят - это одно. А когда у тебя публичный сервис и ты понятия не имеешь когда все перестанут его использовать, это другое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2016, 10:51 |
|
||
|
Отправка асинхронных http запросов
|
|||
|---|---|---|---|
|
#18+
BlazkowiczНо! Как тут пишут, только в Tomcat, new Thread().start() приводит к утечке в PermGen. Это другая утечка вообще. не вполне понятно про что речь - допустим нужно запустить тред из сервлета, который закончится после того, как респонс будет отправлен. как тогда его запускать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2016, 11:41 |
|
||
|
Отправка асинхронных http запросов
|
|||
|---|---|---|---|
|
#18+
rema174не вполне понятно про что речь - допустим нужно запустить тред из сервлета, который закончится после того, как респонс будет отправлен. как тогда его запускать? Куча способов: http://docs.oracle.com/javaee/1.4/api/javax/resource/spi/work/WorkManager.html https://docs.oracle.com/javaee/7/tutorial/servlets012.htm http://docs.oracle.com/javaee/6/tutorial/doc/gkkqg.html http://docs.oracle.com/javaee/6/tutorial/doc/bncdq.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2016, 12:06 |
|
||
|
Отправка асинхронных http запросов
|
|||
|---|---|---|---|
|
#18+
BlazkowiczLeonid KudryavtsevBlazkowicz, давайте поподробнее. Утечка PermGen на Thread.start или при ре-деплои приложения? Утечка PermGen на Thread.start(). При чем тут редеплой вообще? Редеплой просто создаёт ещё один ClassLoader, а старый никуда не дивается, потому что ссылка на него засела где-то во внутренностях Java. При том, что Thread.start к PermGen вообще ни каким боком ==> т.ч. там утечки быть не может. А resouce leak (в том числе и на классы/class loader) можно сделать где угодно. Утечки происходит при редиплое, т.к. resource leak в прикладном коде не позволяет корректно (as expected админом-пользователем) отработать редиплою. И про проблемы с ClassLoader'ом пишут только для Tomcat. Другие сервера, как-то умудряются более корректно "прибить" и "кильнуть" залипшие приложения. Вообще, в этом плане, Java и Java application server'а вещь достаточно бредовая и глючная. Т.к. heap совместно используется всеми приложениями (в данном случае разными версиями одного приложения) и resource leak сказывается на всех. Т.ч. с безопасностью и изолированностью проблемы офигенные. IMHO & AFAIK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2016, 12:35 |
|
||
|
Отправка асинхронных http запросов
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevПри том, что Thread.start к PermGen вообще ни каким боком ==> т.ч. там утечки быть не может. А resouce leak (в том числе и на классы/class loader) можно сделать где угодно. Мля, да что же за херню вы тут пишете? Сколько раз можно объяснять-то? Thread.start() регистрирует ссылку на свой ContextClassLoader в недрах Java за пределами веб-приложения. Это и приводит к невозможности удалить ClassLoader и все загруженные им классы из кучи. Что и является утечкой в PermGen, в котором все эти классы и живут. Leonid KudryavtsevУтечки происходит при редиплое, т.к. resource leak в прикладном коде не позволяет корректно (as expected админом-пользователем) отработать редиплою. Редеплой это то на что утечка влияет. И то что приводит к росту потребления памяти. Сама же по себе утечка происходит при Thread.start(). Leonid KudryavtsevИ про проблемы с ClassLoader'ом пишут только для Tomcat. Другие сервера, как-то умудряются более корректно "прибить" и "кильнуть" залипшие приложения. Ссылку на багу в Tomcat связанную с Thread.start(), я тут пока не увидел. Так что мало ли кто где чего пишет. Все контейнеры изолирующие модули через иерархию ClassLoader-ов имеют этот косяк. Leonid KudryavtsevВообще, в этом плане, Java и Java application server'а вещь достаточно бредовая и глючная. Т.к. heap совместно используется всеми приложениями (в данном случае разными версиями одного приложения) и resource leak сказывается на всех. Т.ч. с безопасностью и изолированностью проблемы офигенные. Правильно. Поэтому standalone сервера и микро-сервисы теперь в тренде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2016, 12:46 |
|
||
|
Отправка асинхронных http запросов
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevИ про проблемы с ClassLoader'ом пишут только для Tomcat. Вот тебе про WebSphere тоже самое http://wasdynacache.blogspot.com/2012/01/websphere-classloader-memory-leak.html Там, кстати, интересный совет исправить проблему через doPrivileged() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2016, 12:59 |
|
||
|
Отправка асинхронных http запросов
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev, Честно говоря я не понимаю, какие у java или JEE7 App серверов, такие уж офигенные проблемы. Потоки можно создавать, используя ManagedExecutorService. А что касается безопасности, то причем здесь Java? С этим не все в порядке даже в ЦРУ и АНБ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2016, 14:20 |
|
||
|
Отправка асинхронных http запросов
|
|||
|---|---|---|---|
|
#18+
Valery ShiskinЧестно говоря я не понимаю, какие у java или JEE7 App серверов, такие уж офигенные проблемы. Потоки можно создавать, используя ManagedExecutorService. А что касается безопасности, то причем здесь Java? С этим не все в порядке даже в ЦРУ и АНБ. Ай, спасибо. Так как JEE не исповедую, то совсем забыл что там ввели соответствующий пакет. http://docs.oracle.com/javaee/7/api/javax/enterprise/concurrent/package-summary.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2016, 14:34 |
|
||
|
Отправка асинхронных http запросов
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Но ведь Spring исповедуете. И сервлеты тоже. Или Web (или WAR) Profile не относится к JEE ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2016, 14:50 |
|
||
|
Отправка асинхронных http запросов
|
|||
|---|---|---|---|
|
#18+
Valery ShiskinНо ведь Spring исповедуете. Spring не JEE. Valery ShiskinИ сервлеты тоже. Уже нет. Попробовал 3.0 - ну их нафиг. Valery ShiskinИли Web (или WAR) Profile не относится к JEE ? Когда приложение сам себе контейнер, то это уже далеко от JEE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2016, 15:04 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39156462&tid=2124409]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
58ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
83ms |
get tp. blocked users: |
2ms |
| others: | 212ms |
| total: | 404ms |

| 0 / 0 |
