AnyEvent::Twitter::Streamで自動再接続処理(whileループを使わない版)
スポンサードリンク
AnyEvent::Twitter::Streamの再接続の件をずうっと考えていたのですが、当初参考にしていた、
hidekiy blog: [perl] AnyEvent::Twitter::Streamで自動再接続処理 [blog.hidekiy.com]
のとおりにすると、通常のAnyEventでの組み方の時はよさそうなのですが、Mojoliciousと同時に使用するなど、イベントループを共有する場合は、while(1){} のせいで、Mojoliciousのイベントループ開始までプログラムが進行できず、かといって、AnyEvent::Twitter::Streamの再接続の処理をMojoliciousに担当させるというのは難しそうなので、ここは、「Twitterのウォッチャー」と、「〔Twitteのウォッチャー〕のウォッチャー」の二つのウォッチャーを作り、お互いにウォッチャーの再生成をさせることで、結果的にAnyEvent::Twitter::Streamの再接続が実現できるようにしてみました。
#!/usr/bin/perl use strict; use warnings; use AnyEvent::Twitter::Stream; use Config::Pit; use EV; use utf8; use YAML; binmode STDOUT => ':utf8'; my $pit = Config::Pit::get('twitter.com@CLCLCL'); my $keys = YAML::LoadFile ('consumer_keys.yaml'); # AnyEvent リスナー設定 my $cv = AnyEvent->condvar(); my $listener_twitter; # グローバル:$listener_twitter, # $listener_timer内からundefするため my $listener_timer; # グローバル:$listener_timer内から # undefするため my $set_twitter; # Twitterのウォッチャーを設定する # サブルーチン入れる my $set_timer; # Timer のウォッチャーを設定する # サブルーチン入れる # Twitterのウォッチャーを設定するサブルーチン $set_twitter = sub { $listener_twitter = AnyEvent::Twitter::Stream->new( consumer_key => $keys->{consumer_key}, consumer_secret => $keys->{consumer_key_secret}, token => $pit ->{access_token}, token_secret => $pit ->{access_token_secret}, method => 'filter', track => 'dtpstudy05', on_tweet => sub { my $tweet = shift; print "$tweet->{user}{screen_name}: $tweet->{text}\n"; }, on_error => sub { # 何らかのエラー発生(再接続をしたい) my $error = shift; warn "ERROR: $error"; undef $listener_twitter; # Twitterのウォッチャー消す $set_timer->(5); # 〔Twitterのウォッチャー〕のウォッチャー再設定 }, on_eof => sub { # どういう時にEOFが来るんだろう? }, ); }; # 〔Twitterのウォッチャー〕のウォッチャーを # 設定するサブルーチン。引数の分だけ待つ $set_timer = sub { my $after = shift || 0; $listener_timer = AnyEvent->timer( after => $after, cb => sub { unless ( $listener_twitter ) { print "(re)connecting\n"; undef $listener_timer; $set_twitter->(); } }, ); }; # 〔Twitterのウォッチャー〕のウォッチャーを起動 $set_timer->(); # イベントループに仕事をしてもらい、 # プログラムの進行をここでせき止めます #($cv->sendがないので実質無限ループ) $cv->recv; exit; __END__
Twitterのウオッチャーがエラーになった時、自分自身のウォッチャーを無効にしたうえで、〔Twitterのウォッチャー〕のウォッチャーを起動します。
〔Twitterのウォッチャー〕のウォッチャーは、Twitterのウォッチャーが無効でないか確認しており、もし、無効であれば、Twitterのウォッチャーを起動します。
とりあえず、これを組み込んで、長時間動かして接続が切れないかどうか観察中です。
スポンサードリンク
トラックバック(0)
トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/3783
コメントする