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)扇形交换机: 扇形交换机是最基本的交换机类型,它所能做的事情非常简单---广播消息.扇形交换机会把能接收到的消息全部发 ...
随机推荐
- 两数最大公约数 GCD
原理辗转相除法. public int gcd(int i, int j) { if (i == 0 || j == 0) { return 0; } int a = 0, b = 0; if (i ...
- sparkStreaming 读kafka的数据
目标:sparkStreaming每2s中读取一次kafka中的数据,进行单词计数. topic:topic1 broker list:192.168.1.126:9092,192.168.1.127 ...
- class与computed一起应用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- oracle中时间格式时候的大于号是大于和等于的意思
oracle中时间格式时候的大于号是大于和等于的意思
- Arts打卡第6周
Algorithm.主要是为了编程训练和学习. 每周至少做一个 leetcode 的算法题(先从Easy开始,然后再Medium,最后才Hard). 进行编程训练,如果不训练你看再多的算法书,你依然不 ...
- POX flow_stats2.py analysis by uestc_gremount
该程序是POX WIKI上的程序,我只是将统计的报文修改了以下,并做了对这个程序运行流程的分析: 1.程序从launch开始运行 2.监听2个事件,如果监听到"FlowStatsReceiv ...
- linux 安装nginx -查看 linux的环境变量
我发现在linux上面安装linux很简单 在CentOS release 6.5 上面先看一下操作系统的版本: lsb_release -a 直接执行 yum install nginx 系统自动的 ...
- arcgis 地理坐标系 699个,投影坐标系是4767
import arcpy # Get the list of spatial references and print it. srs = arcpy.ListSpatialReferences(sp ...
- 线程池 | Java多线程,彻底搞懂线程池
熟悉Java多线程编程的同学都知道,当我们线程创建过多时,容易引发内存溢出,因此我们就有必要使用线程池的技术了. 最近看了一些相关文章,并亲自研究了一下源码,发现有些文章还是有些问题的,所以我也总结了 ...
- nodejs做中间层,转发请求
简述node中间层的优势 node中间层,可以解决前端的跨域问题,因为服务器端的请求是不涉及跨域的,跨域是浏览器的同源策略导致的,关于跨域可以查看跨域复习使用node坐中间层,方便前后端分离,后端只需 ...