Задал вопрос на 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 запросы не отсылаются совсем!
Если же я делаю фейк-ребут (то есть сервер на самом деле не перегружается), то все начинает работать.
Здравствуйте, Посторонним В., Вы писали:
ПВ>Стриница ждет 10 секунд, после чего раз в секунду начинает пинговать сервер Ajax запросы. Как только сервер доступен, идет редирект на главную страницу ПВ>Наблюдая за процессом через Chrome Developer Tools я вижу, что Ajax запросы не отсылаются совсем! ПВ>Если же я делаю фейк-ребут (то есть сервер на самом деле не перегружается), то все начинает работать.
ПВ>Кто что посоветует?
Разумеется запросы не проходят, т.к. сервер лежит(перезагружается). Куда их отсылать, к чему соединяться?
Кодом людям нужно помогать!
Re: Не отсылаются Ajax запросы, если сервер offline
Здравствуйте, Посторонним В., Вы писали:
ПВ>У меня есть страница, через которую пользователь может перегрузить сервер. По нажатию кнопки "reboot" сервер идет в ребут, а ПВ>Кто что посоветует?
Запросы не идут т.к. TCP соединение мёртво и скорее всего сделало graceful close, соственно аякс работать и не будет после этого. Тебе надо поднять WebSocket или через какой-то таймаут ломится на сервер (будет поднят свежее TCP соединение) посылая свежий запрос, по другому — никак. ЕМНИП, аякс работает на текущем соединении.
Sic luceat lux!
Re[2]: Не отсылаются Ajax запросы, если сервер offline
Здравствуйте, Kernan, Вы писали:
K>ЕМНИП, аякс работает на текущем соединении.
Это вы придумали. Нет никакого аякс. Любой запрос берет соединение из пула. ВебСокеты тут вообще противопоказаны, они то как раз и отвалятся первыми и вернемся к тому же поллингу, только гораздо более сложным путем.
А для ТС, на вскидку, стоит:
1. обрабатывать ошибки и смотреть что к чему в целях дебага
2. обратить внимание, что запросов может быть создано реально много благодаря setInterval, в случае если есть тормоза по сети (а они могут быть), и код упрется в лимит количества соединений на группу (домен), ну, пока там таймауты не отпадут — а когда они отпадут — вопрос тот еще.
3. Заодно стоит настроить таймаут для XMLHttpRequest, потому как по дефолту — бесконечность.
Re[3]: Не отсылаются Ajax запросы, если сервер offline
Здравствуйте, 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
Здравствуйте, Посторонним В., Вы писали:
ПВ>Вариант с timeout к сожалению не прокатил.
Его все равно стоит всегда устанавливать.
ПВ>Как считаете, это хорошее решение?
Очевидно, что нет. Вы ж и сами поняли. Если нет возможности на сервере выполнить. перезагрузку после того как клиент прочитал ответ — то, хотя бы сделайте таймаут на сервере в несколько секунд перед ребутом. Я ж так понимаю страница предназначена для локальной сети? Ну и возможно имеет смысл вообще управлять перезагрузкой полностью через аякс. Метод пинг в этом случае должен отвечать была ли перезагрузка запрошена, и редиректить в корень только если перезагрузка не зашедулена, т.е. как-то так:
1. post /reboot -> ok
2. get /ping -> rebootScheduled: true -> пмнгуем дальше
3. ... ошибки связи ...
4. get /ping -> rebootScheduled: false -> готовы, редирект домой