RabbitMq笔记(2)
今天收获不少,记个笔记。
namespace RabbitMQTest
{
class Program
{
static void Main(string[] args)
{
Consumer();
//Console.WriteLine("方法————{0}",Thread.CurrentThread.ManagedThreadId); //Thread thread = new Thread(Consumer);
//thread.Start();
//Console.WriteLine("线程1————{0}", Thread.CurrentThread.ManagedThreadId);
//Thread tt = new Thread(
// () => {
// Consumer();
// }
// );
//tt.Start(); Task task = new Task(Consumer);
task.Start(); TaskFactory tf = new TaskFactory();
Task t = tf.StartNew(Consumer);
//Console.WriteLine("线程2————{0}", Thread.CurrentThread.ManagedThreadId);
Console.ReadLine();
} private static void Consumer()
{
Console.WriteLine("线程开始,ID:" + Thread.CurrentThread.ManagedThreadId);
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
//声明queue
channel.QueueDeclare(queue: "hellos",//队列名
durable: false,//是否持久化
exclusive: false,//true:排他性,该队列仅对首次申明它的连接可见,并在连接断开时自动删除
autoDelete: false,//true:如果该队列没有任何订阅的消费者的话,该队列会被自动删除
arguments: null);//如果安装了队列优先级插件则可以设置优先级 string message = "Hello World!";//待发送的消息
var body = Encoding.UTF8.GetBytes(message);
for (int i = ; i < ; i++)
{
channel.BasicPublish(exchange: "",//exchange名称
routingKey: "hellos",//如果存在exchange,则消息被发送到名称为hello的queue的客户端
basicProperties: null,
body: body);//消息体
Console.WriteLine(" [x] Sent {0}", message);
}
}
}
}
}
生产者
namespace RabbitXiaoFei
{
class Program
{
static void Main(string[] args)
{
//var factory = new ConnectionFactory() { HostName = "localhost", UserName = "ty2017", Password = "123456", VirtualHost = "log" };
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
channel.QueueDeclare(queue: "hellos",//指定发送消息的queue,和生产者的queue匹配
durable: false,//耐用的,持久的
exclusive: false,//独有的;排外的;专一的
autoDelete: false,//
arguments: null); //设置预取消息的数量为1个,消费完当前的消息后再去获取下一个消息
//就是有多个消费者去请求队列的时候,序号为奇数的会给第一个,为偶数的会给第二个
//但是如果第一个要耗费很长时间,那么第二个就得等,那就很消耗资源了
//要是每个Consumer处理完一个消息后再去获取下一个消息,这是多么理想呀!
channel.BasicQos(, //设置0
, //设置当前Consumer的预取数量为1个就行啦!
false); //设置false var consumer = new EventingBasicConsumer(channel);
//注册接收事件,一旦创建连接就去拉取消息
consumer.Received += (obj, sss) =>
{
var body = sss.Body;
var message = Encoding.UTF8.GetString(body);
Console.WriteLine(" [x] Received {0}", message);
};
channel.BasicConsume(queue: "hellos",
autoAck:true,//Ack :确认
//和tcp协议的ack一样,为false则服务端必须在收到客户端的回执(ack)后才能删除本条消息
consumer: consumer);
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
}
}
}
}
消费者
New 生产者
ConnectionFactory factory = new ConnectionFactory
{
UserName = "guest",//用户名
Password = "guest",//密码
HostName = "127.0.0.1",//rabbitmq ip
//VirtualHost = "/"
}; //创建连接
var connection = factory.CreateConnection();
//创建通道
var channel = connection.CreateModel();
//声明一个队列 (队列名字,是否持久化,是否自动删除队列,是否排外的,是否等待服务器返回)
channel.QueueDeclare("queuename_zkb", false, false, false, null);
Guid guid = new Guid();
var sendBytes = Encoding.UTF8.GetBytes(guid.ToString());
//发布消息 (交换器名称,路由键,是否为强制性,
channel.BasicPublish("", "queuename_zkb", null, sendBytes);
channel.Close();
connection.Close();
New 消费者
IConnectionFactory connFactory = new ConnectionFactory//创建连接工厂对象
{
HostName = "127.0.0.1",//IP地址
//Port = 5672,//端口号
UserName = "guest",//用户账号
Password = "guest"//用户密码
};
using (IConnection conn = connFactory.CreateConnection())
{
using (IModel channel = conn.CreateModel())
{
String queueName = String.Empty;
queueName = "queuename_zkb";
//声明一个队列
channel.QueueDeclare(
queue: queueName,//消息队列名称
durable: false,//是否缓存
exclusive: false,
autoDelete: false,
arguments: null
);
//创建消费者对象
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
byte[] message = ea.Body;//接收到的消息
Console.WriteLine("接收到信息为:" + Encoding.UTF8.GetString(message)); ViewData[""] = Encoding.UTF8.GetString(message);
//_logger.LogError("我是错误显示")
};
//消费者开启监听
channel.BasicConsume(queue: queueName, autoAck: true, consumer: consumer); }
}
这个是在多个消费者的时候用到的,假如发给A消费,那就发一条给他,然后收到A的确认消息时候,在发给n消费者。一定是收到A的确认消息
下面的这张图,这样就变成了:公平分发⭐⭐⭐⭐(不加这些code的是轮询分发)
假如来了一批活需要1和2处理,2的能力比1强,那么这两个消费者就都是每次只取一条信息,但是2的能力强,2就做的多,这也叫能者多劳
RabbitMq笔记(2)的更多相关文章
- springboot集成使用rabbitmq笔记(1.rabbitmq安装)
使用rabbitmq笔记一 使用rabbitmq笔记二 使用rabbitmq笔记三 1.选择适配的版本,参考---https://www.rabbitmq.com/which-erlang.html ...
- springboot集成使用rabbitmq笔记(2.rabbitmq使用)
使用rabbitmq笔记一 使用rabbitmq笔记二 使用rabbitmq笔记三 1.引入包 <dependencies> <dependency> <groupId& ...
- springboot集成使用rabbitmq笔记(3.基本过程)
使用rabbitmq笔记一 使用rabbitmq笔记二 使用rabbitmq笔记三 1.AMQP协议 AMQP 0-9-1的工作过程如下图:消息(message)被发布者(publisher)发送给交 ...
- rabbitMQ 笔记
1. 端口 rabbitMQ server 使用的端口是5672 , AMQP协议的端口 rabbitMQ web 使用的端口是15672 , 管理工具的端口 rabbitMQ cl ...
- RabbitMQ笔记
RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息队列(MQ)是一种应用程序 ...
- RabbitMQ 笔记-RPC
RabbitMQ中实现RPC的机制是: 客户端发送请求(消息)时,在消息的属性(MessageProperties,在AMQP协议中定义了14中properties,这些属性会随着消息一起发送)中设置 ...
- RabbitMQ 笔记-工作队列
工作队列的主要思想是不用等待资源密集型的任务处理完成, 为了确保消息或者任务不会丢失,rabbitmq 支持消息确信 ACK.ACK机制是消费者端从rabbitmq收到消息并处理完成后,反馈给rabb ...
- RabbitMQ 笔记-Exchanges
Procuder Publish的Message进入了Exchange.接着通过"routing keys", RabbitMQ会找到应该把这个Message放到哪个queue里. ...
- RabbitMQ 笔记-基本概念
ConnectionFactory.Connection.Channel ConnectionFactory.Connection.Channel,这三个都是RabbitMQ对外提供的API中最基本的 ...
随机推荐
- BZOJ 2733 线段树的合并 并查集
思路: 1.线段树合并(nlogn的) 2.splay+启发式合并 线段树合并比较好写 我手懒 //By SiriusRen #include <cstdio> #include < ...
- jsoup HTML parser hello world examples--转
原文地址:http://www.mkyong.com/java/jsoup-html-parser-hello-world-examples/ Jsoup, a HTML parser, its “j ...
- 微信公众号测试账号-redirect_uri域名与后台配置不一致,错误代码:10003
微信公众号测试账号-redirect_uri域名与后台配置不一致,错误代码:10003 进入公众平台测试账号. 登录公众账号--"开发者中心"--"公众平台测试账号&qu ...
- java ScriptEngine 使用 (java运行脚本文件)
转自:http://www.tuicool.com/articles/imEbQbA Java SE 6最引人注目的新功能之一就是内嵌了脚本支持.在默认情况下,Java SE 6只支持JavaScri ...
- Linux 搭建互信后,仍需要密码验证
修改ssh配置文件: vi /etc/ssh/sshd_config PermitRootLogin no 注释掉
- MySQL · 答疑解惑 · 备库Seconds_Behind_Master计算
背景 在mysql主备环境下,主备同步过程如下,主库更新产生binlog, 备库io线程拉取主库binlog生成relay log.备库sql线程执行relay log从而保持和主库同步. 理论上主库 ...
- Markdown标记语言
Markdown 是一种轻量级标记语言,创始人为约翰·格鲁伯(John Gruber).它允许人们“使用易读易写的纯文本格式编写文档,然后转换成有效的XHTML(或者HTML)文档”.这种语言吸收了很 ...
- 关于Android Studio更新后一直Refreshing的解决办法!
今天更新了一下studio一直是这个问题 查了很多资料终于解决了 造成这个问题的原因是要更新的gradle版本和studio安装路径中的gradle版本不一致导致的 把他们改成一致的即可 在这个目录里 ...
- 3Ds Max实例教程-制作女战士全过程
3Ds Max制作“女战神” 作者:Diego Rodríguez 使用软件:3Ds Max,Photoshop 3Ds Max下载:http://wm.makeding.com/iclk/?zone ...
- POJ 1743 [USACO5.1] Musical Theme (后缀数组+二分)
洛谷P2743传送门 题目大意:给你一个序列,求其中最长的一对相似等长子串 一对合法的相似子串被定义为: 1.任意一个子串长度都大于等于5 2.不能有重叠部分 3.其中一个子串可以在全部+/-某个值后 ...