建立一个交换机 tpc 并且绑定了各自的路由到 Q1 Q2

  1. <?php
  2.  
  3. require_once "./vendor/autoload.php";
  4.  
  5. use PhpAmqpLib\Connection\AMQPStreamConnection;
  6. use PhpAmqpLib\Message\AMQPMessage;
  7.  
  8. $conf = [
  9. 'host' => '192.168.33.50',
  10. 'port' => 5672,
  11. 'user' => 'admin',
  12. 'pwd' => 'password',
  13. 'vhost' => '/',
  14. ];
  15.  
  16. $exchangeName = 'tpc'; //交换机名
  17. //$queueName = 'ttt'; //队列名称
  18. $routingKey = 'lazy.a.b'; //路由关键字(也可以省略)
  19.  
  20. $conn = new AMQPStreamConnection( //建立生产者与mq之间的连接
  21. $conf['host'], $conf['port'], $conf['user'], $conf['pwd'], $conf['vhost']
  22. );
  23. $channel = $conn->channel(); //在已连接基础上建立生产者与mq之间的通道
  24.  
  25. $channel->exchange_declare($exchangeName, 'topic', false, true, false); //声明初始化交换机
  26. //$channel->queue_declare($queueName, false, true, false, false); //声明初始化一条队列
  27. //$channel->queue_bind($queueName, $exchangeName, $routingKey); //将队列与某个交换机进行绑定,并使用路由关键字
  28.  
  29. $msgBody = json_encode(["name" => "iGoo", "age" => 22]);
  30. $msg = new AMQPMessage($msgBody, ['content_type' => 'text/plain', 'delivery_mode' => 2]); //生成消息
  31. $r = $channel->basic_publish($msg, $exchangeName, $routingKey); //推送消息到某个交换机
  32. $channel->close();
  33. $conn->close();

  

通过代码生产消息 时候,

  1. $routingKey = 'lazy.a.b'; //路由关键字(也可以省略)
    Q2 会收到消息
  1. $routingKey = 'lazy.a'; //路由关键字(也可以省略)
  1. Q2也会收到消息
    因为#号会匹配多个 比如 lazy.a lazy.b lazy.a.b.c

  1. $routingKey = 'a.orange.b'; //路由关键字(也可以省略)
    Q1会收到消息 因为只匹配到orange 前面一个后面一个

  1. $routingKey = 'a.orange.b.c'; //路由关键字(也可以省略)
    没有队列收到

  1. $routingKey = 'a.orange.rabbit'; //路由关键字(也可以省略)
    两个都匹配到, 匹配到rabbit 中间的orange

    消费者代码
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: jmsite.cn
  5. * Date: 2019/1/15
  6. * Time: 13:16
  7. */
  8. //声明连接参数
  9. $config = array(
  10. 'host' => '192.168.33.50',
  11. 'vhost' => '/',
  12. 'port' => 5672,
  13. 'login' => 'admin',
  14. 'password' => 'password'
  15. );
  16. //连接broker
  17. $cnn = new AMQPConnection($config);
  18. if (!$cnn->connect()) {
  19. echo "Cannot connect to the broker";
  20. exit();
  21. }
  22. //在连接内创建一个通道
  23. $ch = new AMQPChannel($cnn);
  24. //创建一个交换机
  25. $ex = new AMQPExchange($ch);
  26. //声明路由键
  27. $routingKey = 'lazy.#';
  28. //声明交换机名称
  29. $exchangeName = 'tpc';
  30. //设置交换机名称
  31. $ex->setName($exchangeName);
  32. //设置交换机类型
  33. //AMQP_EX_TYPE_DIRECT:直连交换机
  34. //AMQP_EX_TYPE_FANOUT:扇形交换机
  35. //AMQP_EX_TYPE_HEADERS:头交换机
  36. //AMQP_EX_TYPE_TOPIC:主题交换机
  37. $ex->setType(AMQP_EX_TYPE_TOPIC);
  38. //设置交换机持久
  39. $ex->setFlags(AMQP_DURABLE);
  40. //声明交换机
  41. $ex->declareExchange();
  42. ////创建一个消息队列
  43. $q = new AMQPQueue($ch);
  44. //设置队列名称
  45. $q->setName('Q2');
  46. //设置队列持久
  47. $q->setFlags(AMQP_DURABLE);
  48. //声明消息队列
  49. $q->declareQueue();
  50. //交换机和队列通过$routingKey进行绑定
  51. //$q->bind($ex->getName(), $routingKey);
  52. //接收消息并进行处理的回调方法
  53. function receive($envelope, $queue) {
  54. //休眠两秒,
  55. sleep(2);
  56. //echo消息内容
  57. echo $envelope->getBody()."\n";
  58. //显式确认,队列收到消费者显式确认后,会删除该消息
  59. $queue->ack($envelope->getDeliveryTag());
  60. }
  61. //设置消息队列消费者回调方法,并进行阻塞
  62. $q->consume("receive");
  63. //$q->consume("receive", AMQP_AUTOACK);//隐式确认,不推荐

  

  1.  

rabbitmq 交换机模式 -主题模式 topic的更多相关文章

  1. RabbitMQ六种队列模式-主题模式

    前言 RabbitMQ六种队列模式-简单队列RabbitMQ六种队列模式-工作队列RabbitMQ六种队列模式-发布订阅RabbitMQ六种队列模式-路由模式RabbitMQ六种队列模式-主题模式 [ ...

  2. 队列模式&主题模式

    # RabbitMQ 消息中间件 **Advanced Message Queuing Protocol (高级消息队列协议** The Advanced Message Queuing Protoc ...

  3. ActiveMQ--模式(队列模式/主题模式)

    两种模式:队列模式/主题模式 pom.xml <dependency> <groupId>org.apache.activemq</groupId> <art ...

  4. RabbitMQ简单应用の主题模式(topic)

    Topic exchange(主题转发器) 发送给主题转发器的消息不能是任意设置的选择键,必须是用小数点隔开的一系列的标识符.这些标识符可以是随意,但是通常跟消息的某些特性相关联.一些合法的路由选择键 ...

  5. Rabbitmq交换机三种模式介绍

    1.topic 将路由键和某模式进行匹配.此时队列需要绑定要一个模式上.符号“#”匹配一个或多个词,符号“*”匹配不多不少一个词.因此“abc.#”能够匹配到“abc.def.ghi”,但是“abc. ...

  6. RabbitMQ入门:主题路由器(Topic Exchange)

    上一篇博文中,我们使用direct exchange 代替了fanout exchange,这次我们来看下topic exchange. 一.Topic Exchange介绍 topic exchan ...

  7. SpringBoot整合RabbitMQ实现六种工作模式

    RabbitMQ主要有六种种工作模式,本文整合SpringBoot分别介绍工作模式的实现. 前提概念 生产者 消息生产者或者发送者,使用P表示: 队列 消息从生产端发送到消费端,一定要通过队列转发,使 ...

  8. RabbitMQ六种队列模式-路由模式

    前言 RabbitMQ六种队列模式-简单队列RabbitMQ六种队列模式-工作队列RabbitMQ六种队列模式-发布订阅RabbitMQ六种队列模式-路由模式 [本文]RabbitMQ六种队列模式-主 ...

  9. RabbitMQ六种队列模式-工作队列模式

    前言 RabbitMQ六种队列模式-简单队列RabbitMQ六种队列模式-工作队列 [本文]RabbitMQ六种队列模式-发布订阅RabbitMQ六种队列模式-路由模式RabbitMQ六种队列模式-主 ...

随机推荐

  1. 大量数据也不在话下,Spring Batch并行处理四种模式初探

    1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! Spring相关文章:Springboot-Cloud 前面写了一篇文章<通过例子讲解Spring Batch入门,优 ...

  2. 初等函数——指数函数(Exponential Function)

    一般地,函数叫做指数函数,其中x是自变量,函数的定义域是R.

  3. 数据库SQL调优的几种方式

    1.创建索引 (1) 要尽量避免全表扫描,首先应考虑在where 及order by涉及的列上建立索引 (2) 在经常需要进行检索的字段上创建索引,一个表中的索引最好不要超过6个 2.避免在索引上使用 ...

  4. .NET Core开源导入导出库 Magicodes.IE 2.3发布

    在2.3这一版本的更新中,我们迎来了众多的使用者.贡献者,在这个里程碑中我们也添加并修复了一些功能.对于新特点的功能我将在下面进行详细的描述,当然也欢迎更多的人可以加入进来,再或者也很期待大家来提is ...

  5. robots检测插件编写

    首先先把url分割 url = 'https://www.baidu.com/s?wd=123&rsv_spt=1&rsv_iqid=0x8d22781d000014ad&is ...

  6. xss利用——BeEF#stage4(其余功能介绍)

    目录 信息收集 => 社会工程 =>网络扫描 => 结合metasploit => tunneling => xss => 维持权限 功能介绍 #1 - 信息收集 ...

  7. 使用jsonify返回json数据

    from flask import Flask, jsonify app = Flask(__name__) json_data = [ {"name":"json&qu ...

  8. Spark中的聚类算法

    Spark - Clustering 官方文档:https://spark.apache.org/docs/2.2.0/ml-clustering.html 这部分介绍MLlib中的聚类算法: 目录: ...

  9. 再解决不了前端加密我就吃shi

    参考文章 快速定位前端加密方法 渗透测试-前端加密测试 前言 最近学习挖洞以来,碰到数据做了加密基本上也就放弃了.但是发现越来越多的网站都开始做前端加密了,不论是金融行业还是其他.所以趁此机会来捣鼓一 ...

  10. Python练习题 022:用递归函数反转字符串

    [Python练习题 022] 利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来. --------------------------------------- 又来一个递归题!不过,有 ...