首页 > 其他分享 >深入学习RabbitMQ五种模式(一)

深入学习RabbitMQ五种模式(一)

时间:2023-06-02 11:38:37浏览次数:69  
标签:队列 rabbitmq 五种 深入 RabbitMQ import com 消息


1.安装erlang

下载otp_win64_25.3.exe

https://www.erlang.org/downloads

erlang安装完成,需要配置erlang环境变量

ERLANG_HOME=E:\software\Erlang OTP

PATH=%PATH%;%ERLANG_HOME%\bin;

2.安装RabbitMQ

下载rabbitmq-server-3.11.13.exe

https://www.rabbitmq.com/download.html

进入安装目录下sbin目录,安装并运行服务

安装服务: rabbitmq-service.bat install
删除服务:rabbitmq-service.bat remove
启动服务:rabbitmq-service.bat start
停止服务: rabbitmq-service.bat stop

安装管理插件

安装RabbitMQ的管理插件,方便在浏览器端管理RabbitMQ

管理员身份打开cmd,进入E:\software\RabbitMQ Server\rabbitmq_server-3.11.13\sbin目录,运行

rabbitmq-plugins.bat enable rabbitmq_management

执行结果



深入学习RabbitMQ五种模式(一)_java

重启一下RabbitMQ



深入学习RabbitMQ五种模式(一)_学习_02

启动成功,登录RabbitMQ

访问地址http://127.0.0.1:15672/;初始账号和密码guest/guest



深入学习RabbitMQ五种模式(一)_java_03

深入学习RabbitMQ五种模式(一)_分布式_04

3. RabbitMQ常用五种模式

3.1. 简单模式

该模式是个一对一模式,只有一个生产者Producer(用于生产消息),一个队列Queue(用于存储消息),一个消费者Consumer (用于接收消息)。



深入学习RabbitMQ五种模式(一)_分布式_05

注:简单模式也用到了交换机,使用的是默认的交换机(AMQP default)。

  • 创建项目rabbitmq-learn

pom.xml引入以下依赖

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>com.olive</groupId>
 <artifactId>rabbitmq-learn</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <properties>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.source>1.8</maven.compiler.source>
    </properties>

 <dependencies>
  <!-- mq的依赖 -->
  <dependency>
   <groupId>com.rabbitmq</groupId>
   <artifactId>amqp-client</artifactId>
   <version>5.16.0</version>
  </dependency>
  <!-- 日志处理 -->
  <dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-log4j12</artifactId>
   <version>1.7.21</version>
  </dependency>
  <dependency>
   <groupId>log4j</groupId>
   <artifactId>log4j</artifactId>
   <version>1.2.17</version>
  </dependency>
 </dependencies>
</project>

RabbitMQ官方提供了amqp-clientjava客户端连接RabbitMQ Server;仓库地址如下

https://github.com/rabbitmq/rabbitmq-java-client
  • RabbitMQ连接的工具类
package com.olive;

import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

/**
 * 封装连接工具类
 */
public class ConnectionUtils {
 
    public static Connection getConnection() throws Exception {
        // 1.定义连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        // 2.设置服务器地址
        factory.setHost("127.0.0.1");
        // 3.设置协议端口号
        factory.setPort(5672);
        // 4.虚拟主机名称;默认为 /
        factory.setVirtualHost("/");
        // 5.设置用户名称
        factory.setUsername("admin");
        // 6.设置用户密码
        factory.setPassword("admin123");
        // 7.创建连接
        Connection connection = factory.newConnection();
        return connection;
    }
}

在RabbitMQ管理后台创建admin用户;可以使用默认的guest用户。



深入学习RabbitMQ五种模式(一)_rabbitmq_06

  • 创建生产者

生产者负责创建消息并且将消息发送至指定的队列中,简单分为5步:

创建连接 ——> 创建通道 ——> 创建(声明)队列 ——> 发送消息 ——> 关闭资源

package com.olive;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;

/**
 * 生产者(简单模式)
 */
public class SimpleProducer {

    /**队列名称*/
    private static final String QUEUE_NAME = "simple_queue";

    public static void main(String[] args) throws Exception {
        // 1、获取连接
        Connection connection = ConnectionUtils.getConnection();
        // 2、创建通道(频道)
        Channel channel = connection.createChannel();
        // 3、声明(创建)队列
        /*
         * queue      参数1:声明通道中对应的队列名称
         * durable    参数2:是否定义持久化队列,当mq重启之后队列还在
         * exclusive  参数3:是否独占本次连接,为true则只能有一个消费者监听这个队列
         * autoDelete 参数4:是否自动删除队列,如果为true表示没有消息也没有消费者连接自动删除队列
         * arguments  参数5:队列其它参数(额外配置)
         */
        channel.queueDeclare(QUEUE_NAME, true, false, false, null);

        // 4.发送消息
        /*
         * exchange   参数1:交换机名称,如果没有指定则使用默认Default Exchange
         * routingKey 参数2:队列名称或者routingKey,如果指定了交换机就是routingKey路由key,简单模式可以传递队列名称
         * props      参数3:消息的配置信息
         * body       参数4:要发送的消息内容
         */
        String msg = "Hello World RabbitMQ!!!";
        System.out.println("生产者发送的消息:" + msg);
        channel.basicPublish("", QUEUE_NAME, null, msg.getBytes());

        //关闭资源
        channel.close();
        connection.close();
    }
}
  • 创建消费者

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

获取连接 ——> 创建通道 ——> 监听队列,接收消息

package com.olive;

import java.io.IOException;

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;

/**
 * 消费者(简单模式)
 */
public class SimpleConsumer {

    /**队列名称*/
    private static final String QUEUE_NAME = "simple_queue";

    public static void main(String[] args) throws Exception {
        // 1、获取连接对象
        Connection connection = ConnectionUtils.getConnection();
        // 2、创建通道(频道)
        Channel channel = connection.createChannel();

        // 3. 创建队列Queue,如果没有一个名字叫simple_world的队列,则会创建该队列,如果有则不会创建.
        // 这里可有可无,但是发送消息是必须得有该队列,否则消息会丢失
        channel.queueDeclare(QUEUE_NAME, true, false, false, null);

        // 4、监听队列,接收消息
        DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
            /*
             *  handleDelivery回调方法,当收到消息后,会自动执行该方法
             *  consumerTag 参数1:消费者标识
             *  envelope    参数2:可以获取一些信息,如交换机,路由key...
             *  properties  参数3:配置信息
             *  body        参数4:读取到的消息
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("消费者获取消息:" + new String(body));
            }
        };
        /*
         * queue    参数1:队列名称
         * autoAck  参数2:是否自动确认,true表示自动确认接收完消息以后会自动将消息从队列移除。否则需要手动ack消息
         * callback 参数3:回调对象,在上面定义了
         */
        channel.basicConsume(QUEUE_NAME, true, defaultConsumer);

        //注意,消费者这里不建议关闭资源,让程序一直处于读取消息的状态
    }
}
  • 验证测试

运行生产者的代码,表示向队列中发送消息。



深入学习RabbitMQ五种模式(一)_分布式_07

查看RabbitMQ控制台中的Queues内容



深入学习RabbitMQ五种模式(一)_java_08

启动消费者,消费RabbitMQ队列中的消息。



深入学习RabbitMQ五种模式(一)_java_09

在通过RabbitMQ控制台查看Queues的内容;发现消息已经被消费



深入学习RabbitMQ五种模式(一)_rabbitmq_10

简单模式的不足之处:该模式是一对一,一个生产者向一个队列中发送消息,一个消费者从绑定的队列中获取消息,这样耦合性过高,如果有多个消费者想消费队列中信息就无法实现了。


标签:队列,rabbitmq,五种,深入,RabbitMQ,import,com,消息
From: https://blog.51cto.com/u_13538361/6400983

相关文章

  • windows10环境下安装RabbitMQ以及延时插件(图文)
    安装转载:https://www.cnblogs.com/saryli/p/9729591.html插件转载:https://blog.csdn.net/nbdclw/article/details/107441772安装及配置环境第一步:下载并安装erlang原因:RabbitMQ服务端代码是使用并发式语言Erlang编写的,安装RabbitMQ的前提是安装Erlang。下载地址:http://ww......
  • 在树莓派上设置应用程序开机启动的五种方法
    在树莓派上设置开机自动启动一个应用程序有五种方法:1、rc.local配置2、.bashrc配置3、init.dtab配置4、systemd配置5、crontab计划任务我们使用一个例子程序,其功能是在树莓派启动时播报「WelcometotheworldofRaspberryPi」。该程序使用Espeak库实现,因此需要......
  • RabbitMq镜像策略模式
    镜像策略ha-modeha-params说明exactlycount集群中队列副本的数量(主队列加上镜像)。count值为1表示一个副本:只有主节点。如果主节点不可用,则其行为取决于队列是否持久化。count值为2表示两个副本:一个队列主队列和一个队列镜像。换句话说......
  • 深入探索C++对象模型(十一)执行期语义学(临时对象)
    关于临时对象的几条准则。1. 在某些情况下,编译器可以产生必要的,或者可以带来方便的临时对象,具体行为由编译器来定义。例如,对于如下操作:1.Ta,b;2.Tc=a+b;//Toperator+(constT&,constT&)a.编译器会产生一个临时对象,放置a+b的结果,然后使用T的拷贝构造函数,把临时......
  • Mybatis的五种分页方式详解
     第一种:LIMIT关键字1,mapper代码select*fromtb_userlimit#{pageNo},#{pageSize}2,业务层直接调用publicListfindByPageInfo(PageInfoinfo){returnuserMapper.selectByPageInfo(info);}3,优点灵活性高,可优化空间大mysql分页语句优化4,缺点实现复杂。 第......
  • CSS的五种定位方式【哪一种脱离文档流】
    元素自身居中(非内容)块级元素居中:margin:0auto;行内元素和行内块元素:给上级元素添加text-align:center; 定位方式包括:静态定位相对定位绝对定位固定定位浮动定位静态定位(文档流定位)格式:position:static;(默认的定位方式)......
  • RabbitMQ - 使用amqp库连接RabbitMQ(实例使用)
    1、发送端步骤分解如下:(1)建立连接conn,err:=amqp.Dial("amqp://admin:[email protected]:5672/")(2)打开channel这里的channel是AMQP里的概念,可以理解为多路复用的一个tcp长连接。(3)声明一个队列q,err:=ch.QueueDeclare(...)(4)创建消息msg:=amqp.Publishing{...}(5)发布......
  • 【2023 · CANN训练营第一季】——应用开发深入讲解——模型转换的ATC工具
    前言: 做一个推理应用,首先从模型转换开始(当然先得选好一个合适的模型)。在昇腾平台做模型推理,需要将Caffe,TensorFlow等开源框架网络模型转换成Davinci架构专用模型(OM格式)。昇腾张量编译器(AscendTensorCompiler,简称ATC)是异构计算架构CANN体系下的模型转换工具,模型转换过程中,ATC会进......
  • RabbitMQ在Windows下设置服务启动
    1.管理员模式运行  cmd 2.进入RabbitMQ安装目录下的sbin目录   输入命令: cdrabbitMQ的sbin路径,进入sbin目录输入命令:rabbitmq-service.batinstall进入服务,开启rabbitMQ服务 ......
  • C/C++杂记:深入虚表结构
    1.虚表与“虚函数表”在“C/C++杂记:虚函数的实现的基本原理”一文中曾提到“虚函数表”的概念,只是为了便于理解,事实是:虚函数表并不真的独立存在,它只是虚表(virtualtable)中的一部分内容。例:从图中可已看出,虚表除了包含虚函数指针,还包含其它一些信息(如:RTTI信息、偏移值等)。顺便......