Я использую модуль AnyEvent :: Twitter :: Stream, полученный из CPAN. Я также новичок в Perl, и этот скрипт, который я изменил из примера, запускает событие, чтобы вставить немного данных из твиттера в базу данных, как только твит прочитан из API потоковой передачи Twitter на основе некоторых условий. Я отредактировал часть кода, но общая информация приведена ниже:
#!/usr/bin/perl
use strict;
use AnyEvent::Twitter::Stream;
use DBI;
use DBD::mysql;
my $done = AnyEvent->condvar;
my($user, $password, $method, $args) = @ARGV;
# my twitter login
my %args;
if ($method eq 'follow') {
$args{follow} = $args;
$method = 'filter';
} elsif ($method eq 'track') {
$args{track} = $args;
$method = 'filter';
}
binmode STDOUT, ":utf8";
my $streamer = AnyEvent::Twitter::Stream->new(
username => $user,
password => $password,
timeout => 0,
method => $method || "sample",
%args,
on_keepalive => sub {
warn "ping\n";
},
on_tweet => sub {
my $DBIconnect;
#db connection info
my $dsn = "dbi:mysql:$database:$host:$dbport";
$DBIconnect = DBI->connect($dsn, $db_user, $db_pass);
my $tweet = shift;
if($tweet->{id}) {
# occasionally twitter
# insert some data here
my $save_tweet = $query;
#print $query;
my $save_handle = $DBIconnect->prepare($save_tweet);
if($save_handle->execute()) {
#print "Tweet #" . $tweet->{id} . " Stored\n";
} else {
#print "Error Saving Tweet #" . $tweet->{id} . "\n";
}
$save_handle->finish();
$DBIconnect->disconnect();
} else {
#print "Tweet did not contain Tweet ID.\n";
}
},
on_error => sub {
my $error = shift;
print "Error! Error!";
warn "ERROR: $error";
$done->send;
sleep 2;
$done->recv;
},
on_eof => sub {
$done->send;
},
);
$done->recv;
В этом процессе иногда поток или приложение завершают работу по причинам, которые до сих пор меня не понимают. Я хотел бы просто подождать 3 секунды, а затем перезапустить весь Perl-скрипт (или просто экземпляр AnyEvent), чтобы продолжить чтение данных.
Вы можете заметить, что я пытался это сделать с:
on_error => sub {
my $error = shift;
print "Error! Error!";
warn "ERROR: $error";
$done->send;
sleep 2;
$done->recv;
},
Кажется, это не перезапускает процесс. Может ли кто-нибудь дать мне хоть какое-то представление о том, что для этого нужно?