AnyEvent::HTTP で 200 以外が帰ってきた時にリトライする

早くも YAPC Asia Tokyo が終わって一週間経ってしまいましたが、
今度は東京Node学園祭2011のお手伝いをする為ばたばたしています。


今回は YAPC 中に id:sugyan id:takesako id:lestrrat 各氏に聞いて
回っていたタイトルの件が解決したのでエントリーを書きます。


これをやってみて理解した様に思っている事と本当に理解して実装出
来るようになる事は違うという事を改めて理解しました。


元々は会社の古い監視スクリプトが LWP::UserAgent で実装されてい
てエラーがあるとブロックしてしまうという事から自分の勉強の意味も
込めてやってみようと思いました。


実際には nagios 等で監視すれば良いのかもしれないのでこのスクリプト
自体は使わないかもしれませんが良い勉強になりました。


スクリプトの要点は大体以下の通りです。

  1. http_get 部分はリトライする為にサブルーチンリファレンスにする。
  2. サブルーチンリファレンスを AE::timer で実行
    • この際 AE::timer の戻り値を受け取らないとガーベージコレクトされてイベントが発火しない事を lestrrat さんに教えていただきました。
    • サブルーチンリファレンスにする事は sugyan さん、takesako さんとお話しした際にアドバイスいただきました。
    • ループ内でウォッチャー変数が上書きされるとやはりイベントが発火しないので配列にプッシュしています。
  3. リトライされる際はウォッチャーを作る前に begin を読んでおかないと終了してしまう。
  4. 全ての準備が整った後で $cv->recv でブロックする。
    • 最初ループ内に書いていて lestrrat さんにご指摘いただきました。


ご協力いただいた各氏ありがとうございました。

勉強会やイベントに行って積極的に話しかけるといろいろ勉強になり
ますのでお勧めしますよ。(自分への戒めも込めて、、、)