Welcome to MLink Developer Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
469 views
in Technique[技术] by (71.8m points)

PHP中使用RabbitMQ的confirm模式,发送多条消息会报错

首先,一个正常的发送消息多次发送是没问题的:

echo $msg->body . PHP_EOL;
$res = $this->channel->basic_publish($msg, $exchangeName, $routingKey, $mandatory);
data:2020-05-18 09:38:17 , message:5ec1e709a1574
data:2020-05-18 09:38:17 , message:5ec1e709a2a9c
data:2020-05-18 09:38:17 , message:5ec1e709a336b
data:2020-05-18 09:38:17 , message:5ec1e709a3c0b
data:2020-05-18 09:38:17 , message:5ec1e709a4628

之后引入了confirm模式,不管是阻塞等待还是异步回调都会出问题:

echo $msg->body . PHP_EOL;
$this->channel->confirm_select();
$res = $this->channel->basic_publish($msg, $exchangeName, $routingKey, $mandatory);
$this->channel->wait_for_pending_acks();
data:2020-05-18 09:40:02 , message:5ec1e772792a8
data:2020-05-18 09:40:02 , message:5ec1e7727ab3e


  [Exception]
  Server ack'ed unknown delivery_tag "2"
$this->channel->set_ack_handler(function (AMQPMessage $msg) {
    echo "发送成功", $msg->getBody(),$msg->getDeliveryTag(), PHP_EOL;
});
$this->channel->set_nack_handler(function (AMQPMessage $msg) {
    echo "发送失败", $msg->getBody(),$msg->getDeliveryTag(), PHP_EOL;
});
echo $msg->body . PHP_EOL;
$this->channel->confirm_select();
$res = $this->channel->basic_publish($msg, $exchangeName, $routingKey, $mandatory);
$this->channel->wait_for_pending_acks();
data:2020-05-18 09:40:47 , message:5ec1e79f487ca
发送成功data:2020-05-18 09:40:47 , message:5ec1e79f487ca1
data:2020-05-18 09:40:47 , message:5ec1e79f4a7e4


  [Exception]
  Server ack'ed unknown delivery_tag "2"

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)
等待大神解答

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to MLink Developer Q&A Community for programmer and developer-Open, Learning and Share
...