首先,一个正常的发送消息多次发送是没问题的:
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"