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)扇形交换机: 扇形交换机是最基本的交换机类型,它所能做的事情非常简单---广播消息.扇形交换机会把能接收到的消息全部发 ...
随机推荐
- Django REST framework+Vue 打造生鲜电商项目(笔记四)
(PS:部分代码和图片来自博客:http://www.cnblogs.com/derek1184405959/p/8813641.html.有增删) 一.用户登录和手机注册 1.drf的token功能 ...
- Spring security invalid-session-url 的坑(配了permitAll仍然跳转到登录页)
Spring security session配置中如果配了如下的invalid-session-url,配置了permitAll链接首次链接系统时会跳转到登录页,将该配置删除即可解决此问题. < ...
- Linux 内核参数说明
转载自: https://www.cnblogs.com/tolimit/p/5065761.html 因个人能力有限,不能保证所有描述都正确,还请大家集思广益,有错误的地方欢迎大家留言指正,同时也欢 ...
- luogu 3248
直接向原树加子树是不可能的考虑重新建立这样一颗树,我们称之为 S 树 将每次需要添加的子树看做一个点,称之为 S 点 新建的树就是由这些点构成的,那么树的大小是合理的 初始节点为整棵原树由于添加的子树 ...
- Codeforces Global Round 4
目录 Contest Info Solutions A. Prime Minister B. WOW Factor C. Tiles D. Prime Graph E. Archaeology F1. ...
- 数据结构实验之查找四:二分查找(SDUT 3376)
#include <stdio.h> #include <string.h> #include <stdlib.h> int a[1000005]; int fin ...
- 使用 Nexus3 Repository Manager 搭建 npm 私服
公司里一般都有自己的私服,用于管理封装的工具插件等,Nexus2主要是用于maven/gralde仓库的统一管理,Nexus3则添加了npm插件,可以对npm提供支持,其实用于npm仓库管理的还有一个 ...
- Arts打卡第7周
Algorithm.主要是为了编程训练和学习. 每周至少做一个 leetcode 的算法题(先从Easy开始,然后再Medium,最后才Hard). 进行编程训练,如果不训练你看再多的算法书,你依然不 ...
- Mac -- pkg-config: exec: "pkg-config": executable file not found in $PATH
just run: brew install pkg-config
- presto计算日期间隔天数或者小时间隔——date_diff函数使用
“Presto是Facebook最新研发的数据查询引擎,可对250PB以上的数据进行快速地交互式分析.据称该引擎的性能是 Hive 的 10 倍以上.”,亲身用过之后,觉得比hive快了10倍不止. ...