2016-09-29 12 views
1

cometdをバージョン2.5から3.0.9にアップグレードしましたが、Webソケットは無効になっています。 変更点の1つは次のとおりです。 - org.cometd.server.ServerSessionImpl disconnect()メソッドは、メッセージを「/ meta/disconnect」チャネルにパブリッシュする前に、メッセージの成功フラグを設定しなくなりました。 GitHub cometdリポジトリから、2015年10月14日にコミットの一部として削除されたことがわかりました。 - サーバ側の切断(user sbordet)の処理が改善されました。CometD v3.0.9 - サーバ側の切断でメッセージ(チャネル/メタ/切断)の成功フラグが設定されない

public void disconnect() 
{ 
    boolean connected = _bayeux.removeServerSession(this, false); 
    if (connected) 
    { 
     ServerMessage.Mutable message = _bayeux.newMessage(); 
     message.setChannel(Channel.META_DISCONNECT); 
     // message.setSuccessful(true); 
     deliver(this, message); 
     flush(); 
    } 
} 

クライアント側では、cometd(jquery.cometd.js)とのインタフェースにjqueryを使用しています。サーバー側からcometd切断メッセージを受信するたびに再接続を行います。再接続を試みる前に、以下の条件を確認します。

$.cometd.isDisconnected() && (message.channel == "/meta/disconnect" && message.successful) 

そのが切断APIに変更することにより、サーバー側で設定されたことがないようmessage.successfulチェックが失敗します。したがって、セッションは再接続/復元されないため、サーバーはこのセッションについて全く知らないため、サーバー側はクライアント側のサービスメッセージにサーバーをプッシュしません。

このチェックを保持し、ログアウト中に、このフラグは正常に設定されます。ログアウトする際には、以下のクライアント側メソッドを呼び出し、サーバ側のDisconnectHandler(BayeuxServerImpl下)を呼び出します。 DisconnectHandlerメッセージイベントは、応答メッセージでこのフラグをtrueに設定します。まず第一に

$.cometd.disconnect() 

、切断がサーバ側から開始されたときに成功フラグが(それがDisconnectHandler行動と整合するように期待する)、任意のより多くのcometdの切断メッセージに設定されていない理由を理解したいです。第2に、依然としてこのフラグを設定する可能性のある選択肢があるかどうか、すなわち、クライアント側またはサーバ側のいずれかのオーバーライドを介している可能性がありますか?

答えて

1

successfulフラグは、サーバー側の切断メッセージから削除されました。これは、要求されていないメッセージであり、クライアントによって開始された切断に対する応答ではなく、2つのメッセージを区別する必要があるためです。

迷惑なメッセージには、メッセージidsuccessfulフィールドもありません。

サーバーがクライアントを切断してそのクライアントに再接続する場合は、/meta/disconnectチャネルのリスナーを登録すれば十分です。迷惑な切断と切断された応答の両方に対して、リスナーが呼び出されます。必要に応じてリコンフィギュラタを再度呼び出すことができます(handshake())。

+0

お返事ありがとうございました。私が理解しているとおり、メッセージの正常なチェックはオプションです。つまり、/ meta/disconnectリスナーの下で、使用可能な場合にのみ、このフラグをチェックします。したがって、このチェックは、クライアントが開始した切断の場合と同じように継続され、このフラグが存在しないためにサーバーが開始したメッセージ(つまり、迷惑なメッセージ)に対しては発生しません。 – crathour

+0

別の注記では、 cometd javascriptによってアップグレード後にブラウザコンソールに表示されますが、これは機能には影響しません。これは私たちが心配しなければならないものですか? '拡張リロードの実行中の例外抽象的な' 私たちの初期の観察は、メッセージが/ meta/connect channelに属し、idが "402:Unknown client"である場合に一般的に起こるということです。他のケースでは非常にうまくいくかもしれませんが、確実ではありません。最終的には、再接続ロジックによってメッセージが有効なIDを持ち、したがって影響はありません。 – crathour

+0

「拡張リロードの実行中の例外抽象」は、それらの抽象メソッドをオーバーライドするクッキーライブラリがないためです。何を使いますか、jQueryかDojoですか? – sbordet

関連する問題