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)扇形交换机: 扇形交换机是最基本的交换机类型,它所能做的事情非常简单---广播消息.扇形交换机会把能接收到的消息全部发 ...
随机推荐
- docker(一) -- docker安装、容器加速、下载、备份
一.docker的 容器是从镜像中创建出来的虚拟实例 容器用来运行实例,是读写层 镜像用来安装程序,是只读层 1. docker的安装和基本操作 安装命令 yum -y update yum inst ...
- 【中国剩余定理-入门】-C++
中国剩余定理也称孙子定理,是中国古代求解一次同余式组(见同余)的方法.是数论中一个重要定理. 这玩意在luogu居然有模板题: [TJOI2009]猜数字 先来看一个问题: 在<孙子算经> ...
- MutationObserverAPI--微任务
1. 作用 MutationObserverAPI可以看作一个监听DOM所有变化(包含节点.属性.文本内容的变动)的接口. 和EventTargetAPI的addEventListener相比: 共同 ...
- 利用webuploader实现超大文件分片上传、断点续传
之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需 ...
- jsp利用webuploader实现超大文件分片上传、断点续传
1,项目调研 因为需要研究下断点上传的问题.找了很久终于找到一个比较好的项目. 在GoogleCode上面,代码弄下来超级不方便,还是配置hosts才好,把代码重新上传到了github上面. http ...
- P2037 电话号码
题目描述 一串由长长的数字组成的电话号码通常很难记忆.为了方便记忆,有种方法是用单词来方便记忆.例如用“Three Tens”来记忆电话3-10-10-10. 电话号码的标准形式是七位数字,中间用连字 ...
- QoS in RoCE (zz)
QoS in RoCE 首页分类标签留言关于订阅2018-03-22 | 分类 Network | 标签 RDMA RoCE ECN PFC Overview TCP/IP协议栈满足不了现代I ...
- springboot项目整合swagger2出现的问题
swagger需要开放以下uri:/swagger-ui.html/swagger-resources/webjars/csrf/v2 添加swagger后项目报错 Failed to start b ...
- 如何判断Linux下 网卡是虚拟还是物理网卡?
ifconfig命令可以查看Linux系统中正在使用的网卡,包括物理网卡和虚拟网卡,如果想要查看Linux系统中全部的网卡,可以查看/proc/net/dev文件,那如何区分网卡是虚拟还是物理的呢? ...
- Jenkins自动化打包(Gitlab)并上传蒲公英
整个过程详见:https://www.jianshu.com/p/91e8f571fc2b 以下是遇到的问题及解决过程 一.安装homebrew(网速很慢很慢……被墙了) /usr/bin/ruby ...