//durable = true 代表持久化 交换机和队列都要为true ,持久代表服务重启,没有处理的消息依然存在
//topic 根据不同的routkey 发送和接收信息

//fanout 广播模式

//广播模式,代表每个消费者都会收到消息,每一个收到的都是1,2,3,4,5,6

//轮询模式,当两个消费者时候,每个消费者都会挨个接收消息 比如第一个接收1,2,3 第二个接收到的消息是2,4,6

  1. using RabbitMQ.Client;
  2. using RabbitMQ.Client.Events;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.ComponentModel;
  6. using System.Data;
  7. using System.Drawing;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. using System.Windows.Forms;
  12. namespace IOT_DeviceSocket
  13. {
  14. public partial class FormRabbmitMQ : Form
  15. {
  16. public FormRabbmitMQ()
  17. {
  18. InitializeComponent();
  19. }
  20. string EXCHANGE_NAME = "EXCHANGE_NAME1111";
  21. string queuename = "queuename1111";
  22. private void button1_Click(object sender, EventArgs e)
  23. {
  24. //TOPIC发送();
  25. 轮询发送();
  26. }
  27.  
  28. private void button2_Click(object sender, EventArgs e)
  29. {
  30. //TOPIC接收();
  31. 轮询接收();
  32. }
  33.  
  34. public void 轮询发送()
  35. {
  36. #region 轮询
  37. var factory = new ConnectionFactory();
  38. factory.HostName = "127.0.0.1";
  39. factory.UserName = "Teld";
  40. factory.Password = "Teld@Teld.cn";
  41. //队列名称
  42.  
  43. using (var connection = factory.CreateConnection())
  44. {
  45. using (var channel = connection.CreateModel())
  46. {
  47. //durable = true 代表持久化 交换机和队列都要为true
  48. //topic 轮询模式 fanout 广播模式
  49. //轮询模式,当两个消费者时候,每个消费者都会挨个接收消息 比如第一个接收1,2,3 第二个接收到的消息是2,4,6
  50. //广播模式,代表每个消费者都会收到消息,每一个收到的都是1,2,3,4,5,6
  51.  
  52. //申明交换机并指定交换机类型 可以删除,也可以topic改为fanout模式
  53. channel.ExchangeDeclare(EXCHANGE_NAME, "topic", true);//申明交换机并指定交换机类型
  54. channel.QueueDeclare(queuename, true, false, false, null);
  55. //公平分发
  56. //channel.BasicQos(0, 1, false);
  57. var properties = channel.CreateBasicProperties();
  58. properties.DeliveryMode = 2; //持久化
  59. for (int i = 0; i < 1; i++)
  60. {
  61. var body = Encoding.UTF8.GetBytes(textBox1.Text);
  62. channel.BasicPublish("", queuename, properties, body);
  63. }
  64.  
  65. }
  66. }
  67. #endregion
  68. }
  69. public void 轮询接收()
  70. {
  71. for (int i = 0; i < 2; i++)
  72. {
  73. var s = i;
  74. #region 轮询
  75. var factory = new ConnectionFactory();
  76. factory.HostName = "127.0.0.1";
  77. factory.UserName = "Teld";
  78. factory.Password = "Teld@Teld.cn";
  79. var connection = factory.CreateConnection();
  80. var channel = connection.CreateModel();
  81. var consumer = new EventingBasicConsumer(channel);
  82. //申明交换机并指定交换机类型 可以删除,也可以topic改为fanout模式
  83. channel.ExchangeDeclare(EXCHANGE_NAME, "topic", true);
  84. var queuenames = channel.QueueDeclare().QueueName;
  85. channel.QueueBind(queuenames, EXCHANGE_NAME, "");
  86. consumer.Received += (model, ea) =>
  87. {
  88. var body = ea.Body;
  89. try
  90. {
  91. //处理消息
  92. textBox2.Invoke(new EventHandler(delegate
  93. {
  94. textBox2.Text += s.ToString() + ":" + Encoding.Default.GetString(body) + "\r\n";
  95. }));
  96. }
  97. catch (Exception ex)
  98. {
  99.  
  100. }
  101. finally
  102. {
  103. //确认完成
  104. channel.BasicAck(ea.DeliveryTag, false);
  105. }
  106. };
  107. //设置手动完成确认(noAck)
  108. channel.BasicConsume(queuename, false, consumer);
  109. #endregion
  110.  
  111. }
  112. }
  113.  
  114. public void 广播发送()
  115. {
  116. #region 广播
  117. var factory = new ConnectionFactory();
  118. factory.HostName = "127.0.0.1";
  119. factory.UserName = "Teld";
  120. factory.Password = "Teld@Teld.cn";
  121. var EXCHANGE_NAME = "eee";
  122. using (var connection = factory.CreateConnection())
  123. {
  124. using (var channel = connection.CreateModel())
  125. {
  126. // 声明该channel是fanout类型
  127. channel.ExchangeDeclare(EXCHANGE_NAME, "fanout");
  128.  
  129. // 将消息发送给exchange
  130. //channel.basicPublish(EXCHANGE_NAME, "", null, msg.getBytes());
  131. var body = Encoding.UTF8.GetBytes(textBox1.Text);
  132. channel.BasicPublish(EXCHANGE_NAME, "", null, body);
  133. }
  134. }
  135. #endregion
  136. }
  137.  
  138. public void 广播接收()
  139. {
  140. for (int i = 0; i < 2; i++)
  141. {
  142. var s = i;
  143. #region 广播
  144. // 创建连接和channel
  145. ConnectionFactory factory = new ConnectionFactory();
  146. factory.HostName = "127.0.0.1";
  147. factory.UserName = "Teld";
  148. factory.Password = "Teld@Teld.cn";
  149. var connection = factory.CreateConnection();
  150. var channel = connection.CreateModel();
  151. channel.ExchangeDeclare(EXCHANGE_NAME, "fanout");
  152. // 由RabbitMQ自行创建的临时队列,唯一且随消费者的中止而自动删除的队列
  153. String queueName = channel.QueueDeclare().QueueName;
  154. // binding
  155. channel.QueueBind(queueName, EXCHANGE_NAME, "");
  156.  
  157. var consumer = new EventingBasicConsumer(channel);
  158. // 指定队列消费者
  159. channel.BasicConsume(queueName, true, consumer);
  160. consumer.Received += (model, ea) =>
  161. {
  162. var body = ea.Body;
  163. try
  164. {
  165. //处理消息
  166. textBox2.Invoke(new EventHandler(delegate
  167. {
  168. textBox2.Text += s.ToString() + ":" + Encoding.Default.GetString(body) + "\r\n";
  169. }));
  170. }
  171. catch (Exception ex)
  172. {
  173.  
  174. }
  175. finally
  176. {
  177.  
  178. }
  179. };
  180. #endregion
  181. }
  182. }
  183.  
  184. String exchangeName = "wytExchangeTopic";
  185. String routeKeyName1 = "black.critical.high";
  186. String routeKeyName2 = "red.critical.high";
  187. String routeKeyName3 = "white.critical.high";
  188.  
  189. public void TOPIC发送()
  190. {
  191. var factory = new ConnectionFactory();
  192. factory.HostName = "127.0.0.1";
  193. factory.UserName = "Teld";
  194. factory.Password = "Teld@Teld.cn";
  195. //队列名称
  196.  
  197. using (var connection = factory.CreateConnection())
  198. {
  199. using (var channel = connection.CreateModel())
  200. {
  201. //durable = true 代表持久化 交换机和队列都要为true
  202. //topic 轮询模式 fanout 广播模式
  203. //轮询模式,当两个消费者时候,每个消费者都会挨个接收消息 比如第一个接收1,2,3 第二个接收到的消息是2,4,6
  204. //广播模式,代表每个消费者都会收到消息,每一个收到的都是1,2,3,4,5,6
  205. channel.ExchangeDeclare(exchangeName, "topic", true);//申明交换机并指定交换机类型
  206. var properties = channel.CreateBasicProperties();
  207. properties.DeliveryMode = 2; //持久化
  208. properties.Persistent = true;
  209. for (int i = 0; i < 1; i++)
  210. {
  211. //发送的消息
  212. var body = Encoding.UTF8.GetBytes(textBox1.Text);
  213.  
  214. //给相应的routingKey 的推送消息,模拟给三个不同的key发送同一个消息,也可以给一个key发送消息
  215. //消息推送routeKeyName1
  216. channel.BasicPublish(exchange: exchangeName, routingKey: routeKeyName1, basicProperties: properties, body: body);
  217. ////消息推送routeKeyName2
  218. //channel.BasicPublish(exchange: exchangeName, routingKey: routeKeyName2, basicProperties: properties, body: body);
  219. ////消息推送routeKeyName3
  220. //channel.BasicPublish(exchange: exchangeName, routingKey: routeKeyName3, basicProperties: properties, body: body);
  221. }
  222.  
  223. }
  224. }
  225. }
  226.  
  227. public void TOPIC接收()
  228. {
  229. #region topic模式 根据routingkey
  230.  
  231. for (int i = 0; i < 2; i++)
  232. {
  233. var s = i;
  234.  
  235. var factory = new ConnectionFactory();
  236. factory.HostName = "127.0.0.1";
  237. factory.UserName = "Teld";
  238. factory.Password = "Teld@Teld.cn";
  239.  
  240. var connection = factory.CreateConnection();
  241. var channel = connection.CreateModel();
  242. var consumer = new EventingBasicConsumer(channel);
  243. channel.ExchangeDeclare(exchange: exchangeName, type: "topic", durable: true, autoDelete: false, arguments: null);
  244.  
  245. String queueName = channel.QueueDeclare().QueueName;
  246.  
  247. //接收一种就绑定一种routeKey
  248. channel.QueueBind(queue: queueName, exchange: exchangeName, routingKey: routeKeyName1, arguments: null);
  249. //channel.QueueBind(queue: queueName, exchange: exchangeName, routingKey: routeKeyName2, arguments: null);
  250.  
  251. consumer.Received += (model, ea) =>
  252. {
  253. var body = ea.Body;
  254. try
  255. {
  256. //处理消息
  257. textBox2.Invoke(new EventHandler(delegate
  258. {
  259. textBox2.Text += s.ToString() + ":" + Encoding.Default.GetString(body) + "\r\n";
  260. }));
  261. }
  262. catch (Exception ex)
  263. {
  264.  
  265. }
  266. finally
  267. {
  268. //确认完成
  269. channel.BasicAck(ea.DeliveryTag, false);
  270. }
  271. };
  272. //设置手动完成确认(noAck)
  273. channel.BasicConsume(queueName, false, consumer);
  274. }
  275. #endregion
  276.  
  277. }
  278. }
  279. }

  

demo rabbitmq topic(主题模式),fanout(广播模式),轮询分发,确认接收Ack处理的更多相关文章

  1. RabbitMQ学习第二记:工作队列的两种分发方式,轮询分发(Round-robin)和 公平分发(Fair dispatch)

    1.什么是RabbitMQ工作队列 我们在应用程序使用消息系统时,一般情况下生产者往队列里插入数据时速度是比较快的,但是消费者消费数据往往涉及到一些业务逻辑处理导致速度跟不上生产者生产数据.因此如果一 ...

  2. rabbitmq 交换机模式一 广播模式 fanout

    <?php require_once "./vendor/autoload.php"; use PhpAmqpLib\Connection\AMQPStreamConnect ...

  3. python---RabbitMQ(2)exchange中订阅者模式fanout<广播>,(一对多,发布一条消息,多人同时接收)

    fanout:广播:所有bind到此exchange的queue都可以接受到消息 生产者: # coding:utf8 # __author: Administrator # date: // # / ...

  4. python rabbitMQ 发送端和接收端广播模式。

    消费者模型: import pika,time consumer = pika.BlockingConnection\ (pika.ConnectionParameters('localhost')) ...

  5. 2017年5月17日20:14:29 rabbitmq 消费 异常信息无法处理 导致轮询

    同事说如果同步的配置的正确的话不会出现这种问题 只有异常的情况下才会,但是 我就真的出现了//TODO 等我有时间的时候再查查看. 如果是异步的出现这种问题的话 包进AmqpRejectAndDont ...

  6. RabbitMQ (三) 工作队列之轮询分发

    上一篇讲了简单队列,实际工作中,这种队列应该很少用到,因为生产者发送消息的耗时一般都很短,但是消费者收到消息后,往往伴随着对高消息的业务逻辑处理,是个耗时的过程,这势必会导致大量的消息积压在一个消费者 ...

  7. RabbitMQ广播模式

    广播模式:1对多,produce发送一则消息多个consumer同时收到.注意:广播是实时的,produce只负责发出去,不会管对端是否收到,若发送的时刻没有对端接收,那消息就没了,因此在广播模式下设 ...

  8. RabbitMQ基本用法、消息分发模式、消息持久化、广播模式

    RabbitMQ基本用法 进程queue用于同一父进程创建的子进程间的通信 而RabbitMQ可以在不同父进程间通信(例如在word和QQ间通信) 示例代码 生产端(发送) import pika c ...

  9. SpringCloudStream学习(二)RabbitMQ中的交换机跟工作模式

    知识储备: 交换机: ​ RabbitMQ中有4中交换机,分别是 (FANOUT)扇形交换机: 扇形交换机是最基本的交换机类型,它所能做的事情非常简单---广播消息.扇形交换机会把能接收到的消息全部发 ...

随机推荐

  1. Mysql 安装,及其闪退的问题解决

    1.下载 Mysql 64下载链接(华军软件) http://soft.onlinedown.net/soft/3573.htm 2.安装 2.1 傻瓜式安装 不再赘述,略过. 2.2安装完成打开闪退 ...

  2. Copy Books

    Description Given n books and the i-th book has pages[i] pages. There are k persons to copy these bo ...

  3. $("xxx"); 使用jQuery获得对象

    $("xxx"); 使用jQuery获得对象 console.log( $ ( $ ( $ ( '.dropdown' ) ) ) );  与下面返回的结果都是一毛一样的. con ...

  4. IDEA控制台中文乱码解决

    关于IDEA中文乱码的解决方法,如下. 1.打开idea安装目录,选择 打开文件,末尾添加-Dfile.encoding=UTF-8 2.打开IntelliJ IDEA>File>Sett ...

  5. 2-set 1823: [JSOI2010]满汉全席

    这个题告诉我变量循环使用,一定要赋好初值!!!!!! 一定要赋好初值!!!!!!一定要赋好初值!!!!!!一定要赋好初值!!!!!! #include<iostream>#include& ...

  6. TensorFlow(七):tensorboard网络执行

    # MNIST数据集 手写数字 import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data # ...

  7. js的老生代垃圾回收

    推荐阅读:<JS 闯关记>之垃圾回收和内存管理 常见的垃圾回收有2种策略:标记清除 和 引用计数 标记清除 会遍历堆中所有的对象,然后标记活的对象,在标记完成后,销毁所有没有被标记的对象. ...

  8. Allure自动化测试报告之修改allure测试报告名称

    1.从github获取allure代码 https://github.com/allure-framework/allure2 2.安装gradle,用于打包jar brew install grad ...

  9. postgresql 创建索引:ERROR: operator class "gin_trgm_ops" does not exist for access method "gin"

    g_trgm is an extension, so: CREATE EXTENSION pg_trgm; If you get the following error ERROR: could no ...

  10. Wireshark过滤命令总结

    1.表达式1 (tcp.flags.reset == )&&(tcp.seq == ) 2.表达式2 (tcp.flags.syn == )&&(tcp.analysi ...