demo rabbitmq topic(主题模式),fanout(广播模式),轮询分发,确认接收Ack处理
//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处理的更多相关文章
- RabbitMQ学习第二记:工作队列的两种分发方式,轮询分发(Round-robin)和 公平分发(Fair dispatch)
1.什么是RabbitMQ工作队列 我们在应用程序使用消息系统时,一般情况下生产者往队列里插入数据时速度是比较快的,但是消费者消费数据往往涉及到一些业务逻辑处理导致速度跟不上生产者生产数据.因此如果一 ...
- rabbitmq 交换机模式一 广播模式 fanout
<?php require_once "./vendor/autoload.php"; use PhpAmqpLib\Connection\AMQPStreamConnect ...
- python---RabbitMQ(2)exchange中订阅者模式fanout<广播>,(一对多,发布一条消息,多人同时接收)
fanout:广播:所有bind到此exchange的queue都可以接受到消息 生产者: # coding:utf8 # __author: Administrator # date: // # / ...
- python rabbitMQ 发送端和接收端广播模式。
消费者模型: import pika,time consumer = pika.BlockingConnection\ (pika.ConnectionParameters('localhost')) ...
- 2017年5月17日20:14:29 rabbitmq 消费 异常信息无法处理 导致轮询
同事说如果同步的配置的正确的话不会出现这种问题 只有异常的情况下才会,但是 我就真的出现了//TODO 等我有时间的时候再查查看. 如果是异步的出现这种问题的话 包进AmqpRejectAndDont ...
- RabbitMQ (三) 工作队列之轮询分发
上一篇讲了简单队列,实际工作中,这种队列应该很少用到,因为生产者发送消息的耗时一般都很短,但是消费者收到消息后,往往伴随着对高消息的业务逻辑处理,是个耗时的过程,这势必会导致大量的消息积压在一个消费者 ...
- RabbitMQ广播模式
广播模式:1对多,produce发送一则消息多个consumer同时收到.注意:广播是实时的,produce只负责发出去,不会管对端是否收到,若发送的时刻没有对端接收,那消息就没了,因此在广播模式下设 ...
- RabbitMQ基本用法、消息分发模式、消息持久化、广播模式
RabbitMQ基本用法 进程queue用于同一父进程创建的子进程间的通信 而RabbitMQ可以在不同父进程间通信(例如在word和QQ间通信) 示例代码 生产端(发送) import pika c ...
- SpringCloudStream学习(二)RabbitMQ中的交换机跟工作模式
知识储备: 交换机: RabbitMQ中有4中交换机,分别是 (FANOUT)扇形交换机: 扇形交换机是最基本的交换机类型,它所能做的事情非常简单---广播消息.扇形交换机会把能接收到的消息全部发 ...
随机推荐
- 怎么才能零基础彻底学会Java
21世纪进入信息时代,信息科技给人类的生产和生活方式带来了深刻的变革,信息产业已成为推动国家经济发展的主导产业之一,Java编程语言作为含金量极高的一门IT技术,很多人希望从事这个行业,那么想学好Ja ...
- E:first-of-type
E:first-of-type 语法: E:first-of-type { sRules } 说明: 匹配同类型中的第一个同级兄弟元素E.大理石平台[1200mm*1000mm*150mm] 要使该属 ...
- 洛谷 P3955 图书管理员 题解
每日一题 day12 打卡 Analysis 模拟+快速幂 先把图书的编码存起来排序,保证第一个找到的就是最小的.如果要求一个数后x位,就将这个数模10的x次方,同理,我们可以通过这个规律来判断后缀. ...
- [ZJOI2004]嗅探器 (割点)
这题就比较好玩吧水题 以数据范围来看随便怎么做就能过 \(O(n)\)显然我们得过一个割点,其次这个割点得在\(x-y\)中间且不为始终点 其他都好说,在中间:从\(x\)开始遍历,首先得保证\(x- ...
- Python3 输入和输出(二)
接上一节 1.读写文件的模式图 将字符串写入到文件 foo.txt 中: #!/usr/bin/python3 # 打开一个文件f = open("/tmp/foo.txt", & ...
- swoole入门到实战打造高性能赛事直播平台☆
第1章 课程介绍 本章主要是介绍了swoole的一些特性,以及使用场景,并且分享了swoole在其他公司的一些案例,最后重点讲解了swoole学习的一些准备工作. 第2章 PHP 7 源码安装 本 ...
- POI2010 Bridges
好题\(Q\omega Q\) 我们考虑这个东西要求最大值最小,显然一眼二分答案对吧. 问题在于如何\(check\),我们二分答案之后把问题转换成了混合图如何求欧拉回路. 考虑欧拉回路的性质,每一个 ...
- EXCEL技巧-多级目录设置
现有如下图所示的数据,要求:以方法.厚度.品种进行分类汇总,并对数量.面积.金额求和. 在进行分类汇总前需要先对数据进行排序,操作如下图所示. 在排序对话框中,点击“添加条件” 两次,这样可以对三个字 ...
- linux和window下生成任意大小的文件
在Windows环境下的实现方法 使用fsutil命令,在windows xp和win 7下应该都自带了这个命令.命令的格式是 fsutil file createnew 新文件名 文件大小.例如 ...
- nrm切换npm包源
nrm可以随时切换npm包的源 npm install -g nrm 安装nrm完成 查看nrm源 nrm ls 切换源 npm use npm #也可以切换成其他源