首页 > 其他分享 >RabbitMQ 入门示例

RabbitMQ 入门示例

时间:2024-08-25 15:47:57浏览次数:12  
标签:入门 示例 队列 rabbitmq RabbitMQ 参数 消息 com channel

参考:BV15k4y1k7Ep

RabbitMQ 相关概念及简述中简单介绍了 RabbitMQ 提供的 6 种工作模式。下面以简单模式为例,介绍 RabbitMQ 的使用。

新建工程

先新建 Maven 工程 RabbitMQ 作为父工程,在父工程下新建三个子模块:

  • common:公共包
  • producer:生产者
  • consumer:消费者

在三个模块中添加 amqp-client 依赖:

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

在 producer 和 consumer 中添加 common 依赖:

<dependency>
  <groupId>com.zhangmingge.rabbitmq</groupId>
  <artifactId>common</artifactId>
  <version>1.0-SNAPSHOT</version>
</dependency>

编写 common

在 common 中添加用于获取 connection 的工具类,后面 producer 和 consumer 都会用到:

package com.zhangmingge.rabbitmq;

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

public class ConnectionUtil {

    public static Connection getConnection() throws Exception {
        // 创建连接工厂
        ConnectionFactory connectionFactory = new ConnectionFactory();
        // 主机地址;默认为 localhost
        connectionFactory.setHost("192.168.88.128");
        // 连接端口;默认为 5672
        connectionFactory.setPort(5672);
        // 虚拟主机名称;默认为 /
        connectionFactory.setVirtualHost("/vhost");
        // 连接用户名;默认为 guest
        connectionFactory.setUsername("admin");
        // 连接密码;默认为 guest
        connectionFactory.setPassword("123456");

        // 创建连接
        return connectionFactory.newConnection();
    }

}

编写 producer

package com.zhangmingge.rabbitmq;

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

public class Producer {

    static final String QUEUE_NAME = "simple_queue";

    public static void main(String[] args) throws Exception {

        // 创建连接
        Connection connection = ConnectionUtil.getConnection();

        // 创建频道
        Channel channel = connection.createChannel();

        // 声明(创建)队列
        /*
         * 参数 1:队列名称
         * 参数 2:是否定义持久化队列
         * 参数 3:是否独占本次连接
         * 参数 4:是否在不使用的时候自动删除队列
         * 参数 5:队列其它参数
         */
        channel.queueDeclare(QUEUE_NAME, true, false, false, null);

        // 要发送的信息
        String message = "你好;小兔子!";
        /*
         * 参数 1:交换机名称,如果没有指定则使用默认 Default Exchange
         * 参数 2:路由 key,简单模式可以传递队列名称
         * 参数 3:消息其它属性
         * 参数 4:消息内容
         */
        channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
        System.out.println("已发送消息:" + message);

        // 关闭资源
        channel.close();
        connection.close();
    }
}

在执行上述的消息发送之后,登录 RabbitMQ 的管理控制台,可以发现队列和其中的消息:

image-20240825153428438
image-20240825153542014

编写 consumer

package com.zhangmingge.rabbitmq;

import com.rabbitmq.client.*;

import java.io.IOException;

public class Consumer {

    public static void main(String[] args) throws Exception {
        Connection connection = ConnectionUtil.getConnection();

        // 创建频道
        Channel channel = connection.createChannel();

        // 声明(创建)队列
        /*
         * 参数 1:队列名称
         * 参数 2:是否定义持久化队列
         * 参数 3:是否独占本次连接
         * 参数 4:是否在不使用的时候自动删除队列
         * 参数 5:队列其它参数
         */
        channel.queueDeclare(Producer.QUEUE_NAME, true, false, false, null);

        // 创建消费者:并设置消息处理
        DefaultConsumer consumer = new DefaultConsumer(channel) {
            @Override
            /*
             * consumerTag 消息者标签,在 channel.basicConsume 时候可以指定
             * envelope 消息包的内容,可从中获取消息 id,消息 routingKey,交换机,消息和重传标志 (收到消息失败后是否需要重新发送)
             * properties 属性信息
             * body 消息
             */
            public void handleDelivery(String consumerTag,
                                       Envelope envelope,
                                       AMQP.BasicProperties properties,
                                       byte[] body) throws IOException {
                // 路由 key
                System.out.println("路由 key 为:" + envelope.getRoutingKey());
                // 交换机
                System.out.println("交换机为:" + envelope.getExchange());
                // 消息 id
                System.out.println("消息 id 为:" + envelope.getDeliveryTag());
                // 收到的消息
                System.out.println("接收到的消息为:" + new String(body, "utf-8"));
            }
        };
        // 监听消息
        /*
         * 参数 1:队列名称
         * 参数 2:是否自动确认,设置为 true 为表示消息接收到自动向 mq 回复接收到了,mq 接收到回复会删除消息,设置为 false 则需要手动确认
         * 参数 3:消息接收到后回调
         */
        channel.basicConsume(Producer.QUEUE_NAME, true, consumer);

        // 不关闭资源,应该一直监听消息
        // channel.close();
        // connection.close();
    }
}

运行 consumer 后,可以看到 consumer 打印的日志消息,每运行一次 producer,consumer 就会对应打印一次消息。

小结

上述的入门案例中使用的是如下的简单模式:

1555991074575

在上图的模型中,有以下概念:

  • P:生产者,也就是要发送消息的程序。
  • C:消费者:消息的接受者,会一直等待消息到来。
  • queue:消息队列,图中红色部分。类似一个邮箱,可以缓存消息;生产者向其中投递消息,消费者从其中取出消息。

标签:入门,示例,队列,rabbitmq,RabbitMQ,参数,消息,com,channel
From: https://www.cnblogs.com/Higurashi-kagome/p/18379024

相关文章

  • 消息队列-RabbitMQ学习笔记(一)
    1.什么是消息队列消息队列(MessageQueue,简称MQ)是一种用于在应用程序之间传递消息的技术,通常在分布式系统中使用。它提供了一种异步通信机制,使得应用程序可以通过发送和接收消息来进行数据交换。消息队列可以用来存储消息,这就涉及到消息队列的三个关键字:存储、消息、队列......
  • 信息学竞赛免费入门网课视频之语法知识框架
    graphLRA[输入输出]-->T1[DevC++软件安装]-->P1[<ahref='http://cdn.noip.space/soft/devcpp.exe'target='_blank'>软件下载</a>]-->|<spanstyle='background-color:#5cb85c'>已通过</span>|V1[<ahref=&#......
  • ensp 中 wlan 的配置过程和示例
    一、拓朴:要求:vlan20用于笔记本上网,使用Huawei信号,vlan30用于手机上网,使用Huawei-5G信号二、配置过程:        1、SW1基本配置:        起vlanbatch102030,10为管理vlan,20、30分别为办公vlan和guestvlan        到AC接口为trunk,允许vl......
  • linux下试验中间件canal的example示例-binlog日志的实时获取显示以及阿里巴巴中间件ca
    一、linux下试验中间件canal的example示例-binlog日志的实时获取显示    今天重装mysql后,进行了canal的再次试验,原来用的mysql5.7,今天重装直接换了5.6算了。反正测试服务器的mysql也不常用。canal启动后日志显示examplepreparetofindstartpositionjustshowmaste......
  • 十五张图带你快速入门 shardingsphere-proxy
    ApacheShardingSphere是一款分布式的数据库生态系统,它包含两大产品:ShardingSphere-ProxyShardingSphere-JDBC很多同学对于ShardingSphere-JDBC已经能非常熟悉的使用了,但关于网上关于ShardingSphere-Proxy5.5的使用教程却非常少。所以这篇文章,笔者尝试带大家快速入门......
  • 基于SpringBoot的智慧党建系统+uniapp移动端+LW示例参考
    1.项目介绍技术栈+环境:SpringBoot+thymeleaf+uniapp+IDEA+Navicat+MySQL功能介绍:后端功能:首页管理(轮播图、通知公告、新闻管理)、用户管理(用户信息、用户反馈、用户订单、用户动态)、其他管理(题库管理、任务管理)移动端:学习模块、游戏学习模块、打卡签到、积分商城、问题咨......
  • CentOS7 安装及配置 RabbitMQ
    主要总结自:Centos7安装RabbitMQ1、安装前准备由于RabbitMQ使用的是Erlang语言开发的,因此在安装RabbitMQ之前需要安装Erlang环境,Erlang与RabbitMQ的下载地址分别为:Erlang:https://github.com/rabbitmq/erlang-rpm/releasesRabbitMQ:https://github.com/rabbitmq/rabbitmq-ser......
  • MySQL入门学习-对系统数据库的常用查询
        通常情况下,MySQL中的系统数据库有information_schema、mysql和performance_schema。这些数据库提供了有关数据库服务器的各种信息,例如表结构、用户权限、性能指标等。一、使用这些系统数据库进行常用查询的示例:1.查询表结构信息:  -使用information_sch......
  • MySQL入门学习-服务器优化.Sys数据库
    一、关于MySQL入门学习中服务器优化和Sys数据库的一些常见方面:1.服务器优化:  -硬件优化:    确保服务器具有足够的内存、CPU资源和快速的磁盘I/O。  -操作系统优化:    合理配置操作系统参数,如文件描述符限制、内核参数等。  -数据库......
  • 浦语Camp3:入门3-Git基础
    任务等级任务内容必做任务破冰,提交一份自我介绍必做任务创建并提交一个项目1.破冰,提交一份自我介绍因此使用gitconfig--global命令来设置用户名和用户邮件执行:gitconfig--globaluser.name"YourName"#真实信息脱敏处理gitconfig--globaluser.email"your......