RabbitMQ的入门篇-RabbitMQ-HelloWorld

本文是RabbitMQ的入门篇

安装篇:https://blog.csdn.net/qq_58267473/article/details/124600014

RabbitMQ 的概念

RabbitMQ 是一个消息中间件:它接受并转发消息。你可以把它当做公司,客户把需求提给公司,项目经理项目经理会向下分配工作,按照这种逻辑 RabbitMQ 是一个公司,一个项目经理分配工作。RabbitMQ 与公司的主要区别在于,它不处理需求而是接收,
存储和转发消息数据

四 大核心概念

生产者
产生数据发送消息的程序是生产者
交换机
交换机是 RabbitMQ 非常重要的一个部件,一方面它接收来自生产者的消息,另一方面它将消息
推送到队列中。交换机必须确切知道如何处理它接收到的消息,是将这些消息推送到特定队列还是推
送到多个队列,亦或者是把消息丢弃,这个得有交换机类型决定
队列
队列是 RabbitMQ 内部使用的一种数据结构,尽管消息流经 RabbitMQ 和应用程序,但它们只能存
储在队列中。队列仅受主机的内存和磁盘限制的约束,本质上是一个大的消息缓冲区。许多生产者可
以将消息发送到一个队列,许多消费者可以尝试从一个队列接收数据。这就是我们使用队列的方式
消费者
消费与接收具有相似的含义。消费者大多时候是一个等待接收消息的程序。请注意生产者,消费
者和消息中间件很多时候并不在同一机器上。同一个应用程序既可以是生产者又是可以是消费者。

快速开始

介绍完了我们来看下Rabbit的核心部分

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jYqigJRi-1651829855368)(C:\Users\win\AppData\Roaming\Typora\typora-user-images\image-20220506142555675.png)]

本篇文章对第一部分进行学习

第一步、引入依赖

<!-- 指定 jdk 编译版本 -->
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>8</source>
                <target>8</target>
            </configuration>
        </plugin>
    </plugins>
</build>
<dependencies>
    <!--rabbitmq 依赖客户端 -->
    <dependency>
        <groupId>com.rabbitmq</groupId>
        <artifactId>amqp-client</artifactId>
        <version>5.8.0</version>
    </dependency>
    <!-- 操作文件流的一个依赖 -->
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.6</version>
    </dependency>
</dependencies>

第二步、编写消息生产者代码

package com.win.rabbitmq.one;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeoutException;

/**
 * Date:2022-05-06
 * Author:win
 * Description:
 *      生产者  :  发信息
 */
public class Producer {
    public static final String Queue_NAME="hello";
    public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {
        // 创建一个连接工厂
        ConnectionFactory connectionFactory = new ConnectionFactory();
        //工厂IP,连接Rabbit的对列
        connectionFactory.setHost("192.168.159.105");
        //用户名
        connectionFactory.setUsername("admin");
        //密码
        connectionFactory.setPassword("ok");
        //创建连接
        Connection con = connectionFactory.newConnection();
        //获取信道
        Channel channel = con.createChannel();
        /**
         * 生成一个队列
         * 1. 队列名称
         * 2. 队列里面的消息是否持久化 默认消息存储在内存中
         * 3. 该队列是否只供一个消费者进行消费 是否进行共享 true 可以多个消费者消费
         * 4. 是否自动删除 最后一个消费者端开连接以后 该队列是否自动删除 true 自动删除
         * 5. 其他参数
         */
        channel.queueDeclare(Queue_NAME,false,false,false,null);
        //发送的消息
        String msg="Hello World";
        /**
         * 发送一个消息
         * 1. 发送到那个交换机
         * 2. 路由的 key 是哪个
         * 3. 其他的参数信息
         * 4. 发送消息的消息体
         */
        channel.basicPublish("", Queue_NAME, null, msg.getBytes());
        System.out.println("消息发生完毕");

    }
}

第三步、消息消费者

package com.win.rabbitmq.one;

import com.rabbitmq.client.*;

import java.awt.geom.FlatteningPathIterator;
import java.io.IOException;
import java.util.MissingFormatArgumentException;
import java.util.concurrent.TimeoutException;

/**
 * Date:2022-05-06
 * Author:win
 * Description:
 *  消费者
 */
public class Consumer {
    public static final String QUEUE_NAME="hello";

    public static void main(String[] args) throws IOException, TimeoutException {
        ConnectionFactory factory=new ConnectionFactory();
        factory.setHost("192.168.159.105");
        factory.setUsername("admin");
        factory.setPassword("ok");
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        //消费者未成功消费的回调
        DeliverCallback deliverCallback = (consumerTag, message) -> {
            String s = new String(message.getBody());
            System.out.println(consumerTag+s);
        };
        CancelCallback cancelCallback = consumerTag -> System.out.println("消息消费被中断");

        /**
         * 消费者消费消息
         * 1. 消费哪个队列
         * 2.是否自动提交
         * 3. 消费成功之后是否要自动应答 true 代表自动应答 false 手动应答
         * 4. 消费者未成功消费的回调
         */
        channel.basicConsume(QUEUE_NAME, true,deliverCallback,cancelCallback);
    }
}

先启动生产者代码再启动消费者代码,原因是生产者没启动时并没有名为hello的队列

建议:信道工具类

因为获取信道的代码是重复的,所以我们可以把它抽出来

package com.win.rabbitmq.utils;

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

import com.rabbitmq.client.Channel;

/**
 * Date:2022-05-06
 * Author:win
 * Description:工具类
 */
public class RabbitUtils {
    public static Channel getChannel() throws Exception {
        ConnectionFactory factory=new ConnectionFactory();
        factory.setHost("192.168.159.105");
        factory.setUsername("admin");
        factory.setPassword("ok");
        Connection connection = factory.newConnection();
        return connection.createChannel();
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值