前言

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

在官网的教程中,描述了如上六类工作队列模式:

  1. 简单队列模式:最简单的工作队列,其中一个消息生产者,一个消息消费者,一个队列。也称为点对点模式
  2. 工作模式:一个消息生产者,一个交换器,一个消息队列,多个消费者。同样也称为点对点模式
  3. 发布/订阅模式:无选择接收消息,一个消息生产者,一个交换器,多个消息队列,多个消费者。称为发布/订阅模式
  4. 路由模式:在发布/订阅模式的基础上,有选择的接收消息,也就是通过 routing 路由进行匹配条件是否满足接收消息。
  5. 主题模式:同样是在发布/订阅模式的基础上,根据主题匹配进行筛选是否接收消息,比第四类更灵活。
  6. RPC模式:与上面其他5种所不同之处,类模式是拥有请求/回复的。也就是有响应的,上面5种都没有。

接下来几篇文章一起来看看这几种队列模式吧,本篇为简单队列模式。

文章目录

1 实现功能2 构建项目2.1 导入依赖2.2 封装Connection3 生产者4 消费者5 测试环节5.1 启动RabbitMQ5.2 创建vhost5.3 依次运行Producer\Customer6 简单队列总结

1 实现功能

功能描述:一个生产者 P 发送消息到队列 Q,一个消费者 C 接收

P 表示为生产者 、C 表示为消费者,红色表示队列。

2 构建项目

创建一个简单的maven项目

  • rabbitmq 父工程
    -- common 存放公用工具类
    -- customer 消费者
    -- producer生产者

2.1 导入依赖

在 rabbitmq 父工程 pom.xml 导入 maven 依赖

  1. <dependencies>
        <dependency>
            <groupId>com.rabbitmq</groupId>
            <artifactId>amqp-client</artifactId>
            <version>3.6.5</version>
        </dependency>
    </dependencies>

2.2 封装Connection

common模块中封装 rabbitmq 连接类

  1. public class MQConnectionUtils {
  2.     public static Connection newConnection() throws IOException, TimeoutException {
            /** 1.定义连接工厂 */
            ConnectionFactory factory = new ConnectionFactory();
             /** 2.设置服务器地址 */
            factory.setHost("127.0.0.1");
             /** 3.设置协议端口号 */
            factory.setPort(5672);
             /** 4.设置vhost */
            factory.setVirtualHost("test001_host");
             /** 5.设置用户名称 */
            factory.setUsername("guest");
             /** 6.设置用户密码 */
            factory.setPassword("guest");
             /** 7.创建新的连接 */
            Connection newConnection = factory.newConnection();
            return newConnection;
        }
  3. }

3 生产者

生产者负责创建消息队列并发送消息入列,简单分为5步:

  1. 获取连接
  2. 创建通道
  3. 创建队列声明
  4. 发送消息
  5. 关闭队列
  1. public class Producer {
  2.     /** 队列名称 */
        private static final String QUEUE_NAME = "test_queue";
  3.     public static void main(String[] args) throws IOException, TimeoutException {
            /** 1.获取连接 */
            Connection newConnection = MQConnectionUtils.newConnection();
             /** 2.创建通道 */
            Channel channel = newConnection.createChannel();
             /** 3.创建队列声明 */
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            String msg = "我是生产者生成的消息";
            System.out.println("生产者发送消息:" + msg);
             /** 4.发送消息 */
            channel.basicPublish("", QUEUE_NAME, null, msg.getBytes());
            channel.close();
            newConnection.close();
        }
    }

4 消费者

消费者实现和生产者实现过程差不多,但是没有关闭连接和通道,是因为要消费者一直等待随时可能发来的消息,大致分为如下3步:

  1. 获取连接
  2. 获取通道
  3. 监听队列
  1. public class Customer {
  2.     /** 队列名称 */
        private static final String QUEUE_NAME = "test_queue";
  3.     public static void main(String[] args) throws IOException, TimeoutException {
            System.out.println("002");
            /** 1.获取连接 */
            Connection newConnection = MQConnectionUtils.newConnection();
             /** 2.获取通道 */
            Channel channel = newConnection.createChannel();
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body)
                        throws IOException {
                    String msgString = new String(body, "UTF-8");
                    System.out.println("消费者获取消息:" + msgString);
                }
            };
             /** 3.监听队列 */
            channel.basicConsume(QUEUE_NAME, true, defaultConsumer);
  4.     }
  5. }

5 测试环节

至此,整个项目代码写完了,接下来就是测试环节

5.1 启动RabbitMQ

5.2 创建vhost

5.3 依次运行Producer\Customer

Producer生产者启动

Rabbit管理平台,三条消息

Customer消费者启动

6 简单队列总结

简单队列也称为点对点,即一个生产者对应一个消费者,生产者发送消息到队列,消费者在队列中取出消息消费。

生产者大致步骤:

  1. 获取连接
  2. 创建通道
  3. 创建队列声明
  4. 发送消息
  5. 关闭队列

消费者大致步骤:

  1. 获取连接
  2. 获取通道
  3. 监听队列
  4. 消费消息

简单队列虽然简单,但是有一些不足,比如这种点对点无疑在复杂情况下会产生大量冗余代码,继续看下一篇工作队列吧。

案例代码:https://www.lanzous.com/i5ydu6d

我创建了一个java相关的公众号,用来记录自己的学习之路,感兴趣的小伙伴可以关注一下微信公众号哈:niceyoo

RabbitMQ六种队列模式-简单队列模式的更多相关文章

  1. rabbitmq系列一 之简单队列

    1. rabbitmq简介 rabbitmq是一个消息代理,或者讲是一个消息中间件.主要是用来接收和转发信息的,它是对消息不做任何处理的.MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写 ...

  2. Java设计模式之工厂模式(简单工厂模式+工厂方法模式)

    摘自http://blog.csdn.net/jason0539/article/details/23020989 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是 ...

  3. js原生设计模式——3简单工厂模式\简单工厂模式封装简单对象

    1.Factory基本写法 <!DOCTYPE html><html lang="en"><head>    <meta charset= ...

  4. Java模式—简单工厂模式

    简单工厂模式:是由一个工厂对象决定创建出哪一种产品类的实例,简单工厂模式是工厂模式家族中最简单实用的模式. 目的:为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. ...

  5. 抽象工厂模式&简单工厂模式

    抽象工厂模式 优点: 如IFactory factory=new AccessFactory(),在一个应用中只需要初始化一次,这就使得改变应用的时候变得非常容易:其次它让具体的创建实例过程与客户端分 ...

  6. 创建型模式(过渡模式) 简单工厂模式(Simple Factory)

    简单工厂模式(Simple Factory Pattern)属于类的创建型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern) 是通过专门定义一个类来负责创建其他类的 ...

  7. Java 关于策略模式+简单工厂模式下的思考

    导读 最近在做公司一个消息网关的服务,包括:短信.微信.邮件等,所有请求通过一个入口,方便接口的管理(记录日志.接口限流白名单啥的).如何写这个接口呢,还有为了以后扩展,对接过短信.微信.公众号的童鞋 ...

  8. RabbitMQ六种队列模式-工作队列模式

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

  9. RabbitMQ六种队列模式-发布订阅模式

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

随机推荐

  1. 【活动公告】Hackathon —— 腾讯云AI API接入迷你赛

    一. 活动简介 编程马拉松(Hackathon)是将热爱软硬件开发的人聚集起来所举办的一项比赛,本次活动由腾讯云AI联合云+社区发起,希望让广大开发者体验到腾讯云AI的魅力.比赛过程中,参赛者可以尽情 ...

  2. java ssh免密登录

    package com.meituan.stabletest.sshtest; import java.io.InputStream; import com.jcraft.jsch.Channel; ...

  3. sql server 索引优化

    查询实际执行计划,看走的是那种查询 要根据需求,建立合适的索引 经常需要汇总的,可以建立包含索引 --drop index ix_smssend_created on smssent_1 ; crea ...

  4. 发送邮件报错javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multipart/mixed

    关于使用javaMail发送邮件报错:javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multip ...

  5. golang学习笔记 ---rand

    在Golang中,有两个包提供了rand,分别为 "math/rand" 和 "crypto/rand",  对应两种应用场景. "math/rand ...

  6. 《 .NET并发编程实战》阅读指南 - 第14章

    先发表生成URL以印在书里面.等书籍正式出版销售后会公开内容.    

  7. 《 .NET并发编程实战》阅读指南 - 第6章

    先发表生成URL以印在书里面.等书籍正式出版销售后会公开内容.

  8. 调试 Go 的代码生成

    原文:https://studygolang.com/articles/19815 这是一个创建于 2019-04-17 23:12:26 的文章,其中的信息可能已经有所发展或是发生改变. 2016 ...

  9. One SQL to Rule Them All – an Efficient and Syntactically Idiomatic Approach to Management of Streams and Tables(中英双语)

    文章标题 One SQL to Rule Them All – an Efficient and Syntactically Idiomatic Approach to Management of S ...

  10. MySQL难点语法——连接

    本篇涉及的数据表格可以自行查阅上篇<MySQL难点语法——子查询> MySQL的数据表格之间有三种连接方式:等值连接.外连接.自连接.以下是通过举例介绍这三种连接方式 1.等值连接 等值连 ...