Thanks. That works! On Mon, Feb 9, 2009 at 3:10 AM, Dejan Bosanac <de...@nighttale.net> wrote:
> Hi Roger, > > this is the normal behavior of the "client" acknowledgment mode. The broker > acknowledges all messages up to the one you specified. So when you ack > message 3, message 2 is also acked so when you try to ack it later again > you > receive an error. > > The solution for your use case would be to use "client-individual" ack mode > as described here > > http://issues.apache.org/activemq/browse/AMQ-1874 > > Unfortunately it isn't document anywhere, but I have it now on my todo > list. > > Cheers > -- > Dejan Bosanac > > Open Source Integration - http://fusesource.com/ > ActiveMQ in Action - http://www.manning.com/snyder/ > Blog - http://www.nighttale.net > > > On Sat, Feb 7, 2009 at 3:58 AM, Roger Hoover <roger.hoo...@gmail.com> > wrote: > > > Hi Dejan, > > > > Thanks again for the quick response. Here is a very simple Perl unit > test > > that illustrates the bug. I don't do too much work with Java so if you > > really don't mind translating it, I appreciate it. > > > > Thanks, > > > > Roger > > > > #!/usr/bin/env perl > > > > use strict; > > use Net::Stomp; > > use Data::Dumper; > > use Test::More tests => 1; > > > > my $stomp = Net::Stomp->new( { 'hostname' => 'localhost', 'port' => > '61613' > > } ); > > $stomp->connect( { 'login' => 'hello', 'passcode' => 'there' } ); > > > > #Make sure queue is empty from previous tests > > while($stomp->can_read({'timeout' => 1})) { > > $stomp->receive_frame(); > > } > > > > # Enqueue three test messages > > $stomp->send({ 'destination' => '/queue/testOutOfOrderAck', 'body' => > > 'message1' } ); > > $stomp->send({ 'destination' => '/queue/testOutOfOrderAck', 'body' => > > 'message2' } ); > > $stomp->send({ 'destination' => '/queue/testOutOfOrderAck', 'body' => > > 'message3' } ); > > > > # Subscribe to the queue (with prefetchSize >= 3) and receive the three > > test > > messages > > $stomp->subscribe( > > { destination => '/queue/testOutOfOrderAck', > > 'ack' => 'client', > > 'activemq.prefetchSize' => 10 > > } > > ); > > my $frame1 = $stomp->receive_frame(); > > my $frame2 = $stomp->receive_frame(); > > my $frame3 = $stomp->receive_frame(); > > > > #Ack messages out of order (specifically, ack message 2 after message 3) > > $stomp->ack({'frame' => $frame1}); > > $stomp->ack({'frame' => $frame3}); > > $stomp->ack({'frame' => $frame2}); > > > > my $error = 0; > > #Wait max of 1 second for the broker to send an error frame > > if ($stomp->can_read({'timeout' => 1})) { > > my $frame = $stomp->receive_frame(); > > if ($frame->{'command'} eq 'ERROR') { > > $error = 1; > > print "Received error: " . Dumper($frame); > > } > > } > > $stomp->disconnect; > > > > #Assert that no error was received > > ok(!$error, "Ack previous message after prior message"); > > > > On Mon, Jan 26, 2009 at 12:19 AM, Dejan Bosanac <de...@nighttale.net> > > wrote: > > > > > It would be ideal to create a test case using simple Java API > > > > > > http://activemq.apache.org/stomp.html#Stomp-JavaAPI > > > > > > and add it to the > > > > > > > > > > > > http://svn.apache.org/viewvc/activemq/trunk/activemq-core/src/test/java/org/apache/activemq/transport/stomp/StompTest.java?view=markup > > > > > > If Perl is easier for you, just send it and I'll translate it to the > Java > > > test case. > > > > > > Cheers > > > -- > > > Dejan Bosanac > > > > > > Open Source Integration - http://fusesource.com/ > > > ActiveMQ in Action - http://www.manning.com/snyder/ > > > Blog - http://www.nighttale.net > > > > > > > > > On Fri, Jan 23, 2009 at 7:24 PM, Roger Hoover <roger.hoo...@gmail.com > > > >wrote: > > > > > > > Hi Dejan, > > > > > > > > Thanks for the reply. Do you need it in a particular language? I > > could > > > > easily create a test case in Perl for it. > > > > > > > > Roger > > > > > > > > On Fri, Jan 23, 2009 at 8:31 AM, Dejan Bosanac <de...@nighttale.net> > > > > wrote: > > > > > > > > > It shouldn't behave that way. Can you create a test case to > simulate > > > this > > > > > behavior? > > > > > > > > > > Cheers > > > > > -- > > > > > Dejan Bosanac > > > > > > > > > > Open Source Integration - http://fusesource.com/ > > > > > ActiveMQ in Action - http://www.manning.com/snyder/ > > > > > Blog - http://www.nighttale.net > > > > > > > > > > > > > > > On Fri, Jan 23, 2009 at 10:18 AM, Roger Hoover < > > roger.hoo...@gmail.com > > > > > >wrote: > > > > > > > > > > > I'm experiencing the same issue, both on ActiveMQ 4.1.1 and > 5.2.0. > > > > > > > > > > > > Two questions: > > > > > > 1) It seems like broker is accepting the ACK and erroneously > > replying > > > > > with > > > > > > the ERROR message. Is that correct? > > > > > > 2) Is this a bug and an intentional design to disallow STOMP > > clients > > > > from > > > > > > handle messages concurrently? > > > > > > > > > > > > Any insight is appreciated. Thanks, > > > > > > > > > > > > Roger > > > > > > > > > > > > On Mon, Oct 22, 2007 at 3:42 AM, Sebastjan Trepca < > > tre...@gmail.com> > > > > > > wrote: > > > > > > > > > > > > > Hi all, > > > > > > > > > > > > > > I'm having problems with acknowledge order in ActiveMQ 4.1.1 > > using > > > > > > > STOMP protocol. I'm using a queue with async mode on. > > > > > > > > > > > > > > I'm also using these headers: > > > > > > > > > > > > > > SUBSCRIBE > > > > > > > activemq.dispatchAsync:'true' > > > > > > > activemq.noLocal:'true', > > > > > > > activemq.retroactive:'true', > > > > > > > activemq.prefetchSize:1000, > > > > > > > activemq.maximumPendingMessageLimit:1000, > > > > > > > > > > > > > > MESSAGE > > > > > > > expires:0, > > > > > > > persistent:'true', > > > > > > > priority:0, > > > > > > > > > > > > > > > > > > > > > > > > > > > > The problem occurs when I try to acknowledge messages in > > different > > > > > > > order then they were sent. > > > > > > > > > > > > > > So if producer sends messages with IDs: > > > > > > > 1 > > > > > > > 2 > > > > > > > 3 > > > > > > > > > > > > > > > > > > > > > I have to acknowledge them in the same order: > > > > > > > 1 > > > > > > > 2 > > > > > > > 3 > > > > > > > > > > > > > > Or else I get this error: > > > > > > > > > > > > > > ERROR org.apache.activemq.transport.stomp.ProtocolException: > > > > > > > Unexpected ACK received for message-id > > > > > > > [ID:localhost-47986-1193059223135-3:5:-1:1:26055] > > > > > > > at > > > > > > > > > > > > > > > > > > > > > > > > > > > > org.apache.activemq.transport.stomp.ProtocolConverter.onStompAck(ProtocolConverter.java:242) > > > > > > > at > > > > > > > > > > > > > > > > > > > > > > > > > > > > org.apache.activemq.transport.stomp.ProtocolConverter.onStompCommad(ProtocolConverter.java:141) > > > > > > > at > > > > > > > > > > > > > > > > > > > > > > > > > > > > org.apache.activemq.transport.stomp.StompTransportFilter.onCommand(StompTransportFilter.java:71) > > > > > > > at > > > > > > > > > > > > > > > > > > > > > > > > > > > > org.apache.activemq.transport.TransportSupport.doConsume(TransportSupport.java:84) > > > > > > > at > > > > > > > > > > > > > > > > org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:137) > > > > > > > at java.lang.Thread.run(Thread.java:619) > > > > > > > > > > > > > > Is this a feature or a bug? Do I need to set some extra > settings? > > > > > > > > > > > > > > Thanks, Sebastjan > > > > > > > > > > > > > > > > > > > > > > > > > > > >