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

//fanout 广播模式

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

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

using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace IOT_DeviceSocket
{
	public partial class FormRabbmitMQ : Form
	{
		public FormRabbmitMQ()
		{
			InitializeComponent();
		}
		string EXCHANGE_NAME = "EXCHANGE_NAME1111";
		string queuename = "queuename1111";
		private void button1_Click(object sender, EventArgs e)
		{
			//TOPIC发送();
			轮询发送();
		}

		private void button2_Click(object sender, EventArgs e)
		{
			//TOPIC接收();
			轮询接收();
		}

		public void 轮询发送()
		{
			#region 轮询
			var factory = new ConnectionFactory();
			factory.HostName = "127.0.0.1";
			factory.UserName = "Teld";
			factory.Password = "Teld@Teld.cn";
			//队列名称

			using (var connection = factory.CreateConnection())
			{
				using (var channel = connection.CreateModel())
				{
					//durable = true 代表持久化 交换机和队列都要为true
					//topic 轮询模式 fanout 广播模式
					//轮询模式,当两个消费者时候,每个消费者都会挨个接收消息 比如第一个接收1,2,3 第二个接收到的消息是2,4,6
					//广播模式,代表每个消费者都会收到消息,每一个收到的都是1,2,3,4,5,6

					//申明交换机并指定交换机类型 可以删除,也可以topic改为fanout模式
					channel.ExchangeDeclare(EXCHANGE_NAME, "topic", true);//申明交换机并指定交换机类型
					channel.QueueDeclare(queuename, true, false, false, null);
					//公平分发
					//channel.BasicQos(0, 1, false);
					var properties = channel.CreateBasicProperties();
					properties.DeliveryMode = 2; //持久化
					for (int i = 0; i < 1; i++)
					{
						var body = Encoding.UTF8.GetBytes(textBox1.Text);
						channel.BasicPublish("", queuename, properties, body);
					}

				}
			}
			#endregion
		}
		public void 轮询接收()
		{
			for (int i = 0; i < 2; i++)
			{
				var s = i;
				#region 轮询
				var factory = new ConnectionFactory();
				factory.HostName = "127.0.0.1";
				factory.UserName = "Teld";
				factory.Password = "Teld@Teld.cn";
				var connection = factory.CreateConnection();
				var channel = connection.CreateModel();
				var consumer = new EventingBasicConsumer(channel);
				//申明交换机并指定交换机类型 可以删除,也可以topic改为fanout模式
				channel.ExchangeDeclare(EXCHANGE_NAME, "topic", true);
				var queuenames = channel.QueueDeclare().QueueName;
				channel.QueueBind(queuenames, EXCHANGE_NAME, "");
				consumer.Received += (model, ea) =>
				{
					var body = ea.Body;
					try
					{
						//处理消息
						textBox2.Invoke(new EventHandler(delegate
						{
							textBox2.Text += s.ToString() + ":" + Encoding.Default.GetString(body) + "\r\n";
						}));
					}
					catch (Exception ex)
					{

					}
					finally
					{
						//确认完成
						channel.BasicAck(ea.DeliveryTag, false);
					}
				};
				//设置手动完成确认(noAck)
				channel.BasicConsume(queuename, false, consumer);
				#endregion

			}
		}

		public void 广播发送()
		{
			#region 广播
			var factory = new ConnectionFactory();
			factory.HostName = "127.0.0.1";
			factory.UserName = "Teld";
			factory.Password = "Teld@Teld.cn";
			var EXCHANGE_NAME = "eee";
			using (var connection = factory.CreateConnection())
			{
				using (var channel = connection.CreateModel())
				{
					// 声明该channel是fanout类型
					channel.ExchangeDeclare(EXCHANGE_NAME, "fanout");

					// 将消息发送给exchange
					//channel.basicPublish(EXCHANGE_NAME, "", null, msg.getBytes());
					var body = Encoding.UTF8.GetBytes(textBox1.Text);
					channel.BasicPublish(EXCHANGE_NAME, "", null, body);
				}
			}
			#endregion
		}

		public void 广播接收()
		{
			for (int i = 0; i < 2; i++)
			{
				var s = i;
				#region 广播
				// 创建连接和channel
				ConnectionFactory factory = new ConnectionFactory();
				factory.HostName = "127.0.0.1";
				factory.UserName = "Teld";
				factory.Password = "Teld@Teld.cn";
				var connection = factory.CreateConnection();
				var channel = connection.CreateModel();
				channel.ExchangeDeclare(EXCHANGE_NAME, "fanout");
				// 由RabbitMQ自行创建的临时队列,唯一且随消费者的中止而自动删除的队列
				String queueName = channel.QueueDeclare().QueueName;
				// binding
				channel.QueueBind(queueName, EXCHANGE_NAME, "");

				var consumer = new EventingBasicConsumer(channel);
				// 指定队列消费者
				channel.BasicConsume(queueName, true, consumer);
				consumer.Received += (model, ea) =>
				{
					var body = ea.Body;
					try
					{
						//处理消息
						textBox2.Invoke(new EventHandler(delegate
						{
							textBox2.Text += s.ToString() + ":" + Encoding.Default.GetString(body) + "\r\n";
						}));
					}
					catch (Exception ex)
					{

					}
					finally
					{

					}
				};
				#endregion
			}
		}

		String exchangeName = "wytExchangeTopic";
		String routeKeyName1 = "black.critical.high";
		String routeKeyName2 = "red.critical.high";
		String routeKeyName3 = "white.critical.high";

		public void TOPIC发送()
		{
			var factory = new ConnectionFactory();
			factory.HostName = "127.0.0.1";
			factory.UserName = "Teld";
			factory.Password = "Teld@Teld.cn";
			//队列名称

			using (var connection = factory.CreateConnection())
			{
				using (var channel = connection.CreateModel())
				{
					//durable = true 代表持久化 交换机和队列都要为true
					//topic 轮询模式 fanout 广播模式
					//轮询模式,当两个消费者时候,每个消费者都会挨个接收消息 比如第一个接收1,2,3 第二个接收到的消息是2,4,6
					//广播模式,代表每个消费者都会收到消息,每一个收到的都是1,2,3,4,5,6
					channel.ExchangeDeclare(exchangeName, "topic", true);//申明交换机并指定交换机类型
					var properties = channel.CreateBasicProperties();
					properties.DeliveryMode = 2; //持久化
					properties.Persistent = true;
					for (int i = 0; i < 1; i++)
					{
						//发送的消息
						var body = Encoding.UTF8.GetBytes(textBox1.Text);

						//给相应的routingKey 的推送消息,模拟给三个不同的key发送同一个消息,也可以给一个key发送消息
						//消息推送routeKeyName1
						channel.BasicPublish(exchange: exchangeName, routingKey: routeKeyName1, basicProperties: properties, body: body);
						////消息推送routeKeyName2
						//channel.BasicPublish(exchange: exchangeName, routingKey: routeKeyName2, basicProperties: properties, body: body);
						////消息推送routeKeyName3
						//channel.BasicPublish(exchange: exchangeName, routingKey: routeKeyName3, basicProperties: properties, body: body);
					}

				}
			}
		}

		public void TOPIC接收()
		{
			#region   topic模式 根据routingkey

			for (int i = 0; i < 2; i++)
			{
				var s = i;

				var factory = new ConnectionFactory();
				factory.HostName = "127.0.0.1";
				factory.UserName = "Teld";
				factory.Password = "Teld@Teld.cn";

				var connection = factory.CreateConnection();
				var channel = connection.CreateModel();
				var consumer = new EventingBasicConsumer(channel);
				channel.ExchangeDeclare(exchange: exchangeName, type: "topic", durable: true, autoDelete: false, arguments: null);

				String queueName = channel.QueueDeclare().QueueName;

				//接收一种就绑定一种routeKey
				channel.QueueBind(queue: queueName, exchange: exchangeName, routingKey: routeKeyName1, arguments: null);
				//channel.QueueBind(queue: queueName, exchange: exchangeName, routingKey: routeKeyName2, arguments: null);

				consumer.Received += (model, ea) =>
				{
					var body = ea.Body;
					try
					{
					//处理消息
					textBox2.Invoke(new EventHandler(delegate
						{
							textBox2.Text += s.ToString() + ":" + Encoding.Default.GetString(body) + "\r\n";
						}));
					}
					catch (Exception ex)
					{

					}
					finally
					{
					//确认完成
					channel.BasicAck(ea.DeliveryTag, false);
					}
				};
				//设置手动完成确认(noAck)
				channel.BasicConsume(queueName, false, consumer);
			}
			#endregion

		}
	}
}

  

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. 2019牛客暑期多校训练营(第九场)The power of Fibonacci——循环节&&CRT

    题意 求 $\displaystyle \sum_{i=1}^n F_i^m $,($1 \leq n\leq 10^9,1 \leq  m\leq 10^3$),答案对 $10^9$ 取模. 分析 ...

  2. vue quill使用&quill 自定义图片上传&自定义mp4 更换标签

    pluins 创建quill 目录 创建文件video.js import { Quill } from 'vue-quill-editor' // 源码中是import直接倒入,这里要用Quill. ...

  3. 31、[源码]-AOP原理-AnnotationAwareAspectJAutoProxyCreato机

    31.[源码]-AOP原理-AnnotationAwareAspectJAutoProxyCreato机

  4. js中数组元素的添加和删除

    js中数组元素常用添加方法是直接添加.push方法以及unshift方法 删除方法则是delete.pop.shift 集修改方法为一身的则是splice 1.添加: (1)直接添加通常都是这样 va ...

  5. mybatis执行insert后马上能获取自增主键的语句写法

    <!--keyColumn keyProperty useGeneratedKeys 用于在插入数据后,能直接使用user.getId()获取主键--> <insert id=&qu ...

  6. Ubuntu 18.04安装NVIDIA显卡驱动教程

            最近遇到了在Ubuntu 18.04上安装NVIDIA显卡驱动的情况,看到一篇教程讲解的很好,拿来收藏. 安装NVIDIA显卡驱动风险极大,新手注意. 在Ubuntu 18.04上安装 ...

  7. 点分 TREE

    /* 1468: Tree Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 774  Solved: 412[Submit][Status][Discus ...

  8. 【优化算法】变邻域搜索算法解决0-1背包问题(Knapsack Problem)代码实例 已

    01 前言 经过小编这几天冒着挂科的风险,日日修炼,终于赶在考试周中又给大家更新了一篇干货文章.关于用变邻域搜索解决0-1背包问题的代码.怎样,大家有没有很感动? 02 什么是0-1背包问题? 0-1 ...

  9. Java 中的 SimpleDateFormat 【 parse 和 format 】【转换时间格式】

    在 Java 里面有很多特别方便的函数(尽管术语可能不这么说)可以供我们使用,让一些本来要写好长好多的代码的事情变得仅仅几行就解决了. 在 SimpleDateFormat 中,有以下特定的规则: G ...

  10. jsp 页面 javax.servlet.jsp.JspException cannot be resolved to a type 异常

    <dependencies><dependency><groupId>javax.servlet</groupId><artifactId> ...