RabbitMQ:hello结构

2023-11-17

 

1.在Linux环境上面装入rabbitMQ

doker-compose.yml

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依赖 

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

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

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

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

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.运行消费者接收消息,并处理消息 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RabbitMQ:hello结构 的相关文章

  • Bash:检查是否给出了参数(例如是否有参数“-a”?)

    我有一个脚本 它应该接受 2 个参数 s 和 d 如果未给出 d 参数 我想删除我的调试文件 与 s 相同 如何检查 1 或 2 是否为 s 或 d 舒尔有两个参数 我可以做到 蛮力 if test 1 d test 2 d then rm
  • 找出Linux上一个进程使用了​​多少内存页

    我需要找出进程分配了多少内存页 每个页面是 4096 进程内存使用情况我在查找正确值时遇到一些问题 当我查看 gome system monitor 时 内存映射下有几个值可供选择 Thanks 这样做的目的是将内存使用量除以页数并验证页大
  • 如何在 Vim 中突出显示 Bash 脚本?

    我的 Vim 编辑器自动突出显示 PHP 文件 vim file php HTML 文件 vim file html 等等 但是当我输入 vim file在里面写一个Bash脚本 它不会突出显示它 我如何告诉 Vim 将其突出显示为 Bas
  • 应用程序中两个不同版本的库

    考虑一个场景 其中有两个不同版本的共享库 考虑 A 1 so 链接到 B so A 2 so 链接到 C so 现在 B so 和 C so 都链接到 d exe 当 B so 想要调用 A 1 so 中的函数时 它最终会调用 A 2 so
  • Linux中如何避免sleep调用因信号而中断?

    我在 Linux 中使用实时信号来通知串行端口中新数据的到达 不幸的是 这会导致睡眠呼叫在有信号时被中断 有人知道避免这种行为的方法吗 我尝试使用常规信号 SIGUSR1 但我不断得到相同的行为 来自 nanosleep 联机帮助页 nan
  • 在 scapy 中通过物理环回发送数据包

    我最近发现了 Scapy 它看起来很棒 我正在尝试查看 NIC 上物理环回模块 存根上的简单流量 但是 Scapy sniff 没有给出任何结果 我正在做的发送数据包是 payload data 10 snf sniff filter ic
  • 为什么 OS X 和 Linux 之间的 UTF-8 文本排序顺序不同?

    我有一个包含 UTF 8 编码文本行的文本文件 mac os x cat unsorted txt foo foo 津 如果它有助于重现问题 这里是文件中确切字节的校验和和转储 以及如何自己生成文件 在 Linux 上 使用base64 d
  • Python glob,操作系统,相对路径,将文件名放入列表中[重复]

    这个问题在这里已经有答案了 我正在尝试创建一个目录中所有文件的列表 其中文件名以 root 结尾 在阅读了论坛中的一些文章后 我尝试使用 glob 和 os listdir 的基本策略 但我都遇到了麻烦 首先 当我使用 import glo
  • RabbitMQ-在一个应用程序进程中为单个队列创建多个消费者是一种好习惯吗

    我刚刚处理一个由 RabbitMQ 支持的新项目 并且在应用程序启动时创建了多个监听同一个队列的消费者实例 然而 它们与不同的渠道共享相同的连接 来自队列的消息非常庞大 一次生成行为有数百万条消息 因此我猜第一个代码作者正在尝试做一些事情来
  • 链接错误:命令行中缺少 DSO

    我对 Linux 使用 Ubuntu 14 04 LTS 64 位 相当陌生 来自 Windows 并且正在尝试移植我现有的 CUDA 项目 当通过链接时 usr local cuda bin nvcc arch compute 30 co
  • BASH:输入期间按 Ctrl+C 会中断当前终端

    我的 Bash 版本是 GNU bash version 4 3 11 1 release x86 64 pc linux gnu 我有一段这样的代码 while true do echo n Set password read s pas
  • Crontab 每 5 分钟一次 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我如何告诉 crontab 每 5 分钟运行一次 但从每小时的第二分钟开始 换句话说 我想在以下时间执行我的脚本minute 5 2 例如 我的脚本应
  • “git add”返回“致命:外部存储库”错误

    我刚刚进入 git 的奇妙世界 我必须提交我对程序所做的一系列更改 位于名为的目录中 var www myapp 我创建了一个新目录 home mylogin gitclone 从这个目录中 我做了一个git clone针对公共回购 我能够
  • 在 x86 汇编语言中获取文件大小的简单方法

    假设我已经在汇编中打开了一个文件 并且在寄存器 eax 中有该文件的文件句柄 我将如何获取文件的大小 以便为其分配足够的缓冲区空间 我在这里研究了另一个讨论 建议使用sys fstat 28 系统调用来获取文件统计信息但无法实现它 My a
  • 使用 libusb 输出不正确

    我用libusb编写了一个程序 我怀疑输出是否正确 因为所有条目都显示相同的供应商和产品 ID 以下是代码 include
  • LINUX:如何锁定内存中进程的页面

    我有一个 LINUX 服务器 运行一个具有大量内存占用的进程 某种数据库引擎 该进程分配的内存太大 需要将其中一部分换出 换出 我想做的是将所有其他进程 或正在运行的进程的子集 的内存页面锁定在内存中 以便只有数据库进程的页面被换出 例如
  • 嵌入清单文件以要求具有 mingw32 的管理员执行级别

    我正在 ubuntu 下使用 i586 mingw32msvc 交叉编译应用程序 我很难理解如何嵌入清单文件以要求 mingw32 具有管理员执行级别 对于我的例子 我使用了这个hello c int main return 0 这个资源文
  • 如何从 C++ 程序中重新启动 Linux?

    我有一个 Qt 4 GUI 我需要在下拉菜单中提供一个选项 允许用户选择重新启动计算机 我意识到这对于以其他方式重新启动计算机的能力来说似乎是多余的 但选择需要保留在那里 我尝试使用 system 来调用以下内容 suid root she
  • awk 在循环中使用时不打印任何内容[重复]

    这个问题在这里已经有答案了 我有一堆使用 file 1 a 1 txt 格式的文件 如下所示 A 1 B 2 C 3 D 4 并使用以下命令添加包含每个文件名称的新列 awk print FILENAME NF t 0 file 1 a 1
  • 为什么 Linux 原始套接字的 RX 环大小限制为 4GB?

    背景 我试图mmap 我的原始套接字的 RX 环形缓冲区64 bitLinux 应用程序 我的环由 4096 个块组成 每个块大小为 1MB 总共 4GB 请注意 每个 1MB 块中可以有许多帧 如果您好奇 请参阅此文档了解背景信息 htt

随机推荐

  • mysql不等于的写法_mysql 不等于 符号写法

    经过测试发现mysql中用 lt gt 与 都是可以的 但sqlserver中不识别 所以建议用 lt gt selece from jb51 where id lt gt 45 sql 里 符号 lt gt 于 的区别 lt gt 与 都
  • 打印机驱动安装教程

    工作中 尤其是从事半文秘工作的人 不是全文秘 没有安装打印机驱动经验 这里就来说说如何安装佳能打印机驱动 准备安装资料 佳能打印驱动 安装步骤 1 我这里是压缩文件 解压后 点击Setup exe开始安装 2 要同意才能下一步安装 3 根据
  • jenkins运行Linux后台命令

    这里是指广义上的后台 不管是shell命令nohub或者其他 只要是需要常驻linux后台的命令或者程序 如果通过Jenkins启动 当任务结束时Jenkins都会清理掉此次任务中的所有相关进程 现象就是明明运行成功了但是实际找不到进程 解
  • 安装CPU版本的pytorch和torchvision(Win10)

    前言 在使用以下方法之前 我是用了网上说的搭建清华镜像进行下载 虽然pytorch下载成功了 但是在下载torchvision的时候就一直成功不了 在网络的大千世界中 我终于悟到先本地下载再安装的方法 第一步 找好对应的版本 第二步 下载本
  • 基于Canal与Flink实现数据实时增量同步(一)

    点击上方蓝色字体 关注我 canal是阿里巴巴旗下的一款开源项目 纯Java开发 基于数据库增量日志解析 提供增量数据订阅 消费 目前主要支持了MySQL 也支持mariaDB 准备 配置MySQL的binlog 常见的binlog命令 是
  • Java多线程分批导入数据

    package com rk iam sys service author wdy version 1 0 date 2022 4 27 14 50 import com alibaba fastjson JSON import com a
  • NLP学习笔记-聊天机器人项目准备(三)

    走进聊天机器人 1 目前企业中的常见的聊天机器人 QA BOT 问答机器人 回答问题 有明确目标 能够返回结果 代表 智能客服 比如 提问和回答 TASK BOT 任务机器人 通过机器人帮助人去完成事情 代表 siri 比如 设置明天早上9
  • 使用词云报错‘TransposedFont‘ object has no attribute ‘getbbox‘

    网上根本找不到这句报错 搞了很久 终于搞完了 1 卸载numpy库 pip uninstall numpy 2 卸载pillow库 pip uninstall pillow 3 卸载词云库 pip uninstall wordcloud 再
  • Linux宝塔面板反向代理设置教程

    此方法最简单快捷 没有复杂步骤 不容易出错 即最简单 零代码 零部署的方法 实现准备 一台服务器 安装宝塔面板 OpenAI官方的API KEY ChatGPT网站系统源码 ChatGPT网站系统源码 大家可以看看另一篇文章介绍 最新版本系
  • 项目中如何修改element-ui的默认样式

    element ui 修改默认样式 一 第一种 修改element ui默认的样式 如果要组件内全局修改 首先在浏览器里F12找到element默认的UI类名 找到要修改的默认类名以后 在文件中修改代码 重写属性 但是如果已经在全局内修改了
  • Nginx反向代理技巧

    跨域 作为一个前端开发者来说不可避免的问题就是跨域 那什么是跨域呢 跨域 指的是浏览器不能执行其他网站的脚本 它是由浏览器的同源策略造成的 是浏览器对javascript施加的安全限制 浏览器的同源策略是指协议 域名 端口都要相同 其中有一
  • 与大多数台式机和移动广告软件说再见

    Some time ago I wrote an article where I described read it here an easy way to get rid of advertisements on your smart T
  • 解决go-cqhttp登录失败:密码错误或账号被冻结

    目录 前言 解决方法一 下载最新go cqhttp 使用方法 解决方法二 总结 推荐阅读 http t csdn cn nQfIY 前言 解决go cqhttp登录失败 密码错误或账号被冻结 解决方法一 下载最新go cqhttp 1 0
  • esp32 CMT130-V1.0 PS 240*240屏幕使用方法实验

    1 安装好Arduino 1 8 13 注意尽量不要大于1 8的版本 2 安装esp32驱动代码并且配置 3 esp32选择波特率 921600 4 选择频率 80MHZ 5 具体连线总结 6 需要在Arduino库管理中心下载TFT eS
  • HTTP协议(超文本传输协议)

    目录 1 HTTP协议介绍 2 HTTP协议格式 3 代码实现 1 HTTP协议介绍 HTTP协议是一个简单的请求响应协议 HTTP协议是一个明文字符串传输协议 便于调试 HTTP协议在传输层上基于TCP协议实现数据传输 本质上HTTP服务
  • BUUCTF[强网杯 2019]随便注 的三种解法

    文章目录 尝试注入 解题思路1 解题思路2 解题思路3 知识点总结 打开后题目是这样的 尝试注入 1 测试 1 or 1 1 初步判定存在SQL注入 1 or 1 1 再测试字段数 到3时报错 说明字段数为2 1 order by 1 接着
  • 测试开发1

    基本概念 一 测试开发基本概念 1 什么是软件测试 2 软件测试和软件开发的区别 3 你为什么选择软件测试 4 什么是需求 二 测试开发基础 1 需求是软件测试的依据 2 用户名和密码登陆测试用例 2 1 功能角度 2 2 非功能需求维度
  • 同学,DBDiff了解一下

    DBDiff是一款自动化的数据库schema和数据对比工具 它可以比较两个数据库 支持本地 远程库 并自动生成差异报告 数据库Schema代表数据库中的数据结构 包括表 视图 索引 序列 存储过程等 在设计数据库Schema时需要考虑各种数
  • Hyperledger fabric: 使用dev模式调试链码(chaincode)

    fabric的链码开发是比较痛苦的 主要是调试起来特别繁琐 在不使用dev模式的情况下 写好chaincode之后不能在本地测试 必须将代码部署到docker 然后再install instantiate 这样peer节点会在新的容器中启动
  • RabbitMQ:hello结构

    1 在Linux环境上面装入rabbitMQ doker compose yml version 3 1 services rabbitmq image daocloud io library rabbitmq management res