Hi, Are queued messages supposed to be delivered in order? I have a simple STOMP Perl script below that shows messages delivered out of order. I've run it against AMQ 4.1.1 and 5.2.0 in with both persistent and non-persistent messages. Note from the message ids and timestamps that the newer message is delivered first.
Is there a way to force message delivery order? I don't think selectors allow for ordering, right? Our application doesn't particularly depend on message order but this behavior is causing my unit tests to fail every third time they are run. :( This also seems problematic for STOMP clients using "client" ack mode. Since newer messages are delivered first, ack'ing the newer message will implicitly ack the older message which has not even been delivered yet. Any help is appreciated. Thanks, Roger $ perl out-of-order.pl OUT OF ORDER!!! Frame 1: $VAR1 = bless( { 'body' => 'test2', 'headers' => { 'priority' => '0', 'timestamp' => '1240956094252', 'destination' => '/queue/testOutOfOrder', 'message-id' => 'ID:thedude.local-58168-1240956067250-3:3897:-1:1:2', 'expires' => '0' }, 'command' => 'MESSAGE' }, 'Net::Stomp::Frame' ); Frame 2: $VAR1 = bless( { 'body' => 'test1', 'headers' => { 'priority' => '0', 'timestamp' => '1240956094247', 'destination' => '/queue/testOutOfOrder', 'message-id' => 'ID:thedude.local-58168-1240956067250-3:3897:-1:1:1', 'expires' => '0' }, 'command' => 'MESSAGE' }, 'Net::Stomp::Frame' ); #!/usr/bin/env perl use strict; use Net::Stomp; use Data::Dumper; my $stomp = Net::Stomp->new( { 'hostname' => 'localhost', 'port' => '61613' } ); $stomp->connect( { 'login' => 'hello', 'passcode' => 'there' } ); $stomp->subscribe( { 'destination' => '/queue/testOutOfOrder', 'ack' => 'client', 'activemq.prefetchSize' => 1 } ); while ($stomp->can_read({'timeout' => 1})) { my $frame = $stomp->receive_frame(); $stomp->ack({'frame' => $frame}); } $stomp->disconnect(); while (1) { doit(); } sub doit { my $stomp = Net::Stomp->new( { 'hostname' => 'localhost', 'port' => '61613' } ); $stomp->connect( { 'login' => 'hello', 'passcode' => 'there' } ); $stomp->send({ 'destination' => '/queue/testOutOfOrder', 'body' => 'test1', 'persistent' => 'true'} ); $stomp->send({ 'destination' => '/queue/testOutOfOrder', 'body' => 'test2', 'persistent' => 'true'} ); $stomp->disconnect(); my $stomp = Net::Stomp->new( { 'hostname' => 'localhost', 'port' => '61613' } ); $stomp->connect( { 'login' => 'hello', 'passcode' => 'there' } ); $stomp->subscribe( { 'destination' => '/queue/testOutOfOrder', 'ack' => 'client', 'activemq.prefetchSize' => 1 } ); my $frame1 = $stomp->receive_frame(); $stomp->ack({'frame' => $frame1}); my $frame2 = $stomp->receive_frame(); $stomp->ack({'frame' => $frame2}); $stomp->disconnect(); if ($frame1->{'body'} ne 'test1') { print "OUT OF ORDER!!!\n"; print "Frame 1: " . Dumper($frame1); print "Frame 2: " . Dumper($frame2); } }