Found a bug related to this https://issues.apache.org/jira/browse/AMQ-3653

It's fixed on the trunk now. On the current version of broker, just avoid
having content-length header in your acks.

Regards
-- 
Dejan Bosanac - http://twitter.com/dejanb
-----------------
The experts in open source integration and messaging - http://fusesource.com
ActiveMQ in Action - http://www.manning.com/snyder/
Blog - http://www.nighttale.net


On Wed, Jan 4, 2012 at 10:25 PM, Christopher Wood <
christopher_w...@pobox.com> wrote:

> I have a problem with ActiveMQ not removing messages from a queue when the
> ack is received from PHP. Do you list denizens possibly know what's going
> on?
>
> As background, it appears that Net::STOMP::Client adds a content-length
> header to a message, whereas PHP's Stomp doesn't. When Net::STOMP::Client
> sends an ack it only sends the message-id, whereas PHP's Stomp sends back
> all the message headers. When the message headers include a content-length,
> ActiveMQ doesn't remove the message from its queue.
>
>
> Below are some sample message fragments as copied from my tcpdumps. I've
> obfuscated the hostname.
>
> (By "works" below I mean that the ack does cause ActiveMQ to remove the
> message from the queue. By "doesn't work" below I mean that the ack doesn't
> cause ActiveMQ to remove the message from the queue.)
>
>
> For instance, if these are the message headers (enqueued by
> Net::STOMP::Client):
>
> MESSAGE
> message-id:ID:hostname.com-56519-1325672705030-4:3316:-1:1:1
> destination:/queue/ldapcwood
> timestamp:1325697918445
> expires:0
> content-length:8511
> priority:4
>
>
> Then the php ack doesn't work:
>
> ACK
> redelivered:true
> message-id:ID:hostname.com-56519-1325672705030-4:3316:-1:1:1
> destination:/queue/ldapcwood
> timestamp:1325697918445
> expires:0
> content-length:8511
> priority:4
>
>
>
> If these are the message headers (enqueued by php):
>
> MESSAGE
> message-id:ID:hostname.com-56519-1325672705030-4:3044:-1:1:1
> destination:/queue/ldapin.cwood
> timestamp:1325695920628
> expires:0
> priority:4
>
> Then the php ack works:
>
> ACK
> message-id:ID:hostname.com-56519-1325672705030-4:3044:-1:1:1
> destination:/queue/ldapin.cwood
> timestamp:1325695920628
> expires:0
> priority:4
>
>
>
>
> This is the only sort of ack that Net::STOMP::Client produces for any set
> of message headers, and ActiveMQ always removes the message from the queue:
>
> ACK
> message-id:ID:hostname.com-56519-1325672705030-4:3232:-1:1:1
>
>
>
>
> My ActiveMQ host's versions are:
>
> Platform: Debian Stable (Squeeze)
> ActiveMQ: 5.5.1
> Java: OpenJDK 6b18
>
> My client host's versions are:
>
> Platform: Debian Stable (Squeeze)
>
> Perl: 5.10.1
> Net::STOMP::Client: 1.3
>
> PHP: 5.3.3 ("with Suhosin-Patch")
> PECL Stomp: 1.0.3
>
> (Although I saw the same behaviour with FuseSource's Stomp client, version
> 1.0.0.)
>
>
>
>
>
> To get the payload, I did this:
>
> echo -n bar >/tmp/bar
>
> Here are the perl/php fragments I use to reproduce this. I've obfuscated
> the hostnames, usernames, and passwords.
>
> This enqueues a message:
>
> ----------------------------------------------------------------------
> #!/usr/bin/perl
>
> use warnings;
> use strict;
>
> use File::Slurp;
> use Net::STOMP::Client;
>
> my $queue = '/queue/ldapcwood';
>
> my $stomp = Net::STOMP::Client->new(
>    uri     => 'stomp://hostname.com:61612',
>    timeout => { connect => 5, connected => 5, receive => 5, send => 5 }
> );
>
> my $connect = $stomp->connect( login => 'cwood', passcode => 'pass' );
>
> my $payload = read_file('/tmp/bar');
>
> $stomp->send( destination => $queue, body => $payload );
>
> $stomp->disconnect();
> ----------------------------------------------------------------------
>
>
> This enqueues a message:
>
> ----------------------------------------------------------------------
> <?php
>
> $queue  = '/queue/ldapcwood';
>
> $msg = file_get_contents('/tmp/bar');
>
> try {
>    $stomp = new Stomp('tcp://hostname.com:61612', 'cwood', 'pass');
> } catch(StompException $e) {
>    die('Connection failed: ' . $e->getMessage());
> }
>
> $stomp->send($queue, $msg);
>
> unset($stomp);
>
> ?>
> ----------------------------------------------------------------------
>
>
> This dequeues a message:
>
> ----------------------------------------------------------------------
> <?php
>
> $queue  = '/queue/ldapcwood';
>
> try {
>    $stomp = new Stomp('tcp://hostname.com:61612', 'cwood', 'pass');
> } catch(StompException $e) {
>    die('Connection failed: ' . $e->getMessage());
> }
>
> $stomp->subscribe($queue, array('ack' => 'client'));
>
> $frame = $stomp->readFrame();
> var_dump($frame);
>
> if ($stomp->ack($frame)) {
>  #nothing
> } else {
>  var_dump($stomp->error());
> }
>
> unset($stomp);
>
> ?>
> ----------------------------------------------------------------------
>

Reply via email to