RabbitMQ:hello结构

1.在Linux环境上面装入rabbitMQ

doker-compose.yml

XML 复制代码
version: "3.1"
services:
  rabbitmq:
    image: daocloud.io/library/rabbitmq:management
    restart: always
    container_name: rabbitmq
    ports:
      - 6786:5672
      - 16786:15672
    volumes:
      - ./data:/var/lib/rabbitmq

doker-compose up -d 运行

2.进入rabbitMQ提供的客户端路径

自己的路径,和客户端端口号

RabbitMQ Management

http://8.140.244.227: 16786

3.在客户端注册虚拟主机

4.创建角色

5.给角色绑定虚拟主机

6.导入RabbitMQ依赖

XML 复制代码
        <dependency>
            <groupId>com.rabbitmq</groupId>
            <artifactId>amqp-client</artifactId>
            <version>5.6.0</version>
        </dependency>

7.写个工具类,获取连接

java 复制代码
package com.qf.springbootRbMQ.utils;

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

public class MQUtils {

    public static Connection getConnection() throws Exception {
        //创建连接工厂对象
        ConnectionFactory connectionFactory = new ConnectionFactory();

        //设置MQ服务器的相关信息
        connectionFactory.setHost("8.140.244.227");
        connectionFactory.setPort(6786);//注意:不要写成管理工具的端口号
        connectionFactory.setUsername("root");
        connectionFactory.setPassword("1234");
        connectionFactory.setVirtualHost("/email");//设置虚拟主机

        Connection connection = connectionFactory.newConnection();

        return connection;
    }


}

8.写提供者类Send

java 复制代码
package com.qf.springbootRbMQ.email;

import com.qf.springbootRbMQ.entity.EmailMessage;
import com.qf.springbootRbMQ.utils.MQUtils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import org.springframework.util.SerializationUtils;

public class Send {
    //队列的名字
    public static final String QUEUE_NAME="QQEmail";

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

        //1.获取连接对象
        Connection conn = MQUtils.getConnection();

        //2. 创建一个channel对象,对于MQ的大部分操作,都定义在了channel对象上
        Channel channel = conn.createChannel();

        //3.声明了一个队列
        /**
         * queue -- the name of the queue
         * durable -- true代表创建的队列是持久化的(当mq重启后,该对立依然存在)
         * exclusive -- 该队列是不是排他的 (该对列是否只能由当前创建该队列的连接使用)
         * autoDelete -- 该队列是否可以被mq服务器自动删除
         * arguments -- 队列的其他参数,可以为null
         */
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);


        EmailMessage emailMessage = new EmailMessage();

        emailMessage.setQq("1393087444@QQ.com");
        emailMessage.setSubject("你好啊,又见面了,发送邮箱给你啊!!!");
        emailMessage.setText("<p style='color:green'>谢谢你看我的邮件啦啦啦~~~</p>");

        byte[] bytes = SerializationUtils.serialize(emailMessage);
        //生产者如何发送消息,使用下面的方法即可
        /**
         * exchange -- 交换机的名字 ,如果是空串,说明是把消息发给了默认交换机
         * routingKey -- 路由的key,当发送消息给默认交换机时,routingkey代表队列的名字
         * other properties - 消息的其他属性,可以为null
         * body -- 消息的内容,注意,要是有 字节数组
         */
        channel.basicPublish("", QUEUE_NAME, null, bytes);
        System.out.println(" [x] Sent '" + emailMessage + "'");

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

9.写消费者类Recv

java 复制代码
package com.qf.springbootRbMQ.email;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.extra.mail.MailAccount;
import cn.hutool.extra.mail.MailUtil;
import com.qf.springbootRbMQ.entity.EmailMessage;
import com.qf.springbootRbMQ.utils.MQUtils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DeliverCallback;
import com.rabbitmq.client.Delivery;
import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Component;
import org.springframework.util.SerializationUtils;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.io.IOException;

public class Recv {



    private  final  static  String QUEUE_NAME="QQEmail";

    public static void custormer() throws Exception {
        //1.获取连接对象
        Connection conn = MQUtils.getConnection();

        //2. 创建一个channel对象,对于MQ的大部分操作,都定义在了channel对象上
        Channel channel = conn.createChannel();

        channel.queueDeclare(QUEUE_NAME, false, false, false, null);

        //3.该消费者收到消息之后的处理逻辑,写在DeliverCallback对象中
        DeliverCallback deliverCallback =new DeliverCallback() {
            @Override
            public void handle(String consumerTag, Delivery message) throws IOException {
               //这个相当于标识,消费者的ID
                System.out.println(consumerTag);
                //从Delivery对象中可以获取到生产者,发送的消息的字节数组
                byte[] body = message.getBody();
                EmailMessage emailMessage = (EmailMessage) SerializationUtils.deserialize(body);
                System.out.println(emailMessage);
                //在这里写消费者的业务逻辑,例如,发送邮件
                MailAccount account = new MailAccount();
                account.setHost("smtp.qq.com"); // 设置SMTP服务器地址
                account.setPort(25); // 设置SMTP服务器端口
                account.setAuth(true); // 设置是否需要身份认证
                account.setFrom("1393087444@qq.com"); // 设置发件人邮箱地址
                account.setUser("1393087444@qq.com"); // 设置用户名
                account.setPass("gqrjqpilpadcjbdi"); // 设置密码

                // 发送邮件
                MailUtil.send(account, CollUtil.newArrayList("1393087444@qq.com"),emailMessage.getSubject(),emailMessage.getText(),false);


            }
        };

        //4.让当前消费者开始消费(QUEUE_NAME)队列中的消息
        /**
         * queue -- the name of the queue
         * autoAck -- true 代表当前消费者是不是自动确认模式。true代表自动确认。
         * deliverCallback -- 当有消息发送给该消费者时,消费者如何处理消息的逻辑
         * cancelCallback -- 当消费者被取消掉时,如果要执行代码,写到这里
         */
        channel.basicConsume(QUEUE_NAME,true,deliverCallback,consumerTag -> {});


    }

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

10.发送提供者,建立连接消息队列,将信息放入消息队列中

11.运行消费者接收消息,并处理消息

相关推荐
softshow10263 分钟前
使用 Windows 子系统 WSL 安装 Ubuntu 22.04
linux·windows·ubuntu
wadesir4 分钟前
简易制作LinuxShell完全指南(深入解析原理、设计与实践步骤)
linux·运维·服务器
水天需0101 小时前
HISTFILE 介绍
linux
CreasyChan1 小时前
VirtualBox 安装 CentOS 7.2
linux·运维·centos
AAA.建材批发刘哥1 小时前
04--C++ 类和对象下篇
linux·c++·经验分享·青少年编程
roman_日积跬步-终至千里1 小时前
【大数据架构:架构思想基础】Google三篇论文开启大数据处理序章:(数据存储)分布式架构、(数据计算)并行计算、(数据管理)分片存储
大数据·分布式·架构
杰克崔2 小时前
glibc社区提问
linux·运维·服务器·车载系统
山上三树2 小时前
MMU与页表
linux·嵌入式硬件
yueguangni2 小时前
centos7虚拟机nat模式连接不上xshell方法分享
linux·运维·服务器
wadesir2 小时前
解决VSCodeServer在CentOS 7上运行问题:glibc 2.17升级与内核优化指南(2025最新版)
linux·运维·centos