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"}

 

posted @ 2022-06-09 17:25  sblack  阅读(231)  评论(0编辑  收藏  举报