【问题标题】:RabbitMQ missing channel reference in message delivery_info消息传递信息中的 RabbitMQ 缺少通道引用
【发布时间】:2015-02-26 11:44:58
【问题描述】:

我目前正在使用 basic_get 从 rabbitMQ 获取消息后实现一些逻辑,而不会自动发送接收到的消息的 ack。

根据教程here(消息确认部分),我无法在消息本身中找到通道引用并像上面链接中提到的那样发送确认:

$msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);

那是因为在我的消息传递信息数组中没有这样的频道。
我想知道它怎么会丢失。

编辑:基本获取的代码sn-p

  $msg = $this->channel->basic_get($this->queueName, false);  

这是我的消息的 var_dump:(黄色部分)
l

【问题讨论】:

  • 请同时提供您的 basic_get 的截图,您是否在那里设置了 autoAck 参数?
  • @jylipaa:添加见上文
  • 嗯,这似乎很好。您能否还显示发布部分,包括通道/队列声明和发布
  • $msg = new AMQPMessage($data); $this->channel->basic_publish($msg,'',$this->queueName);
  • @jylipaa:有什么新想法吗?

标签: php rabbitmq amqp php-amqplib


【解决方案1】:

根据 AMQP 规范 get-okbasic-get 的返回值不包括通道,这与 basic-deliver 发生的情况形成对比,basic-deliver 在消息到达以 @ 开头的消费者时使用987654326@.

所以库的行为是正确的。

https://github.com/videlalvaro/php-amqplib/blob/master/PhpAmqpLib/Channel/AMQPChannel.php#L1022

https://github.com/videlalvaro/php-amqplib/blob/master/PhpAmqpLib/Channel/AMQPChannel.php#L956

【讨论】:

    【解决方案2】:

    使用 basic_get 时(似乎不鼓励使用 basic_consume 代替),尝试使用 delivery_tag 直接从频道确认消息

    $this->channel->basic_ack($msg->delivery_info['delivery_tag']);

    【讨论】:

    • 关于rabbitMQ声明$this->connection = new AMQPConnection($this->queueIP, $this->queuePort, $this->queueUsername, $this->queuePassword);没有什么有趣的
    • Basic_get 有什么问题?这和basic_consume有什么区别?
    • 好吧,如果您的唯一目标是只获取一条消息,那么 get 工作正常。但是当您需要等待消息或需要处理多个消息时,就会立即出现缓慢。并检查队列声明,但要连接声明。您在 $this->channel->queue_declare() 中有什么作为参数?
    • $this->channel->queue_declare($this->queueName, false, false, false, false); 抱歉回复晚了,队列声明好吗?
    • 嗯,看起来也不错。我的想法不多了。毕竟我建议看一下 basic_consume,有一些工作示例:rabbitmq.com/tutorials/tutorial-one-php.html
    猜你喜欢
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多