M.C.P.C.

―むり・くり―プラスコミュニケーション(更新終了)


| トップページ |

2011年11月27日 18:25

AnyEvent::Twitter::Streamで自動再接続処理(whileループを使わない版)

このエントリーをはてなブックマークに追加 mixiチェック

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のウォッチャーを起動します。

とりあえず、これを組み込んで、長時間動かして接続が切れないかどうか観察中です。

投稿 大野 義貴 [Perl] | |

トラックバック(0)

トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/3783

コメントする