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

producer.php

  1. header('Content-Type: text/html; charset=utf-8');
  2. // 连接设置
  3. $conConfig = [
  4. 'host' => '127.0.0.1',
  5. 'port' => 5672,
  6. 'login' => 'root',
  7. 'password' => 'root',
  8. 'vhost' => '/'
  9. ];
  10.  
  11. try
  12. {
  13. // RabbitMQ 连接实例
  14. $con = new AMQPConnection($conConfig);
  15. // 发起连接
  16. $con->connect();
  17. // 判断连接结果,true成功,false失败
  18. if(!$con->isConnected())
  19. {
  20. echo '连接失败';die;
  21. }
  22. // 新建通道
  23. $channel = new AMQPChannel($con);
  24. // 在指定通道上新建交换机,如果新建的交换机与已存在交换机重名但属性不同,会产生406错误。如果新建交换机与已存在交换机完全相同,不会有任何影响
  25. $exchange = new AMQPExchange($channel);
  26. // 交换机名称
  27. $exchange->setName('test.headers');
  28. // 交换机类型:按headers分发
  29. $exchange->setType('headers');
  30. // 声明交换机
  31. $exchange->declareExchange();
  32.  
  33. // 设定消息的headers信息
  34. $arguments = array(
  35. 'headers'=>array(
  36. 'type' => 'fruit',
  37. 'color' => 'red'
  38. )
  39. );
  40. // 发送消息到交换机,即使设置routing key也会被忽略
  41. $state = $exchange->publish('消息1', 'test.rt', AMQP_NOPARAM, $arguments);
  42. if($state)
  43. echo 'Success' . PHP_EOL;
  44. else
  45. echo 'Fail' . PHP_EOL;
  46.  
  47. // 设定headers信息
  48. $arguments = array(
  49. 'headers'=>array(
  50. 'type' => 'animal',
  51. 'color' => 'red'
  52. )
  53. );
  54. $state = $exchange->publish('消息2', 'test.rt', AMQP_NOPARAM, $arguments);
  55. if($state)
  56. echo 'Success' . PHP_EOL;
  57. else
  58. echo 'Fail' . PHP_EOL;
  59.  
  60. $con->disconnect();
  61. }
  62. catch(Exception $e)
  63. {
  64. echo $e->getMessage();
  65. }

consumer.php

  1. header('Content-Type: text/html; charset=utf-8');
  2. // 连接设置
  3. $conConfig = [
  4. 'host' => '127.0.0.1',
  5. 'port' => 5672,
  6. 'login' => 'root',
  7. 'password' => 'root',
  8. 'vhost' => '/'
  9. ];
  10.  
  11. try
  12. {
  13. $connect = new AMQPConnection($conConfig);
  14. $connect->connect();
  15. if(!$connect->isConnected())
  16. {
  17. echo '连接失败';die;
  18. }
  19.  
  20. $channel = new AMQPChannel($connect);
  21. $exchange = new AMQPExchange($channel);
  22. $exchange->setName('test.headers');
  23. $exchange->setType('headers');
  24. $exchange->declareExchange();
  25.  
  26. // 创建队列
  27. $queue1 = new AMQPQueue($channel);
  28. $queue2 = new AMQPQueue($channel);
  29. // 队列名称
  30. $queue1->setName('header.queue1');
  31. $queue2->setName('header.queue2');
  32. $queue1->declareQueue();
  33. $queue2->declareQueue();
  34. // 设定队列的headers信息,x-match:all:全匹配,消息的headers信息与队列的必须完全匹配,any:消息的headers消息与队列的任意一项匹配即可
  35. $headers1 = array(
  36. 'x-match'=>'all',
  37. 'type'=>'fruit',
  38. 'color'=>'red'
  39. );
  40. $headers2 = array(
  41. 'x-match'=>'any',
  42. 'type'=>'animal',
  43. 'color'=>'red'
  44. );
  45. // 绑定队列到交换机, 任意设置routing key
  46. $queue1->bind($exchange->getName(), 'queue1', $headers1);
  47. $queue2->bind($exchange->getName(), 'queue2', $headers2);
  48.  
  49. echo '队列1: ' . PHP_EOL;
  50. while($msgEnvelope = $queue1->get(AMQP_AUTOACK))
  51. {
  52. $msg = $msgEnvelope->getBody();
  53. echo $msg . PHP_EOL;
  54. }
  55.  
  56. echo PHP_EOL . '队列2: ' . PHP_EOL;
  57. while($msgEnvelope = $queue2->get(AMQP_AUTOACK))
  58. {
  59. $msg = $msgEnvelope->getBody();
  60. echo $msg . PHP_EOL;
  61. }
  62.  
  63. $connect->disconnect();
  64. }catch(Exception $e)
  65. {
  66. echo $e->getMessage();
  67. }

运行 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. 并不对劲的bzoj4817:loj2001:p3703:[SDOI2017]树点涂色

    题目大意 有一棵\(n\)(\(n\leq10^5\))个节点的树,每个点有颜色\(c\),一开始所有颜色互不相同 要进行\(m\)(\(m\leq10^5\))次操作,每次操作是以下三种中的一种: ...

  2. 【Usaco2008 Dec】Patting Heads

    [题目链接] 点击打开链接 [算法] 我们知道,每个编号为a[i]都要被编号是a[i]的约数的牛拍一次头(除了它自己),因此,只需用类似于筛法的方式统计答案, 即可 [代码] #include< ...

  3. ruby gem的安装步骤

    第一步:下载安装文件 官网下载地址:http://rubyinstaller.org/downloads 第二步: 双击安装 在安装的时候,请勾选Add Ruby executables to you ...

  4. bzoj2916

    容斥原理 计蒜客比赛day2t3的简化版 总数-异色三角形 对于每个点考虑,每个点红线数量为d[i],那么以这个点为顶点的异色三角形有d[i]*(n-1-d[i]),每条红线和蓝线成一个异色三角形,一 ...

  5. 美化console.log的文本(转载)

    原文地址:http://www.css88.com/archives/5260 JavaScript Console 那些少人所知的特性 console.log("%c css88.com& ...

  6. bzoj 1079: [SCOI2008]着色方案【记忆化搜索】

    本来打算把每个颜色剩下的压起来存map来记忆化,写一半发现自己zz了 考虑当前都能涂x次的油漆本质是一样的. 直接存五个变量分别是剩下12345个格子的油漆数,然后直接开数组把这个和步数存起来,记忆化 ...

  7. 洛谷P3569 [POI2014]KAR-Cards(线段树)

    传送门 蠢了…… 我们用线段树,记$w0$为该区间最左端取小值时,最右端最小能取大还是小还是无解,$w1$表示最左端取大值时,最右端最小能取大还是小还是无解 然后只要把交换看做修改就好了 这么说可能很 ...

  8. [Swift通天遁地]一、超级工具-(5)使用UIWebView(网页视图)加载本地页面并调用JavaScript(脚本)代码

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  9. 关于python安装lxml插件的问题

    文章只是介绍自己安装时从安装不上到安装后报错,再到安装成功的心路历程,并不代表广大欧皇也会会出现同类型的问题,也不是总结和汇总各种出问题的原因. 直接进入正题,首先我这边是win环境,电脑上装的是py ...

  10. 理解C++中拷贝构造函数

    拷贝构造函数的功能是用一个已有的对象来初始化一个被创建的同样对象,是一种特殊的构造函数,具有一般构造函数的所有特性,当创建一个新对象的时候系统会自动调用它:其形参是本类对象的引用,它的特殊功能是将参数 ...