フロントエンドでTomcatWebサーバーと標準のJavaScriptを使用してサーバー側のプッシュ(comet)を実行できるように、長いポーリング接続を実装しました。接続を維持するために、最後の要求が完了する/失敗するとすぐに新しい要求を開始する単純なキープアライブループがあります。
ほとんどの場合、この接続は完全に正常に機能し、期待どおりに機能し続けます。しかし、ユーザーのインターネット接続が切断され(VPNから切断したり、イーサネットのプラグを抜いたりするなど)、サーバーへの保留中のXMLHttpRequestがある場合、失敗の兆候が見られないことに気付きました。このため、接続はサイレントに切断され、接続をテストするための要求をサーバーに絶えず送信しない限り、接続が発生したことを知ることができません(これは長いポーリングを使用する目的を損なうようです)。
このサイレントデスが終了したときにChromeに表示されるリクエストオブジェクトは次のとおりです。
request: XMLHttpRequest
onabort: function ()
onerror: function ()
onload: null
onloadend: null
onloadstart: null
onprogress: null
onreadystatechange: function ()
readyState: 1
response: ""
responseText: ""
responseType: ""
responseXML: null
status: [Exception: DOMException]
statusText: [Exception: DOMException]
upload: XMLHttpRequestUpload
withCredentials: false
3つのリスナー(onabort、onerror、onreadystatechange)が起動した場合にメッセージを警告するように設定していますが、サーバーへの接続を切断しても何も表示されません。リクエストの作成方法は次のとおりです。
var request = new XMLHttpRequest();
//url is just the url to my servlet to handle this
request.open("GET", url, true);
//handlestatechange is just my standard handling code
//that I've put an alert at the top of
request.onreadystatechange = handleStateChange;
request.onerror = function()
{
alert("We encountered an error");
}
request.onabort = function()
{
alert("I've had an abortion");
}
request.send(null);
これはかなり標準的な状況のようですが、この種の切断から長いポーリング接続を回復できるようにする方法についての会話は見たことがありません。
私は何か間違ったことをしていますか?この問題を回避する、長いポーリング/彗星を実行するための他のより標準的なアプローチはありますか?
これに関する助けをいただければ幸いです、ありがとう