diff options
author | franck cuny <franck@lumberjaph.net> | 2010-04-14 10:38:48 +0200 |
---|---|---|
committer | franck cuny <franck@lumberjaph.net> | 2010-04-14 10:38:48 +0200 |
commit | af8d5ba00c2e37528afd778c35021748ac63434b (patch) | |
tree | 221132855172c8e3f36f5cabf92025b9383b0c10 /lib/presque/worker.pm | |
parent | initial commit (diff) | |
download | presque-worker-af8d5ba00c2e37528afd778c35021748ac63434b.tar.gz |
basic worker
Diffstat (limited to '')
-rw-r--r-- | lib/presque/worker.pm | 79 |
1 files changed, 74 insertions, 5 deletions
diff --git a/lib/presque/worker.pm b/lib/presque/worker.pm index 9df647b..6e43c52 100644 --- a/lib/presque/worker.pm +++ b/lib/presque/worker.pm @@ -1,23 +1,88 @@ package presque::worker; -use strict; -use warnings; +use Moose; our $VERSION = '0.01'; +use AnyEvent; +use AnyEvent::HTTP; + +use Carp; +use JSON; +use Try::Tiny; + +has base_uri => ( is => 'ro', isa => 'Str', required => 1 ); +has queue => ( is => 'ro', isa => 'Str', required => 1 ); +has interval => ( is => 'ro', isa => 'Int', lazy => 1, default => 5 ); + +sub BUILD { + my ( $self, $args ) = @_; + my ( $get, $timer ); + + my $uri = $self->base_uri; + my $queue = $self->queue; + my $queue_uri = $uri . '/q/' . $queue; + + if ( !$self->meta->find_method_by_name('work') ) { + Carp::confess "method work is missing"; + } + + $get = sub { + http_get $queue_uri, sub { + my ( $body, $hdr ) = @_; + return if ( !$body || $hdr->{Status} != 200 ); + my $content = JSON::decode_json($body); + + try { + $self->work($content); + } + catch { + $self->fail($content, $_) if $self->meta->find_method_by_name('fail'); + }; + $timer = AnyEvent->timer( after => $self->interval, cb => $get ); + }; + }; + $get->(); + return $self; +} + 1; __END__ =head1 NAME -presque::worker - +presque::worker - a presque worker =head1 SYNOPSIS - use presque::worker; + package myworker; + use Moose; + extends 'presque::worker'; + + sub work { + my ($self, $job) = @_; + ... + } + + sub fail { + my ($self, $job, $error) = @_; + ... + } =head1 DESCRIPTION -presque::worker is +presque::worker - Worker for the C<presque> message queue system + +=head1 METHODS + +=head2 work ($job_description) + +Worker must implement the B<work> method. The only argument of this method is a hashref +containing the job. + +=head2 fail ($job_description, $error_reason) + +Worker may implement the B<fail> method. This method have two arguments: the job description +and the reason of the failure. =head1 AUTHOR @@ -27,6 +92,10 @@ franck cuny E<lt>franck@lumberjaph.netE<gt> =head1 LICENSE +Copyright 2010 by Linkfluence + +L<http://linkfluence.net> + This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. |