php+rabbitmq实践(生产者消息确认)

生产者:

public function simpleSend(){
    //连接rq
    $conn = new AMQPStreamConnection('192.168.2.184',5672,'guest','guest');
    //建立通道
    $channel = $conn->channel();
    //确认投放队列,并将队列持久化
    $channel->queue_declare('hello', false, true, false, false);
    //异步回调消息确认
    $channel->set_ack_handler(
        function (AMQPMessage $message) {
            echo "Message acked with content " . $message->body . PHP_EOL;
        }
    );
    $channel->set_nack_handler(
        function (AMQPMessage $message) {
            echo "Message nacked with content " . $message->body . PHP_EOL;
        }
    );
    //开启消息确认
    $channel->confirm_select();
    //建立消息,并消息持久化
    $msg = new AMQPMessage('kingblanc!',array('delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT));
    $channel->basic_publish($msg, '', 'hello');

    echo " [x] Sent 'Hello World!'\n";
    //阻塞等待消息确认
    $channel->wait_for_pending_acks();

    $channel->close();
    $conn->close();
}

public function  fanoutSend(){
    $conn = new  AMQPStreamConnection('192.168.2.184',5672,'guest','guest');
    $channel = $conn -> channel();
    //创建交换机
    $channel -> exchange_declare('logs','fanout',false,true,false);
    //创建消息,并持久化
    $message = new AMQPMessage('hello every one',array('delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT));

    //消息发送状态回调
    $channel -> set_ack_handler(function (AMQPMessage $message){
        echo '发送成功::'.$message -> body;
    });

    $channel -> set_nack_handler(function (AMQPMessage $message){
        echo '发送失败::'.$message -> body;
    });
    //开启消息发送状态监听
    $channel -> confirm_select();
    //发送消息
    $channel -> basic_publish($message,'logs');
    //阻塞等待消息确认
    $channel -> wait_for_pending_acks();

    $channel -> close();
    $conn -> close();
}

public function  directSend(){
    $connection = new AMQPStreamConnection('192.168.2.184',5672,'guest','guest');
    $channel = $connection -> channel();
    $channel -> exchange_declare('direct_logs','direct',false,true,false);
    $message = new AMQPMessage('hello,balck',array('delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT));

    //消息发送状态回调
    $channel -> set_ack_handler(function (AMQPMessage $message){
        echo '发送成功::'.$message -> body;
    });

    $channel -> set_nack_handler(function (AMQPMessage $message){
        echo '发送失败::'.$message -> body;
    });
    //开启消息发送状态监听
    $channel -> confirm_select();
    //发送消息
    $channel -> basic_publish($message,'direct_logs','direct_black');
    //阻塞等待消息确认
    $channel -> wait_for_pending_acks();

    $channel -> close();
    $connection -> close();
}

 

消费者:

private function consumer(){
    $conn = new AMQPStreamConnection('192.168.2.184',5673,'guest','guest');
    $channel = $conn->channel();

    $channel->queue_declare('hello', false, true, false, false);

    echo ' [*] Waiting for messages. To exit press CTRL+C', "\n";

    $callback = function($msg) {
        echo " [x] Received ", $msg->body, "\n";
        $msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
    };

    //开启消息确认模式
    $channel->basic_consume('hello', '', false, false, false, false, $callback);

    while(count($channel->callbacks)) {
        $channel->wait();
    }

    $channel->close();
    $conn->close();
}

//消息争抢模式
private function consumer_bos(){
    $conn = new AMQPStreamConnection('192.168.2.184',5672,'guest','guest');
    $channel = $conn->channel();

    $channel->queue_declare('hello', false, true, false, false);

    echo ' [*] Waiting for messages. To exit press CTRL+C', "\n";

    $callback = function($msg) {
        echo " [x] Received ", $msg->body, "\n";
        sleep(3);
        $msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
    };

    //开启消息确认模式
    $channel->basic_consume('hello', '', false, false, false, false, $callback);
    //开启消息争抢
    $channel->basic_qos(null, 1, null);
    while(count($channel->callbacks)) {
        $channel->wait();
    }

    $channel->close();
    $conn->close();
}

//fanout消息队列监听
private  function  consumer_fanout(){
    $conn = new AMQPStreamConnection('192.168.2.184',5672,'guest','guest');
    $channel = $conn->channel();
    $channel->exchange_declare('logs', 'fanout', false, true, false);
    //获取临时队列
    list($queue_name, ,) = $channel->queue_declare("", false, false, true, false);
    //绑定队列到交换机
    $channel->queue_bind($queue_name, 'logs');

    echo ' [*] Waiting for messages. To exit press CTRL+C', "\n";

    $callback = function($msg) {
        echo " [x] Received ", $msg->body, "\n";
        sleep(3);
        $msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
    };

    //开启消息确认模式
    $channel->basic_consume($queue_name, '', false, false, false, false, $callback);

    while(count($channel->callbacks)) {
        $channel->wait();
    }

    $channel->close();
    $conn->close();
}

//fanout消息队列监听
private  function  consumer_direct(){
    $conn = new AMQPStreamConnection('192.168.2.184',5672,'guest','guest');
    $channel = $conn->channel();
    $channel-> exchange_declare('direct_logs', 'direct', false, true, false);

    //获取临时队列
    list($queue_name, ,) = $channel->queue_declare("", false, false, true, false);
    //绑定队列到交换机
    $channel->queue_bind($queue_name, 'direct_logs','direct_black');

    echo ' [*] Waiting for messages. To exit press CTRL+C', "\n";

    $callback = function($msg) {
        echo " [x] Received ", $msg->body, "\n";
        sleep(3);
        $msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
    };

    //开启消息确认模式
    $channel->basic_consume($queue_name, '', false, false, false, false, $callback);

    while(count($channel->callbacks)) {
        $channel->wait();
    }

    $channel->close();
    $conn->close();
}

你可能感兴趣的:(消息队列)