• RabbitMq基础二之direct模式


    生产者代码:

    $conConfig = [
    	'host'		=>	'127.0.0.1',
    	'port'		=>	'5672',
    	'login'		=>	'sblack',
    	'password'	=>	'123456',
    	'vhost'		=>	'/',
    ];
    
    //direct模式
    try {
    	$connection = new AMQPConnection($conConfig);
    	$connection->connect();
    	if(!$connection->isConnected()){
    		echo 'rabbitmq connect fail';
    		die();
    	}
    	$e_name = "direct_change";
    	$k_route = array(0=>"key_1",1=>"key_2");
    	
    	//新建通道
    	$channel = new AMQPChannel($connection);
    	
    	//创建交换机
    	$exchange = new AMQPExchange($channel);
    	$exchange->setName($e_name);
    	$exchange->setType(AMQP_EX_TYPE_DIRECT);	//交换机类型为direcdt
    	$exchange->setFlags(AMQP_DURABLE);			//持久化
    	$exchange->declareExchange();	
    	
    	//创建队列1
    	$queue = new AMQPQueue($channel);
    	$queue->setName("key_1");
    	$queue->setFlags(AMQP_DURABLE);
    	$queue->declareQueue();
    	$queue->bind($e_name,"key_1");
    	
    	//创建队列2
    	$queue = new AMQPQueue($channel);
    	$queue->setName("key_2");
    	$queue->setFlags(AMQP_DURABLE);
    	$queue->declareQueue();
    	$queue->bind($e_name,"key_2");
    	
    	for($i=6;$i<20;$i++){
    		$message = [
    			'name'	=> 'direct交换机,消息'.$i,
    			'info'	=>	'hello world',
    		];
    		//发送消息,为消息指定routing key,成功返回true,失败返回false
    		$state = $exchange->publish(json_encode($message,JSON_UNESCAPED_UNICODE),$k_route[$i%2]);
    		if($state){
    			echo 'success'.PHP_EOL;
    		}else{
    			echo 'fail'.PHP_EOL;
    		}
    	}
    	//关闭$channel
    	$channel->close();
    	
    	//关闭连接
    	$connection->disconnect();
    	
    } catch(Execption $e){
    	echo $e->getMessage();
    }
    

     执行完在MQ管理界面上会创建如下:

    消费者1从key1中获取数据,消费者2从key2中获取数据:

    $conConfig = [
    	'host'		=>	'127.0.0.1',
    	'port'		=>	'5672',
    	'login'		=>	'sblack',
    	'password'	=>	'123456',
    	'vhost'		=>	'/',
    ];
    
    //direct模式
    try {
    	$connection = new AMQPConnection($conConfig);
    	$connection->connect();
    	if(!$connection->isConnected()){
    		echo 'rabbitmq connect fail';
    		die();
    	}
    	$e_name = "direct_change";
    	$routkey1 = "key_1";
    	//新建channel
    	$channel = new AMQPChannel($connection);
    	
    	//声明queue
    	$queue = new AMQPQueue($channel);
    	$queue->setName($routkey1);
    	$queue->setFlags(AMQP_DURABLE);
    	$queue->declareQueue();
    	
    	$queue->consume(function($envelope,$queue){
    		$msg = $envelope->getBody().PHP_EOL;
    		error_log($msg,3,"key_1.log");
    	},AMQP_AUTOACK);
    	
    	//关闭连接
    	$connection->disconnect();
    	
    } catch(Execption $e){
    	echo $e->getMessage();
    }
    

     执行结果 key_1中的消息被取出:

    {"name":"direct交换机,消息6","info":"hello world"}
    {"name":"direct交换机,消息8","info":"hello world"}
    {"name":"direct交换机,消息10","info":"hello world"}
    {"name":"direct交换机,消息12","info":"hello world"}
    {"name":"direct交换机,消息14","info":"hello world"}
    {"name":"direct交换机,消息16","info":"hello world"}
    {"name":"direct交换机,消息18","info":"hello world"}
    
  • 相关阅读:
    Examples
    Examples
    Examples
    Examples
    Examples
    Examples
    Examples
    Examples
    Examples
    如何把随机数或者对象添加到ArrayList集合
  • 原文地址:https://www.cnblogs.com/sblack/p/16360112.html
Copyright © 2020-2023  润新知