消息确认模式confirm

服务端:

<?php
require_once __DIR__ . '/../../vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;

$connection = new AMQPStreamConnection('127.0.0.1', 5672, 'guest', 'guest');
$channel = $connection->channel();

$exchange='order_eval'; //交换机名
$queue_name='order_eval_list'; //消息队列载体
$exchange_type='direct'; //交换机类型
$routing_key=''; //路由关键字
$durable=true; //是否持久化 true false

//第四个参数标识是否持久化【durable】
$channel->exchange_declare($exchange, $exchange_type, false, $durable, false);
//第三个参数标识是否持久化【durable】
$channel->queue_declare($queue_name, false, $durable, false, false);
$channel->queue_bind($queue_name, $exchange,$routing_key);

$res=array();
$callback = function($msg) {
    #获取推送的信息
        echo '获取信息:', $msg->body, "\n";
        $res= $msg->body;
        //file_put_contents('file.log',$res,FILE_APPEND);
    //信息标签
        echo $msg->delivery_info['delivery_tag']. "\n";
    //消息应答机制
        $result=mt_rand(0,1); #模拟信息处理逻辑, 逻辑成功-true  逻辑处理失败-false
        if(!empty($result)){
            #表示逻辑处理完成,并处理成功,使用ack机制应答信息(ack应答成功消息将从队列消失)
            echo 'success'.PHP_EOL;
            $msg->ack();
        }else{
            #表示逻辑处理失败,需要把信息重回队列,重新消费,使用nack机制
            echo 'fail'.PHP_EOL;
            echo "将消息打回,重回队列:";
            $msg->nack(true);
        }
        // $msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']); //手动发送ACK应答
        //exit();
};

//在默认情况下,消息确认机制是关闭的。现在是时候开启消息确认机制,将basic_consumer的第四个参数设置为false(true表示不开启消息确认),并且工作进程处理完消息后发送确认消息。
$channel->basic_consume($queue_name, '', false, false, false, false, $callback);

while(count($channel->callbacks)) {
    $channel->wait();
}
$channel->close();
$connection->close();
return $res;

客户端:

<?php
require_once __DIR__ . '/../../vendor/autoload.php';
//引入 php-amqplib 类库并且 使用必要的类:
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

//创建一个 RabbitMQ 的连接:
$connection = new AMQPStreamConnection('127.0.0.1', 5672, 'guest', 'guest');
$channel = $connection->channel();

$exchange='order_eval'; //交换机名
$exchange_type='direct'; //交换机类型
$durable=true; //标识是否持久化
$routing_key='';//路由关键字
//声明一个队列给我们发送消息使用;然后我们就可以将消息发送到队列中;第四个参数标识是否持久化【durable】
$channel->exchange_declare($exchange, $exchange_type, false, $durable, false);
//设为confirm模式
$channel->confirm_select();
//推送的信息内容
$data=array(
        'eval_type'=>1,
        'identifying'=>77,
        'nickname'=>'nickname',
        'rider_id'=>21,
        'dispatch_no'=>'20180427105905',
        'score'=>'3.5',
        'tag_ids'=>'9,10',
        'is_anonymou'=>0,
        'content'=>'提交的内容',
        'add_time'=>date('Y-m-d H:i:s')
);

$data2=json_encode($data);

$msg = new AMQPMessage($data2);
$channel->basic_publish($msg, $exchange,$routing_key);

//消息发送状态回调(成功回调)
$channel -> set_ack_handler(function (AMQPMessage $message){
          echo "成功发送了内容:".$message->body;
});
 //失败回调
$channel -> set_nack_handler(function (AMQPMessage $message){
          echo "返回的失败信息:".$message->body;
 });
$channel->wait_for_pending_acks();
$channel->close();
$connection->close();

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值