J2ME Постоянное соединение Http - PullRequest
0 голосов
/ 08 января 2012

Извините, это вместе с документом.

СТАРЫЕ НАСТРОЙКИ

У меня есть клиентское приложение J2ME, которое подключается к серверу с интервалом в 3 секунды.Соединения обрабатываются в отдельном потоке.Поток работает в цикле while и выполняет следующие действия:

  1. Открытое HTTP-соединение
  2. Получение ответа и отправка в главный поток пользовательского интерфейса для обработки
  3. Спящий режим в течение 3 секунд
    Повтор

Сервер Apache и KeepAlive выключен.HTTP-запросы от клиента имеют время ожидания 10 секунд.Каждый цикл занимает около 4,5 секунд (общая задержка 1,5 секунды).

Время от времени (раз в 1 или 2 часа) в условиях низкого покрытия (слабый сигнал 3G / GPRS) поток получает блок ввода-вывода и зависает на шаге 1 выше.Я думаю, что происходит, когда соединение где-то вдоль линии умерло, но приложение не знает об этом и ждет ответа.Я считаю, что виновата сеть (в данном случае O2).Соединение остается активным в течение, возможно, 30 минут и в конечном итоге умирает и возвращает -1 длину ответа приложению, и поток в конечном итоге продолжается.Чтобы бороться с этой относительно редкой проблемой, я просто отказался от темы, если ответ занял более 60 секунд, и создал новую.

До недавнего времени это не было серьезной проблемой, однако мы изменили настройки сети следующим образом:


NEW SETUP

  1. Из-за более низких ограничений пропускной способности мы сократили интервал до 5 секунд.
  2. Теперь мы направляем все соединения через туннель SSL к нашему серверу.
  3. У запросов HTTP от клиента все еще есть время ожидания 10 секунд в приложении *

Цикл занимал около 7,5 секунд (2,5 секунды общей задержки), чтобы завершить эти изменения.Причиной увеличения задержки было то, что для каждого отдельного соединения требовалось подтверждение связи по SSL (из-за отключения KeepAlive).Нам посоветовали включить KeepAlive ON на сервере apache, что означало бы одно рукопожатие, а затем постоянное соединение http для последующих запросов.Мы сделали это, и по большей части это значительно улучшило скорость соединения.Цикл уменьшился до 6,5 секунд.

Итак, теперь мы можем добавить это к изменениям нашей конфигурации для новой настройки:

  1. HTTP KeepAlive был включен на сервере (для включения постоянного соединения TCP)

Однако в бедных зонах 3G / GPRS проблема блокирования потоков встречается гораздо чаще и стала серьезной проблемой - это происходит в 50% случаев в действительно плохих зонах покрытия.Я несколько раз получал исключение Java из-за нехватки памяти, сообщая, что приложение не может создать новый поток. Кроме того, в хороших областях 3G мы также видим проблему блокирования потоков, чего раньше не было.

Я явно сделал что-то не так в этой настройке, так как постоянные http-соединения и базовый TCP довольно надежны

* Мы справились со всеми этими изменениями без перезаписи приложения, но таймаут http10 секунд потребует переписать приложение.Возможно, этот тайм-аут вызывает проблему?

Заранее благодарим за любую помощь в этом.

1 Ответ

0 голосов
/ 10 января 2012

В случае, если у кого-то есть подобная проблема, KeepAliveTimeout был ключевым здесь.Он был установлен на 5 секунд, что сделало KeepAlive бесполезным.

Я увеличил его до 30 секунд, что эффективно создает постоянное соединение, и приложение летит прямо сейчас.

...