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のウォッチャーを起動します。
とりあえず、これを組み込んで、長時間動かして接続が切れないかどうか観察中です。
トラックバック
この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/19018/53348167
この記事へのトラックバック一覧です: AnyEvent::Twitter::Streamで自動再接続処理(whileループを使わない版):

![すぐ解決!DTPトラブル対策ブック―最強最後のOS9(+OSX)ガイド [単行本]](http://ec2.images-amazon.com/images/I/51895BQKEPL._SL500_AA208_.jpg)









