AnyEvent-Gearman
view release on metacpan or search on metacpan
lib/AnyEvent/Gearman/Client.pm view on Meta::CPAN
package AnyEvent::Gearman::Client;
use Any::Moose;
use AnyEvent::Gearman::Types;
use AnyEvent::Gearman::Task;
use AnyEvent::Gearman::Client::Connection;
has job_servers => (
is => 'rw',
isa => 'AnyEvent::Gearman::Client::Connections',
required => 1,
coerce => 1,
);
has prefix => (
is => 'rw',
isa => 'Str',
default => '',
);
no Any::Moose;
sub add_task {
my $self = shift;
return $self->_add_task('', @_)
}
sub add_task_bg {
my $self = shift;
return $self->_add_task('bg', @_)
}
sub _add_task {
my ($self, $type, $function, $workload, %cb) = @_;
$function = $self->prefix . "\t" . $function
if $self->prefix;
my $task = AnyEvent::Gearman::Task->new( $function, $workload, %cb );
my $retry; ($retry = sub {
my @js = grep { $_->alive } @{ $self->job_servers };
unless (@js) {
$task->event( on_fail => 'no server available' );
undef $retry;
return;
}
# TODO: hashed server selector
my $js = @js[int rand @js];
$js->add_task(
$task,
# task added successfully
sub {
undef $retry;
},
# on error
$retry,
# task type
$type,
);
})->();
$task;
}
__PACKAGE__->meta->make_immutable;
__END__
=for stopwords Str namespace
=head1 NAME
AnyEvent::Gearman::Client - Gearman client for AnyEvent application
=head1 SYNOPSIS
use AnyEvent::Gearman::Client;
# create greaman client
my $gearman = AnyEvent::Gearman::Client->new(
job_servers => ['127.0.0.1', '192.168.0.1:123'],
);
# start job
$gearman->add_task(
$function => $workload,
on_complete => sub {
my $res = $_[1];
},
on_fail => sub {
# job failed
},
);
# start background job
$gearman->add_task_bg(
( run in 2.071 seconds using v1.01-cache-2.11-cpan-df04353d9ac )