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

 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. [转] Java 插入表记录后得到自增的id (附3种方法代码)

    转自:https://blog.csdn.net/yaerfeng/article/details/7231093 在MySQL中,使用auto_increment类型的id字段作为表的主键,并用它作 ...

  2. 洛谷P4016 负载平衡问题(最小费用最大流)

    题目描述 GG 公司有 nn 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 nn 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运. 输入输出格式 输入格 ...

  3. iOS11中navigationBar上 按钮图片设置frame无效 不受约束 产生错位问题 解决

    问题描述: 正常样式: 在iOS 11 iPhone X上显示效果: 观察顶部navBar上的左侧按钮  在ios 11 上  这个按钮的图片不受设置的尺寸约束,按其真实大小展示,造成图片错位,影响界 ...

  4. python pip fatal error in launcher unable to create process using

    用pip安装一个包,不知道为啥,就报了这个错误:python pip fatal error in launcher unable to create process using “”   百度了一下 ...

  5. Java之Foreach语句

    Foreach是for语句的特殊简化版本,但任何时候的foreach语句都可以改写成for语句.Foreach语句在遍历数组等方面为程序员提供了很大的方便 语法如下: For(元素变量 x:遍历对象o ...

  6. 不懂技术也可以轻松开发一款APP

    这是个衣食住行都离不开手机的时代,甚至可以说,我们不用考虑其他的东西,只要拿着手机,就可以出门做自己想做的事情. 这就是手机app的强大之处,覆盖面极广,小到聊天交友,大到投资理财.每次都是app为我 ...

  7. ubantu上搭建hive环境

    上次我们在ubantu上安装了hadoop,那我们现在再进一步,开始我们的学习之旅--hive板块吧! 第一步:准备! 软件: I.一个搭建好的hadoop环境 II.hive的bin文件(前往apa ...

  8. 工作流Activiti学习地址

    http://blog.csdn.net/xnf1991/article/details/52610277

  9. 火狐浏览器安装接口测试工具RESTClient方法

  10. js常用事件及事件对象