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
> > > > > >
> > > > >
> > > >
> > >
> >
>

Reply via email to