Не отсылаются Ajax запросы, если сервер offline
От: Посторонним В. Беларусь  
Дата: 19.08.16 12:30
Оценка:
Задал вопрос на stackoverflow, но не смогли ответить. Потому обратился к КЫВТу.

У меня есть страница, через которую пользователь может перегрузить сервер. По нажатию кнопки "reboot" сервер идет в ребут, а пользователю показывается страница с "rebooting please wait...".

Я хочу, чтобы после перезагрузки страница "rebooting please wait..." сменилась на главную страницу сервера. Ниже моя попытка это сделать.

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Rebooting, please wait...</title>

    <script type="text/javascript">
     function checkPageReady() {
        var request = new XMLHttpRequest();
        request.open('POST', '/', true);
        request.onreadystatechange = function() {
          if (request.readyState == 4 && request.status == 200)
              window.location = '/';
        };
        request.send(null);
     }
     function checkPageReadyInLoop() {
        setInterval(checkPageReady, 1000);
     }
    </script>

</head>
<body onload="setTimeout(checkPageReadyInLoop, 10000);">
    Rebooting, please wait...
</body>
</html>


Стриница ждет 10 секунд, после чего раз в секунду начинает пинговать сервер Ajax запросы. Как только сервер доступен, идет редирект на главную страницу
Наблюдая за процессом через Chrome Developer Tools я вижу, что Ajax запросы не отсылаются совсем!
Если же я делаю фейк-ребут (то есть сервер на самом деле не перегружается), то все начинает работать.

Кто что посоветует?
ajax offline
Re: Не отсылаются Ajax запросы, если сервер offline
От: Sharov Россия  
Дата: 19.08.16 12:51
Оценка:
Здравствуйте, Посторонним В., Вы писали:

ПВ>Стриница ждет 10 секунд, после чего раз в секунду начинает пинговать сервер Ajax запросы. Как только сервер доступен, идет редирект на главную страницу

ПВ>Наблюдая за процессом через Chrome Developer Tools я вижу, что Ajax запросы не отсылаются совсем!
ПВ>Если же я делаю фейк-ребут (то есть сервер на самом деле не перегружается), то все начинает работать.

ПВ>Кто что посоветует?


Разумеется запросы не проходят, т.к. сервер лежит(перезагружается). Куда их отсылать, к чему соединяться?
Кодом людям нужно помогать!
Re: Не отсылаются Ajax запросы, если сервер offline
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 19.08.16 12:58
Оценка: +1 -1
Здравствуйте, Посторонним В., Вы писали:

ПВ>У меня есть страница, через которую пользователь может перегрузить сервер. По нажатию кнопки "reboot" сервер идет в ребут, а

ПВ>Кто что посоветует?
Запросы не идут т.к. TCP соединение мёртво и скорее всего сделало graceful close, соственно аякс работать и не будет после этого. Тебе надо поднять WebSocket или через какой-то таймаут ломится на сервер (будет поднят свежее TCP соединение) посылая свежий запрос, по другому — никак. ЕМНИП, аякс работает на текущем соединении.
Sic luceat lux!
Re[2]: Не отсылаются Ajax запросы, если сервер offline
От: fddima  
Дата: 19.08.16 13:18
Оценка: 1 (1) +1
Здравствуйте, Kernan, Вы писали:

K>ЕМНИП, аякс работает на текущем соединении.

Это вы придумали. Нет никакого аякс. Любой запрос берет соединение из пула. ВебСокеты тут вообще противопоказаны, они то как раз и отвалятся первыми и вернемся к тому же поллингу, только гораздо более сложным путем.

А для ТС, на вскидку, стоит:
1. обрабатывать ошибки и смотреть что к чему в целях дебага
2. обратить внимание, что запросов может быть создано реально много благодаря setInterval, в случае если есть тормоза по сети (а они могут быть), и код упрется в лимит количества соединений на группу (домен), ну, пока там таймауты не отпадут — а когда они отпадут — вопрос тот еще.
3. Заодно стоит настроить таймаут для XMLHttpRequest, потому как по дефолту — бесконечность.
Re[3]: Не отсылаются Ajax запросы, если сервер offline
От: Посторонним В. Беларусь  
Дата: 21.08.16 20:27
Оценка: 1 (1)
Здравствуйте, fddima, Вы писали:

F>Здравствуйте, Kernan, Вы писали:


K>>ЕМНИП, аякс работает на текущем соединении.

F>Это вы придумали. Нет никакого аякс. Любой запрос берет соединение из пула. ВебСокеты тут вообще противопоказаны, они то как раз и отвалятся первыми и вернемся к тому же поллингу, только гораздо более сложным путем.

F>А для ТС, на вскидку, стоит:

F>1. обрабатывать ошибки и смотреть что к чему в целях дебага
F>2. обратить внимание, что запросов может быть создано реально много благодаря setInterval, в случае если есть тормоза по сети (а они могут быть), и код упрется в лимит количества соединений на группу (домен), ну, пока там таймауты не отпадут — а когда они отпадут — вопрос тот еще.
F>3. Заодно стоит настроить таймаут для XMLHttpRequest, потому как по дефолту — бесконечность.

Вариант с timeout к сожалению не прокатил.

Тогда я сообразил, что сервер, отдав клиенту страницу, сразу шел в reboot, не дожидаясь полной загрузки страницы клиентом. То есть до <body onload ...> дело просто не доходило! Тогда я вынес вызов setTimeout(checkPageReadyInLoop) из <body onload ...> в место перед закрытием </header> и все заработало!

Как считаете, это хорошее решение?
Re[4]: Не отсылаются Ajax запросы, если сервер offline
От: fddima  
Дата: 22.08.16 13:22
Оценка: 2 (1)
Здравствуйте, Посторонним В., Вы писали:

ПВ>Вариант с timeout к сожалению не прокатил.

Его все равно стоит всегда устанавливать.

ПВ>Как считаете, это хорошее решение?

Очевидно, что нет. Вы ж и сами поняли. Если нет возможности на сервере выполнить. перезагрузку после того как клиент прочитал ответ — то, хотя бы сделайте таймаут на сервере в несколько секунд перед ребутом. Я ж так понимаю страница предназначена для локальной сети? Ну и возможно имеет смысл вообще управлять перезагрузкой полностью через аякс. Метод пинг в этом случае должен отвечать была ли перезагрузка запрошена, и редиректить в корень только если перезагрузка не зашедулена, т.е. как-то так:
1. post /reboot -> ok
2. get /ping -> rebootScheduled: true -> пмнгуем дальше
3. ... ошибки связи ...
4. get /ping -> rebootScheduled: false -> готовы, редирект домой
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.