AnyEvent-DateTime-Cron
view release on metacpan or search on metacpan
lib/AnyEvent/DateTime/Cron.pm view on Meta::CPAN
return $self;
}
#===================================
sub _schedule {
#===================================
my $self = shift;
my $time_zone = $self->{_time_zone};
AnyEvent->now_update();
my $now_epoch = AnyEvent->now;
my $now = DateTime->from_epoch( epoch => $now_epoch );
my $debug = $self->{_debug};
$now->set_time_zone($time_zone) if $time_zone;
for my $job (@_) {
my $name = $job->{name};
my $next_run;
if ($self->{_quartz}) {
$next_run = $job->{event}->get_next_valid_time_after($now);
}
else {
$next_run = $job->{event}->next($now);
}
$next_run->set_time_zone($time_zone) if $time_zone;
my $next_epoch = $next_run->epoch;
my $delay = $next_epoch - $now_epoch;
print STDERR "Scheduling job '$name' for: $next_run\n"
if $debug;
my $run_event = sub {
print STDERR "Starting job '$name'\n"
if $debug;
$self->{_cv}->begin;
delete $job->{watchers}{$next_epoch};
$self->_schedule($job);
if ( $job->{single} && $job->{running}++ ) {
print STDERR "Skipping job '$name' - still running\n"
if $debug;
}
else {
eval { $job->{cb}->( $self->{_cv}, $job ); 1 }
or warn $@ || 'Unknown error';
delete $job->{running};
print STDERR "Finished job '$name'\n"
if $debug;
}
$self->{_cv}->end;
};
$job->{watchers}{$next_epoch} = AnyEvent->timer(
after => $delay,
cb => $run_event
);
}
}
#===================================
sub debug {
#===================================
my $self = shift;
$self->{_debug} = shift if @_;
return $self;
}
#===================================
sub jobs { shift->{_jobs} }
#===================================
1;
=pod
=encoding UTF-8
=head1 NAME
AnyEvent::DateTime::Cron - AnyEvent crontab with DateTime::Event::Cron
=head1 VERSION
version 0.08
=head1 SYNOPSIS
AnyEvent::DateTime::Cron->new()
->add(
'* * * * *' => sub { warn "Every minute"},
'*/2 * * * *' => sub { warn "Every second minute"},
)
->start
->recv
$cron = AnyEvent::DateTime::Cron->new();
$cron->debug(1)->add(
'* * * * *', name => 'job_name', single => 1, sub {'foo'},
...
);
$cron->delete($job_id,$job_id...)
$cv = $cron->start;
$cv->recv;
AnyEvent::DateTime::Cron->new(time_zone => 'local');
->add(
'* * * * *' => sub { warn "Every minute"},
'*/2 * * * *' => sub { warn "Every second minute"},
)
->start
->recv
( run in 1.510 second using v1.01-cache-2.11-cpan-39bf76dae61 )