今天收获不少,记个笔记。

 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)的更多相关文章

  1. springboot集成使用rabbitmq笔记(1.rabbitmq安装)

    使用rabbitmq笔记一 使用rabbitmq笔记二 使用rabbitmq笔记三 1.选择适配的版本,参考---https://www.rabbitmq.com/which-erlang.html ...

  2. springboot集成使用rabbitmq笔记(2.rabbitmq使用)

    使用rabbitmq笔记一 使用rabbitmq笔记二 使用rabbitmq笔记三 1.引入包 <dependencies> <dependency> <groupId& ...

  3. springboot集成使用rabbitmq笔记(3.基本过程)

    使用rabbitmq笔记一 使用rabbitmq笔记二 使用rabbitmq笔记三 1.AMQP协议 AMQP 0-9-1的工作过程如下图:消息(message)被发布者(publisher)发送给交 ...

  4. rabbitMQ 笔记

    1. 端口 rabbitMQ  server 使用的端口是5672  ,   AMQP协议的端口 rabbitMQ  web 使用的端口是15672  ,   管理工具的端口 rabbitMQ  cl ...

  5. RabbitMQ笔记

    RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息队列(MQ)是一种应用程序 ...

  6. RabbitMQ 笔记-RPC

    RabbitMQ中实现RPC的机制是: 客户端发送请求(消息)时,在消息的属性(MessageProperties,在AMQP协议中定义了14中properties,这些属性会随着消息一起发送)中设置 ...

  7. RabbitMQ 笔记-工作队列

    工作队列的主要思想是不用等待资源密集型的任务处理完成, 为了确保消息或者任务不会丢失,rabbitmq 支持消息确信 ACK.ACK机制是消费者端从rabbitmq收到消息并处理完成后,反馈给rabb ...

  8. RabbitMQ 笔记-Exchanges

    Procuder Publish的Message进入了Exchange.接着通过"routing keys", RabbitMQ会找到应该把这个Message放到哪个queue里. ...

  9. RabbitMQ 笔记-基本概念

    ConnectionFactory.Connection.Channel ConnectionFactory.Connection.Channel,这三个都是RabbitMQ对外提供的API中最基本的 ...

随机推荐

  1. Python 递归和二分查找

    # 二分查找l1 = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88] def two_search( ...

  2. jQuery分页插件pagination的用法

    https://www.zhangxinxu.com/jq/pagination_zh/ 参数: 参数名 描述 参数值 maxentries 总条目数 必选参数,整数 items_per_page 每 ...

  3. navigate系列api

    wx.navigateTo  用于保留当前页面.跳转到应用内的某个页面,使用 wx.navigateBack可以返回到原页面.对于页面不是特别多的小程序,通常推荐使用 wx.navigateTo进行跳 ...

  4. SQL Server-简单查询语句,疑惑篇

      前言 对于一些原理性文章园中已有大量的文章尤其是关于索引这一块,我也是花费大量时间去学习,对于了解索引原理对于后续理解查询计划和性能调优有很大的帮助,而我们只是一些内容进行概括和总结,这一节我们开 ...

  5. 使用 chrome 扩展 Vimium 实现快捷键关闭其他标签页

    Vimium 是一款很强大的键盘操作扩展,几乎所有的操作都可以使用键盘命令完成,还支持自定义按键. 其实 Vimium 很早就支持了关闭其他标签页这个操作,甚至还能关闭左侧标签页和关闭右侧标签页,只是 ...

  6. 使用LayUI在页面实现加载层(图标)代码:

    实现代码: var index = layer.load({ shade: [0.4,'#def'], icon :' 实现效果: 可以使用 layer.close(index); 来控制其在什么时 ...

  7. Java校验8位字符串是否为正确的日期格式

    import java.text.ParseException; import java.text.SimpleDateFormat; /** * 校验8位字符串是否为正确的日期格式 * @autho ...

  8. jq点击按钮打开和关闭弹出层,点击除了当前按钮以外的地方关闭弹出层

    1.html <a id="more" onclick="moreFun()">更多</a> <ul id="moreL ...

  9. docker images镜像无法删除

    删除所有容器: docker rm $(docker ps -aq) 删除镜像: docker rmi $(docker images -q) 如果有镜像无法删除,有可能更改了名字,用docker r ...

  10. [CTSC1999][网络流24题]补丁VS错误

    题目:洛谷P2761.vijos P1019.codevs1239.codevs2218. 题目大意:有n个错误,m个不同的补丁. 对于一个补丁,有两个不同的字符串描述.具体如下: 如果当前错误包含第 ...