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("[email protected]");
        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("[email protected]"); // 设置发件人邮箱地址
                account.setUser("[email protected]"); // 设置用户名
                account.setPass("gqrjqpilpadcjbdi"); // 设置密码

                // 发送邮件
                MailUtil.send(account, CollUtil.newArrayList("[email protected]"),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.运行消费者接收消息,并处理消息

相关推荐
心随_风动3 分钟前
RHEL与CentOS:从同源到分流的开源操作系统演进
linux·开源·centos
ALex_zry11 分钟前
跨Linux发行版CPU指令集兼容性深度解析与实践指南
linux·运维·服务器
特立独行的猫a27 分钟前
redis客户端库redis++在嵌入式Linux下的交叉编译及使用
linux·数据库·c++·redis·redis客户端库
无敌小茶1 小时前
Linux学习笔记之环境变量
linux·笔记
Harbor Lau1 小时前
Linux常用中间件命令大全
linux·运维·中间件
爱吃泡芙的小白白2 小时前
爬虫学习——使用HTTP服务代理、redis使用、通过Scrapy实现分布式爬取
redis·分布式·爬虫·http代理·学习记录
꧁坚持很酷꧂2 小时前
Linux Ubuntu18.04下安装Qt Craeator 5.12.9(图文详解)
linux·运维·qt
凉、介2 小时前
PCI 总线学习笔记(五)
android·linux·笔记·学习·pcie·pci
电鱼智能的电小鱼3 小时前
EFISH-SBC-RK3588无人机地面基准站项目
linux·网络·嵌入式硬件·机器人·无人机·边缘计算
电鱼智能的电小鱼3 小时前
基于 EFISH-SBC-RK3588 的无人机环境感知与数据采集方案
linux·网络·嵌入式硬件·数码相机·无人机·边缘计算