WebOTXでは、クライアントから接続したコネクションをセッション情報を付加したチャネルを介して
スレッドに割り当ててリクエスト処理を行います。コネクションが切断されるとチャネルをプールし、
新たなコネクションが接続されたときに再利用します。
WebSocketプロトコルで送信中にクライアントからコネクションを切断された際、Webアプリケーションが
送信バッファに書き込んだ一部のデータしかクライアントへ送信していない場合、チャネルをプールに
登録する処理でタイミングによっては同一チャネルを2つプールに登録してしまいます。
この問題により処理中のコネクションが新規に接続してきたコネクションに置き換わる事象が発生し、
処理中であったコネクションがスレッドに割り当てられない状態となります。その結果、クライアントが
送信したデータがWebOTXで受信できなくなります。
同一のチャネルを2つプールに登録する問題であるため、チャネルおよびチャネルに関連する設定をプール
しないように変更して回避します。
チャネルをプールしない設定はotxadminコマンドで次のように設定します。
otxadmin> login --user <ユーザ名> --password <パスワード> --host <ホスト名> --port <対象ドメインの管理ポート>
otxadmin> set server.network-config.protocols.protocol.http-listener.http.property.socket\\.bufferPool=0
otxadmin> set server.network-config.protocols.protocol.http-listener.http.property.socket\\.processorCache=0
otxadmin> set server.network-config.protocols.protocol.http-listener.http.property.socket\\.eventCache=0
otxadmin> set server.network-config.protocols.protocol.http-listener.http.property.socket\\.keyCache=0
設定後、ドメインを再起動してください。
※HTTP(ws)用の設定です。HTTPS(wss)用の場合は"http-listener" 部分を"https-listener"に読み替えて
ください。
それぞれの設定の意味は次の通りです。
bufferPool:クローズ済みのチャネルをプールする上限数
processorCache:チャネルとともにスレッドの紐つけに使用するプロセッサをプールする上限数
eventCache:コネクションごとで発生したイベント情報をプールする上限数
keyCache:コネクションを管理するキー情報をプールする上限数