此模式下,消息的routing key 和队列的 routing key 会被完全忽略,而是在交换机推送消息和队列绑定交换机时, 分别为消息和队列设置 headers 属性, 通过匹配消息和队列的 header 决定消息的分发.

producer.php

header('Content-Type: text/html; charset=utf-8');
// 连接设置
$conConfig = [
'host' => '127.0.0.1',
'port' => 5672,
'login' => 'root',
'password' => 'root',
'vhost' => '/'
]; try
{
// RabbitMQ 连接实例
$con = new AMQPConnection($conConfig);
// 发起连接
$con->connect();
// 判断连接结果,true成功,false失败
if(!$con->isConnected())
{
echo '连接失败';die;
}
// 新建通道
$channel = new AMQPChannel($con);
// 在指定通道上新建交换机,如果新建的交换机与已存在交换机重名但属性不同,会产生406错误。如果新建交换机与已存在交换机完全相同,不会有任何影响
$exchange = new AMQPExchange($channel);
// 交换机名称
$exchange->setName('test.headers');
// 交换机类型:按headers分发
$exchange->setType('headers');
// 声明交换机
$exchange->declareExchange(); // 设定消息的headers信息
$arguments = array(
'headers'=>array(
'type' => 'fruit',
'color' => 'red'
)
);
// 发送消息到交换机,即使设置routing key也会被忽略
$state = $exchange->publish('消息1', 'test.rt', AMQP_NOPARAM, $arguments);
if($state)
echo 'Success' . PHP_EOL;
else
echo 'Fail' . PHP_EOL; // 设定headers信息
$arguments = array(
'headers'=>array(
'type' => 'animal',
'color' => 'red'
)
);
$state = $exchange->publish('消息2', 'test.rt', AMQP_NOPARAM, $arguments);
if($state)
echo 'Success' . PHP_EOL;
else
echo 'Fail' . PHP_EOL; $con->disconnect();
}
catch(Exception $e)
{
echo $e->getMessage();
}

consumer.php

header('Content-Type: text/html; charset=utf-8');
// 连接设置
$conConfig = [
'host' => '127.0.0.1',
'port' => 5672,
'login' => 'root',
'password' => 'root',
'vhost' => '/'
]; try
{
$connect = new AMQPConnection($conConfig);
$connect->connect();
if(!$connect->isConnected())
{
echo '连接失败';die;
} $channel = new AMQPChannel($connect);
$exchange = new AMQPExchange($channel);
$exchange->setName('test.headers');
$exchange->setType('headers');
$exchange->declareExchange(); // 创建队列
$queue1 = new AMQPQueue($channel);
$queue2 = new AMQPQueue($channel);
// 队列名称
$queue1->setName('header.queue1');
$queue2->setName('header.queue2');
$queue1->declareQueue();
$queue2->declareQueue();
// 设定队列的headers信息,x-match:all:全匹配,消息的headers信息与队列的必须完全匹配,any:消息的headers消息与队列的任意一项匹配即可
$headers1 = array(
'x-match'=>'all',
'type'=>'fruit',
'color'=>'red'
);
$headers2 = array(
'x-match'=>'any',
'type'=>'animal',
'color'=>'red'
);
// 绑定队列到交换机, 任意设置routing key
$queue1->bind($exchange->getName(), 'queue1', $headers1);
$queue2->bind($exchange->getName(), 'queue2', $headers2); echo '队列1: ' . PHP_EOL;
while($msgEnvelope = $queue1->get(AMQP_AUTOACK))
{
$msg = $msgEnvelope->getBody();
echo $msg . PHP_EOL;
} echo PHP_EOL . '队列2: ' . PHP_EOL;
while($msgEnvelope = $queue2->get(AMQP_AUTOACK))
{
$msg = $msgEnvelope->getBody();
echo $msg . PHP_EOL;
} $connect->disconnect();
}catch(Exception $e)
{
echo $e->getMessage();
}

运行 producer.php 推送消息, 然后运行 comsumer.php 结果如下:

队列1 要求 headers 完全匹配, 所以只接受到一条消息. 队列2 要求任意匹配即可, 所以接收到两条消息.

PHP 下基于 php-amqp 扩展的 RabbitMQ 简单用例 (三) -- Header Exchange的更多相关文章

  1. PHP 下基于 php-amqp 扩展的 RabbitMQ 简单用例 (二) -- Topic Exchange 和 Fanout Exchange

    Topic Exchange 此模式下交换机,在推送消息时, 会根据消息的主题词和队列的主题词决定将消息推送到哪个队列. 交换机只会为 Queue 分发符合其指定的主题的消息. 向交换机发送消息时,消 ...

  2. PHP 下基于 php-amqp 扩展的 RabbitMQ 简单用例 (一) -- 安装 AMQP 扩展和 Direct Exchange 模式

    Windows 安装 amqp 扩展 RabbitMQ 是基于 amqp(高级消息队列协议) 协议的.使用 RabbitMQ 前必须为 PHP 安装相应的 amqp 扩展. 下载相应版本的 amqp ...

  3. PHP 下基于 php-amqp 扩展的 RabbitMQ 简单用例 (五) -- 自动 ACK、手动 ACK、NACK

    以 Direct 类型的 交换机和 Queue 的 get 方法为例. producer.php // 连接设置 $conConfig = [ 'host' => '127.0.0.1', 'p ...

  4. PHP 下基于 php-amqp 扩展的 RabbitMQ 简单用例 (四) -- Push API 和 Pull API

    RabbitMQ 中针对消息的分发提供了 Push API (订阅模式) 和 Pull API (主动获取) 两种模式. 在 PHP 中, 这两种模式分别通过 AMQPQueue 类中的 consum ...

  5. flask框架----基于flask的扩展实现的简单的页面登录

    废话不多说,直接上代码 from flask import Flask,render_template,request,redirect,session app = Flask(__name__,te ...

  6. Windows下基于python3使用word2vec训练中文维基百科语料(三)

    对前两篇获取到的词向量模型进行使用: 代码如下: import gensim model = gensim.models.Word2Vec.load('wiki.zh.text.model') fla ...

  7. gtk+3.0的环境配置及基于gtk+3.0的python简单样例

    /*********************************************************************  * Author  : Samson  * Date   ...

  8. 【RabbitMQ】4、三种Exchange模式——订阅、路由、通配符模式

    前两篇博客介绍了两种队列模式,这篇博客介绍订阅.路由和通配符模式,之所以放在一起介绍,是因为这三种模式都是用了Exchange交换机,消息没有直接发送到队列,而是发送到了交换机,经过队列绑定交换机到达 ...

  9. php的amqp扩展 安装(windows) rabbitmq学习篇

    因为RabbitMQ是由erlang语言实现的,所以先要安装erlang环境erlang 下载安装 http://www.erlang.org/download.htmlrabbitmq 下载安装 h ...

随机推荐

  1. 表单中的readOnly 和disabled

    readonly和Disabled是用在表单中的两个属性,它们都能够做到使用户不能够更改表单域中的内容.但是它们之间有着微小的差别,总结如下: disabled也可以禁用按钮和链接: <butt ...

  2. jquery 3D云

    http://www.jq22.com/jquery-info1325 http://demo.jq22.com/jquery-cloud-141217202931 下载地址: http://www. ...

  3. Jquery选择器大全、属性操作、css操作、文档、事件等

    一.简介   定义  jQuery创始人是美国John Resig,是优秀的Javascript框架: jQuery是一个轻量级.快速简洁的javaScript库. jQuery对象  jQuery产 ...

  4. linux更改用户名,域名(转载)

    转自:http://huangro.iteye.com/blog/365975 1. 我们在root权限下,使用命令: usermod -l new_user_name old_user_name 即 ...

  5. bzoj 4849: [Neerc2016]Mole Tunnels【模拟费用流】

    参考:https://www.cnblogs.com/CQzhangyu/p/6952371.html 费用流很简单,考虑但是会T. 考虑费用流的本质,流一次需要要找一个能够从当前点到达的距离最小的点 ...

  6. 51nod 1220 约数之和【莫比乌斯反演+杜教筛】

    首先由这样一个式子:\( d(ij)=\sum_{p|i}\sum_{q|j}[gcd(p,q)==1]\frac{pj}{q} \)大概感性证明一下吧我不会证 然后开始推: \[ \sum_{i=1 ...

  7. css设置页面全屏背景

    .background { background: url(xxx.png); background-size: 100% 100%; height: 100%; position: fixed; w ...

  8. ACM_最小公倍数

    Lowest Common Multiple Plus Time Limit: 2000/1000ms (Java/Others) Problem Description: 求n个数的最小公倍数. I ...

  9. 【Visual Studio Code 】使用Visual Studio Code + Node.js搭建TypeScript开发环境

    1.准备工作 Node.js Node.js - Official Site Visual Studio Code Visual Studio Code - Official Site 安装Node. ...

  10. 445 Add Two Numbers II 两数相加 II

    给定两个非空链表来代表两个非负整数.数字最高位位于链表开始位置.它们的每个节点只存储单个数字.将这两数相加会返回一个新的链表.你可以假设除了数字 0 之外,这两个数字都不会以零开头.进阶:如果输入链表 ...