参考:https://blog.csdn.net/vbirdbest/article/details/78583480

简单队列的模型:

P : 生产者,即 Producer

C : 消费者,即 Consumer

"hello" : 消息

红色方块即队列

首先新建一个工具类,方便获取连接.

    public static class ConnectionHelper
{
public static IConnection GetConnection()
{
//定义一个连接工厂
ConnectionFactory factory = new ConnectionFactory
{
HostName = "127.0.0.1",//设置服务器地址
Port = , //设置端口号
VirtualHost = "/vhost_refuge",//设置虚拟主机
UserName = "refuge",//设置用户名
Password = "******"//设置密码
};
return factory.CreateConnection();
}
}

创建一个生产者

    /// <summary>
/// 生产者
/// </summary>
public class Producer
{
//定义队列的名称
private const string QueueName = "test_simple_queue"; /// <summary>
/// 发送消息
/// </summary>
public static void Send()
{
//获取一个连接
using (IConnection connection = ConnectionHelper.GetConnection())
{
//从连接中获取一个信道
using (IModel channel = connection.CreateModel())
{
//声明队列
channel.QueueDeclare
(
queue: QueueName, //队列名称
durable: false, //是否持久化
exclusive: false, //是否专属
autoDelete: false, //是否自动删除
arguments: null //队列的配置
); //创建一个消息
string msg = "hello"; //发送消息
channel.BasicPublish
(
exchange: "", //交换机名称
routingKey: QueueName, //路由键
basicProperties: null, //该条消息的配置
body: Encoding.Default.GetBytes(msg) //消息字节数组
); Console.WriteLine($"send {msg}");
}
}
}
}

创建一个消费者

    /// <summary>
/// 消费者
/// </summary>
public class Consumer
{
/// <summary>
/// 队列名称
/// </summary>
private const string QueueName = "test_simple_queue"; /// <summary>
/// 接收消息
/// </summary>
public static void Receive()
{
//获取一个连接
using (IConnection connection = ConnectionHelper.GetConnection())
{
//从连接中获取一个信道
using (IModel channel = connection.CreateModel())
{
           //获取消息
BasicGetResult res = channel.BasicGet
(
queue: QueueName, //队列名称
autoAck: true //是否自动确认
); if (res == null)
{
return;
} byte[] bytes = res.Body;
string msg = Encoding.Default.GetString(bytes);
Console.WriteLine($"receive {msg}");
}
}
}
}

运行结果:

下面对一些方法的部分参数做下解释:

QueueDeclare

  • queue 队列名称
  • durable 队列是否持久化.false:队列在内存中,服务器挂掉后,队列就没了;true:服务器重启后,队列将会重新生成.注意:只是队列持久化,不代表队列中的消息持久化!!!!
  • exclusive 队列是否专属,专属的范围针对的是连接,也就是说,一个连接下面的多个信道是可见的.对于其他连接是不可见的.连接断开后,该队列会被删除.注意,不是信道断开,是连接断开.并且,就算设置成了持久化,也会删除.
  • autoDelete 当所有消费者客户端连接断开时是否自动删除队列.
  • arguments 队列的参数配置

BasicPublish

  • basicProperties: null, //该条消息的配置
  • body: Encoding.Default.GetBytes(msg) //消息字节数组
  • exchange: "", //交换机名称
  • routingKey: QueueName, //路由键

文章开头提到的简单队列的模型中,没有交换机,这里的交换机名称我们传入的也是空字符串,

但是,这不代表就没有使用交换机.

实际上,系统会为每个队列都隐式的绑定一个默认的交换机,交换机的名称为“(AMQP default)”,类型为直连接 direct,当你手动创建一个队列时,后台会自动将这个队列绑定到一个名称为空的Direct类型交换机上,绑定路由名称与队列名称相同,所以这里虽然没有显示声明交换机,但路由键和队列名称一样,所以系统就将消息发送到这个默认的交换机里。有了这个默认的交换机和绑定,我们就可以像其他轻量级的队列,如Redis那样,直接操作队列来处理消息。不过理论上是可以的,但实际上在RabbitMQ里直接操作是不可取的。消息始终都是先发送到交换机,由交换级经过路由传送给队列,消费者再从队列中获取消息的。不过由于这个默认交换机和路由的关系,使我们只关心队列这一层即可,这个比较适合做一些简单的应用,毕竟没有发挥RabbitMQ的最大功能(RabbitMQ可以重量级消息队列),如果都用这种方式去使用的话就真是杀鸡用宰牛刀了。

BasicGet

  • queue: QueueName, //队列名称
  • autoAck: true //应答模式,true:自动应答,即消费者获取到消息,该消息就会从队列中删除掉,false:手动应答,当从队列中取出消息后,需要程序员手动调用方法应答,如果没有应答,该消息会一直存在队列中.

参考:https://blog.csdn.net/vbirdbest/article/details/78583480

												

RabbitMQ (二) 简单队列的更多相关文章

  1. RabbitMq 之简单队列

    简单队列类似于我们的生产者,消费者, 一个生产者,对应一个消费者. 直接上代码: package com.j1.rabbitmq.simple; import com.j1.rabbitmq.util ...

  2. RabbitMQ ——简单队列

    一 .概述 我们不从开始就讲述基本的概念,尤其是在Rabbitmq之中有些概念确实比较难以理解,我们首先做的就是将光放提供的消息模型 进行实现,然后再总结一下Rabbitmq之中的基本概念. 二 .基 ...

  3. RabbitMQ(二):Java 操作队列

    1. 简单模式 模型: P:消息的生产者 队列:rabbitmq C:消息的消费者 获取 MQ 连接 public static Connection getConnection() throws I ...

  4. RabbitMq(2) 简单消息队列

    <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client </ar ...

  5. rabbitmq学习(二):rabbitmq(消息队列)的作用以及rabbitmq之直连交换机

    前言 上篇介绍了AMQP的基本概念,组成及其与rabbitmq的关系.了解了这些东西后,下面我们开始学习rabbitmq(消息队列)的作用以及用java代码和rabbitmq通讯进行消息发布和接收.因 ...

  6. 消息队列--RabbitMQ(二)

    1.常用的几种队列简介 RabbitMQ有五种常用的队列,分别是:简单队列.work模式.发布订阅模式.路由模式.主题(Topic)模式.其实发布订阅.路由.主题这三种模式都从属于与routingke ...

  7. RabbitMQ学习笔记(2)----RabbitMQ简单队列(Hello World)的使用

    1. 简单队列结构图 2. 引入依赖 pom.xml文件 <dependency> <groupId>com.rabbitmq</groupId> <arti ...

  8. RabbitMQ六种队列模式-简单队列模式

    前言 RabbitMQ六种队列模式-简单队列 [本文]RabbitMQ六种队列模式-工作队列RabbitMQ六种队列模式-发布订阅RabbitMQ六种队列模式-路由模式RabbitMQ六种队列模式-主 ...

  9. RabbitMQ ——与Spring集成及exchange的direct、topic方式实现和简单队列实现

    程序整体结构 Maven依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http: ...

随机推荐

  1. BZOJ 2820: YY的GCD | 数论

    题目: 题解: http://hzwer.com/6142.html #include<cstdio> #include<algorithm> #define N 100000 ...

  2. [Leetcode] The minimum depth of binary tree二叉树的最小深度

    Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the shor ...

  3. AOJ.559 丢失的数字

    丢失的数字 Time Limit: 1000 ms Memory Limit: 64 MB Total Submission: 1552 Submission Accepted: 273 Descri ...

  4. linux 端口号、进程id、杀进程、查询tcp的连接(各种状态的)

    sudo netstat -antupkill -s 9 50713netstat -n | grep 61616netstat -n | awk '/^tcp/ {++S[$NF]} END {fo ...

  5. ZOJ3872 Beauty of Array---规律 | DP| 数学能力

    传送门ZOJ 3872 Beauty of Array Time Limit: 2 Seconds      Memory Limit: 65536 KB Edward has an array A  ...

  6. PHP等比例生成缩略图

    /** * 生成缩略图 * $imgSrc 图片源路径 * $resize_width 图片宽度 * $resize_height 图片高度 * $dstimg 缩略图路径 * $isCut 是否剪切 ...

  7. All in One到”分布式“迁移过程中的坑

    为什么“分布式”要加引号? 与其他公司提高并发性能的场景可能不太一样,我们的系统之前是多个模块共用一个tomcat来运行的(All in One),模块有很多,光安装包就几十个.当某个模块或某几个模块 ...

  8. UOJ#80 二分图最大权匹配 [模板题]

    从前一个和谐的班级,有 nlnl 个是男生,有 nrnr 个是女生.编号分别为 1,…,nl1,…,nl 和 1,…,nr1,…,nr. 有若干个这样的条件:第 vv 个男生和第 uu 个女生愿意结为 ...

  9. sql注入预防

    在我们登陆验证时会发现sql注入的现象. 1.sql注入发生原因 因为如果用户在用户名上输入的是' or 1=1 # 时,我们得到的sql语句是select * from shop_user wher ...

  10. 【CF24D】Broken Robot (DP+高斯消元)

    题目链接 题意:给定一个\(n\times m\)的矩阵,每次可以向→↓←移动一格,也可以原地不动,求从\((x,y)\)到最后一行的期望步数. 此题标签\(DP\) 看到上面这个肯定会想到 方法一: ...