#java #multithreading #apache #http #jakarta-ee
#java #многопоточность #apache #http #джакарта-ee
Вопрос:
Я использую apache http client (версия 3.0, потому что у нас Java 1.4 и мы не можем ее изменить) в веб-приложении. У меня есть компонент (класс), который используется для POST-запросов к серверу, и этот компонент используется на страницах JSP, то есть из разных потоков.
Итак, я создаю клиент только один раз в каком-либо методе init () этого компонента:
HttpClient client =
new HttpClient(new MultiThreadedHttpConnectionManager());
client.getHostConfiguration().setProxy(proxyHost, proxyPortInt.intValue());
HttpState state = new HttpState();
state.setProxyCredentials(new AuthScope(proxyHost, proxyPortInt.intValue()),
new UsernamePasswordCredentials(username, userpassword));
client.setState(state);
а затем использовать его в методе, к которому можно обращаться в нескольких потоках:
PostMethod method = new PostMethod(urlStr);
method.setRequestEntity(new StringRequestEntity(requestStr));
method.setRequestHeader("Host", "the_same_host_every_time ");
method.setRequestHeader("Content-Type", "application/soap xml");
method.setRequestHeader("Content-Length", String.valueOf(requestStr.length()));
InputStream responseStream = null;
try {
int resultCode = client.executeMethod(method);
responseStream = method.getResponseBodyAsStream();
...
Это приложение каждый раз отправляет запросы на один и тот же хост. MultiThreadedHttpConnectionManager обладает следующими свойствами:
- DEFAULT_MAX_HOST_CONNECTIONS Максимальное количество подключений, разрешенных по умолчанию для одного хоста (согласно разделу 8.1.4 RFC 2616, это значение по умолчанию равно 2.)
- DEFAULT_MAX_TOTAL_CONNECTIONS Максимальное количество подключений по умолчанию, разрешенное в целом
Я их еще не менял. Означает ли это, что мое приложение сможет выполнять максимум 2 запроса одновременно (потому что все они относятся к одному хосту)? Почему значение по умолчанию равно 2? Должен ли я изменить значение DEFAULT_MAX_HOST_CONNECTIONS (в этом приложении много пользователей, которые могут одновременно обращаться к JSP). Что касается DEFAULT_MAX_TOTAL_CONNECTIONS, важен ли этот параметр для моего приложения?
Заранее спасибо!
Комментарии:
1. «должен ли я изменить», «важно ли это для моего приложения»? только вы можете знать, что важно для вас. Попробуйте, посмотрите, улучшит ли это работу для вас.
2. Мы не можем попробовать, мы предоставляем нашему клиенту только несколько компонентов, но у нас нет полного приложения для тестирования. Я просто пытаюсь понять, что означают эти параметры и каковы наилучшие практики.
3. Если вы не можете выполнить обновление с версии 1.4, вы можете использовать retroweaver для преобразования вашего приложения с более новой версии на 1.4.
4. вау, вы не можете протестировать свой код перед отправкой его вашему клиенту? это довольно страшно. Описания параметров довольно четкие, в них нет ничего сложного. Просто создайте фиктивное приложение, которое выполняет те же действия, и измените параметры, чтобы увидеть, как они работают. Но не тестировал это перед отправкой…
5. Для чего? Вопрос касается apache http client.
Ответ №1:
Некоторое время назад у нас был похожий сценарий, и ключевыми моментами для многопоточного использования были
- используя
MultiThreadedHttpConnectionManager
(вы уже делаете) - НЕ совместно использовать экземпляры
HttpMethod
(например,GetMethod
) иHttpState
между потоками
HttpState
инкапсулирует состояние диалога между последующими запросами, включая идентификатор сеанса (если таковой имеется). Таким образом, при попытке выполнять параллельные запросы к какому-либо «бэкэнду» (например, веб-сайту) вы не хотите делиться им между потоками, чтобы не перепутывать сеансы и не получать непредсказуемые результаты.
В справочной документации есть глава о потоковой обработке, а также раздел под названием «Параллельное выполнение методов HTTP». Ранее объяснялись параметры конфигурации, которые вы упомянули, последнее многопоточное использование в целом.