Added some pod for type_key, serializer and subscribe_header features
[catagits/Catalyst-Engine-STOMP.git] / lib / Catalyst / Engine / Stomp.pm
index ae6e991..e437361 100644 (file)
@@ -7,7 +7,7 @@ use namespace::autoclean;
 
 extends 'Catalyst::Engine::Embeddable';
 
-our $VERSION = '0.04';
+our $VERSION = '0.06';
 
 has connection => (is => 'rw', isa => 'Net::Stomp');
 has conn_desc => (is => 'rw', isa => 'Str');
@@ -27,8 +27,11 @@ Catalyst::Engine::Stomp - write message handling apps with Catalyst.
 
   MyApp->config->{Engine::Stomp} =
    {
-     hostname => '127.0.0.1',
-     port     => 61613,
+     hostname         => '127.0.0.1',
+     port             => 61613,
+     subscribe_header => {
+       transformation       => 'jms-to-json',
+     }
    };
   MyApp->run();
 
@@ -72,22 +75,15 @@ sub run {
         die 'No Engine::Stomp configuration found'
              unless ref $app->config->{'Engine::Stomp'} eq 'HASH';
 
-        # list the path namespaces that will be mapped as queues.
-        #
-        # this is known to use the deprecated
-        # Dispatcher->action_hash() method, but there doesn't appear
-        # to be another way to get the relevant strings out.
-        #
-        # http://github.com/rafl/catalyst-runtime/commit/5de163f4963d9dbb41d7311ca6f17314091b7af3#L2R644
-        #
-        my @queues =
-            uniq
-            grep { length $_ }
-            map  { $_->namespace }
-            values %{$app->dispatcher->action_hash};
+        my @queues = grep { length $_ }
+                     map  { $app->controller($_)->action_namespace } $app->controllers;
 
         # connect up
         my %template = %{$app->config->{'Engine::Stomp'}};
+        my $add_header = delete $template{subscribe_header};
+        if (ref($add_header) ne 'HASH') {
+            $add_header = undef;
+        }
         $self->connection(Net::Stomp->new(\%template));
         $self->connection->connect();
         $self->conn_desc($template{hostname}.':'.$template{port});
@@ -95,10 +91,20 @@ sub run {
         # subscribe, with client ack.
         foreach my $queue (@queues) {
                 my $queue_name = "/queue/$queue";
-                $self->connection->subscribe({
-                                              destination => $queue_name,
-                                              ack         => 'client'
-                                             });
+                my $header_hash = {
+                    destination => $queue_name,
+                    ack         => 'client',
+                };
+
+                # add the additional headers - yes I know it overwrites but
+                # thats the dev's problem?
+                if (keys %{$add_header}) {
+                    foreach my $key (keys %{$add_header}) {
+                        $header_hash->{$key} = $add_header->{$key};
+                    }
+                }
+
+                $self->connection->subscribe($header_hash);
         }
 
         # enter loop...
@@ -194,7 +200,6 @@ sub handle_stomp_message {
     # ack the message off the queue now we've replied / processed
     $self->connection->ack( { frame => $frame } );
 }
-
 =head2 handle_stomp_error
 
 Log any Stomp error frames we receive.
@@ -210,3 +215,11 @@ sub handle_stomp_error {
 
 __PACKAGE__->meta->make_immutable;
 
+=head1 CONFIGURATION
+
+=head2 subscribe_header
+
+Add additional header key/value pairs to the subscribe message sent to the
+message broker.
+
+=cut