# $Id$ package Mvalve::QueueSet; use Moose; use Time::HiRes(); has 'emergency_queues' => ( is => 'rw', isa => 'ArrayRef[HashRef]', auto_deref => 1, default => sub { +[ { table => 'q_emerg' }, ] } ); has 'timed_queues' => ( is => 'rw', isa => 'ArrayRef[HashRef]', auto_deref => 1, default => sub { +[ { table => 'q_timed' }, ] } ); has 'normal_queues' => ( is => 'rw', isa => 'ArrayRef[HashRef]', auto_deref => 1, default => sub { +[ { table => 'q_incoming' }, ] }, ); __PACKAGE__->meta->make_immutable; no Moose; # Retry queue is not counted, as it's special sub all_queues { my $self = shift; my @list = ( $self->emergency_queues, $self->timed_queues, $self->normal_queues, ); return wantarray ? @list : \@list; } sub all_tables { map { $_->{table} } ($_[0]->all_queues) } sub choose_table { my ($self, $type) = @_; $type ||= 'normal'; my $method = join('_', $type, 'queues'); my @queues = $self->$method; return $queues[ rand(@queues) ]->{table}; } sub as_q4m_args { my $self = shift; my $now = Time::HiRes::time() * 100000; my @list = ( (map { $_->{table} } $self->emergency_queues), (map { "$_->{table}:ready<" . $now } $self->timed_queues), (map { $_->{table} } $self->normal_queues), ); return wantarray ? @list : \@list; } sub is_emergency { my ($self, $table) = @_; foreach my $q ($self->emergency_queues) { if ($q->{table} eq $table) { return 1; } } return 0; } sub is_timed { my ($self, $table) = @_; foreach my $q ($self->timed_queues) { if ($q->{table} eq $table) { return 1; } } return 0; } 1; __END__ =head1 NAME Mvalve::QueueSet - QueueSet =head1 METHODS =head2 all_queues =head2 all_tables =head2 as_q4m_args =head2 is_emergency =head2 is_timed =head2 choose_table =cut