新規注文のhttp通信時にIOExceptionが発生するトラブルが3/13に起きました。
ログを見たところ新規注文のhttpリクエストは問題なく送信されていたようで、その後のhttpレスポンスを受信時にIOExceptionが発生していました。メッセージは"Connection reset"でした。(例外は発生しましたが新規注文は約定されていました)
具体的なエラー発生箇所ですが、トレードロボット基本コンポーネントのjp.robotbrain.net.WebクラスのpostHtmlの中にある以下の行でエラーになっていたようです。
returnValue = getResponseText(p_charset);
レスポンス受信時になんらかの理由でコネクションが解消されたようですね。1年3ヶ月運用してきてはじめて発生する現象ですので再現性はかなり低いと思いますが、年に1~2回しか訪れない大チャンスで再現されたら、たまりませんので以下のような対策をしました。
(対策)
新規注文時の処理は大きく以下のような流れになっています。
------------------------------
(1)新規注文フォームをPOST
(2)上記(1)のレスポンスを受信
(3)建玉一覧のページをGET
(4)上記(3)のレスポンスを解析して建玉がある場合は約定したと判断する。すぐに約定しない場合があるので10数回は(3)~(4)を繰り返す。
------------------------------
このようになっておりまして、約定確認は建玉一覧ページを見て行っていますので(2)のレスポンスは受信はしますが、処理上使っていません。ですので(2)で例外が発生しても無視して(3)に進むように処理を変更しました。
また、この対応を可能にするためにトレードロボット基本コンポーネントのjp.robotbrain.net.WebクラスのsendFormで送信用と受信用の例外をそれぞれHttpSendException, HttpRecvExceptionのように分けました。(v1.02まではIOExceptionで一本化されていましたので送信と受信どちらのエラーか判別できませんでした)
昨日公開したトレードロボット基本コンポーネントパッケージv1.03は上記の対応をしたバージョンになります。
最近のコメント