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





![: Amazon.co.jp: プラスティック・メモリーズ 1【完全生産限定版】(イベントチケット優先販売申込券付) [Blu-ray]](/lists/_9/B00VWX66E8.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 2【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX66K2.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 3【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX6MV0.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 4【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX66IO.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 5【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX6Y0E.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 6【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX69D6.jpg)


コメントする