gbvc 发表于 2015-12-26 15:00:12

perl与php通过消息队列通信的小问题

  最近在写网站后台的php程序时,需要从activemq这个消息队列读取消息进行处理。为了测试的需要,自己手动写了一个perl程序模拟发送消息。在实际操作中发现,按照cpan上Net::STOMP::Client模块的事例代码进行消息发送时,会造成消息无法从消息队列中取走的问题。即当消息被正确读取后,消息仍停留在消息队列中。自己google了半天,发现了这个帖子:
  http://activemq.2283324.n4.nabble.com/php-ack-problem-td4262920.html
  
  经过研究一番发现因为perl发送消息队列时会默认在消息头添加content-length字段,而php在读取消息时会因为设置了这个字段而无法将消息取走。汗一个........
  在CPAN上有这样一段:
  If you do not supply a "content-length" header, following the protocol recommendations, a "content-length" header will be added if the frame has a body.
  If you do supply a numerical "content-length" header, it will be used as is. Warning: this may give unexpected results if the supplied value does not match the body length. Use only with caution!
  Finally, if you supply an empty string as the "content-length" header, it will not be sent, even if the frame has a body. This can be used to mark a message as being a TextMessage for ActiveMQ.
  
  附上perl的发送代码的例子,消息队列用的是activemq,perl用到了Net::STOMP模块
  perl的:



#!/usr/bin/perl
use 5.010;
use Net::STOMP::Client;
$ACTIVEMQ_IP = '192.168.0.22';
$ACTIVEMQ_PORT = '12345';
$ACTIVEMQ_USER   = 'asdf';
$ACTIVEMQ_PASSWORD = 'asdf';
$ACTIVEMQ_CLIENT_QUEUE = '/queue/aaaaaaaaaaaaaaaaaa';
$stomp = Net::STOMP::Client->new(host => $ACTIVEMQ_IP, port => $ACTIVEMQ_PORT);
$stomp->connect(login => $ACTIVEMQ_USER, passcode => $ACTIVEMQ_PASSWORD);
$json = qq({"name":"moon","id":2,"message":"peace and love"});
$stomp->send(destination => $ACTIVEMQ_CLIENT_QUEUE, body => $json, "content-length" => '');    #关键
$stomp->disconnect();
say 'send ok';
  Over~
页: [1]
查看完整版本: perl与php通过消息队列通信的小问题