From b188fb7a137909fdc9e6500c7d32fa58460ca55e Mon Sep 17 00:00:00 2001 From: Mischa S Date: Tue, 1 Nov 2011 15:50:13 -0700 Subject: [PATCH 1/3] split up publish into dispatch_messages/append_to_queues so topic traits can override the appropriate behavior --- lib/AnyMQ/Topic.pm | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/AnyMQ/Topic.pm b/lib/AnyMQ/Topic.pm index e0cc4ea..2ba30e9 100644 --- a/lib/AnyMQ/Topic.pm +++ b/lib/AnyMQ/Topic.pm @@ -54,6 +54,16 @@ sub reap_destroyed_listeners { } sub publish { + my ($self, @messages) = @_; + $self->append_to_queues(@messages); + $self->dispatch_messages(@messages); +} + +sub dispatch_messages { + my ($self, @messages) = @_; +} + +sub append_to_queues { my ($self, @messages) = @_; $self->reap_destroyed_listeners; for (values %{$self->queues}) { From c55b93f66b6d2aed8d30c745a963d69fb09de705 Mon Sep 17 00:00:00 2001 From: Mischa S Date: Tue, 1 Nov 2011 16:05:57 -0700 Subject: [PATCH 2/3] add option to have publish() not automatically add published events to local listeners --- lib/AnyMQ.pm | 2 +- lib/AnyMQ/Topic.pm | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/AnyMQ.pm b/lib/AnyMQ.pm index 3b19d88..28b3161 100644 --- a/lib/AnyMQ.pm +++ b/lib/AnyMQ.pm @@ -1,7 +1,7 @@ package AnyMQ; use strict; use 5.008_001; -our $VERSION = '0.33'; +our $VERSION = '0.34'; use AnyEvent; use Any::Moose; diff --git a/lib/AnyMQ/Topic.pm b/lib/AnyMQ/Topic.pm index 2ba30e9..3dd8ab2 100644 --- a/lib/AnyMQ/Topic.pm +++ b/lib/AnyMQ/Topic.pm @@ -25,6 +25,7 @@ has queues => (traits => ['Hash'], ); has recycle => (is => "rw", isa => "Bool", default => sub { 0 }); has 'reaper_interval' => (is => 'ro', isa => 'Int', default => sub { 30 }); +has 'publish_to_queues' => (is => 'rw', isa => 'Bool', default => sub { 1 }); has '_listener_reaper' => (is => 'rw'); has '+_trait_namespace' => (default => 'AnyMQ::Topic::Trait'); @@ -55,7 +56,7 @@ sub reap_destroyed_listeners { sub publish { my ($self, @messages) = @_; - $self->append_to_queues(@messages); + $self->append_to_queues(@messages) if $self->publish_to_queues; $self->dispatch_messages(@messages); } From cc1c94e4055de7dde76b56fd9b4fa66926d16a31 Mon Sep 17 00:00:00 2001 From: Mischa S Date: Wed, 2 Nov 2011 12:28:16 -0700 Subject: [PATCH 3/3] test publish_queues attribute for topics --- t/publish_queues.t | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 t/publish_queues.t diff --git a/t/publish_queues.t b/t/publish_queues.t new file mode 100644 index 0000000..9f2c7c9 --- /dev/null +++ b/t/publish_queues.t @@ -0,0 +1,34 @@ +use strict; +use Test::More; +use AnyMQ; +use AnyMQ::Topic; + +my $bus = AnyMQ->new; + +my $t1 = AnyMQ::Topic->new( + bus => $bus, + publish_to_queues => 1, +); +test_topic($t1); + +my $t2 = AnyMQ::Topic->new( + bus => $bus, + publish_to_queues => 0, +); +test_topic($t2); + +sub test_topic { + my ($channel) = @_; + + my $client = AnyMQ->new_listener($channel); + + my $events = 0; + $client->poll(sub { $events++; }); + + $channel->publish({ data => 1}); + + my $expected = $channel->publish_to_queues ? 1 : 0; + is($events, $expected, "Got expected events published to queues"); +} + +done_testing;