RabbitMQ:hello结构

1.在Linux环境上面装入rabbitMQ

doker-compose.yml

version: "3.1"
services:rabbitmq:image: daocloud.io/library/rabbitmq:managementrestart: alwayscontainer_name: rabbitmqports:- 6786:5672- 16786:15672volumes:- ./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() {@Overridepublic void handle(String consumerTag, Delivery message) throws IOException {//这个相当于标识,消费者的IDSystem.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.运行消费者接收消息,并处理消息 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/69811.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】函数重载 ④ ( 函数指针定义的三种方式 | 直接定义函数指针 | 通过 函数类型 定义 函数指针 | 通过 函数指针类型 定义 函数指针 )

文章目录 一、函数指针定义方法1、直接定义函数指针2、通过 函数类型 定义 函数指针3、通过 函数指针类型 定义 函数指针4、代码示例 - 不同方式定义函数指针 博客总结 : 重载函数 : 使用 相同 的 函数名 , 定义 不同 的 函数参数列表 ;判定标准 : 只有 函数参数 的 个数 / 类…

ConfigMaps in K8s

摘要 ConfigMaps是Kubernetes&#xff08;K8s&#xff09;中用于存储应用程序配置信息的一种资源对象。它将key-value对存储为Kubernetes集群中的一个资源&#xff0c;并可以在Pod中以卷或环境变量的形式使用。 ConfigMaps的设计目的是将应用程序配置与应用程序本身解耦。它可…

安全狗亮相厦门市第五届网络安全宣传周开幕式

9月5日&#xff0c;厦门市第五届网络安全宣传周开幕式成功举行。 作为国内云原生安全领导厂商&#xff0c;安全狗也受邀参与此次大会。 据悉&#xff0c;此次主要包含领导致辞、厦门市第五届网络安全宣传周亮点活动介绍、厦门市第二届网络安全攻防演练优秀组织奖颁奖、厦门市…

SpringMVC之综合示例讲解(用示例来带你学习SpringMVC)

目录 前言 一、SpringMVC之常用注解 1. 注解说明 2. 扩展延伸 3. 注解的作用展示 导入slf4j的相关依赖及配置项目 pom.xml文件 二、参数传递 1. 基础类型String类型 测试代码 测试结果 页面 控制台 2. 复杂类型 测试代码 测试结果 页面 控制台 ​编辑 3. Req…

Linux创建新文件的几种方式

第一种是 vi 文件名&#xff0c;然后进入vi编辑&#xff0c;完了之后保存退出&#xff1b;然后ls看一下&#xff0c;文件有了&#xff1b; 在终端输入 cat > 文件名&#xff0c;这没用过&#xff1b;输入以后回车&#xff0c;不会退出命令&#xff1b;输入一行文字&#xff…

ES6中Proxy和Proxy实例

1.Proxy Proxy 这个词的原意是代理&#xff0c;用在这里表示由它来“代理”某些操作&#xff0c;可以译为“代理器” 使用方法 let p new Proxy(target, handler);其中&#xff0c;target 为被代理对象。handler 是一个对象&#xff0c;其声明了代理 target 的一些操作。p 是…

基于jeecg-boot的flowable流程自定义业务退回撤回或驳回到发起人后的再次流程提交

更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbacheng/nbcio-boot 前端代码&#xff1a;https://gitee.com/nbacheng/nbcio-vue.git 在线演示&#xff08;包括H5&#xff09; &#xff1a; http://122.227.135.243:9888 主要…

你知道Vue 3.0中Treeshaking特性吗?

介绍 Vue 3.0引入了Tree-shaking特性&#xff0c;旨在优化构建过程并减小最终生成的代码大小。Tree-shaking是一种在构建时移除未使用代码的技术&#xff0c;通过分析模块的依赖关系&#xff0c;将没有被引用的部分从最终的打包文件中排除掉。这可以大大减少应用的体积&#x…

【VL tracking】Towards Unified Token Learning for Vision-Language Tracking

不知道什么原因学校认证账号进不去&#xff0c;下载不了最新的PDF 广西师范大学 | 国科大 | 厦大 代码开源 zhihu指路&#x1f449;【VL tracking】MMTrack阅读 问题 一方面&#xff0c;传统的VL tracking方法需要昂贵的先验知识。例如&#xff0c;一些tracker是专门用于bou…

9月第1周榜单丨哔哩哔哩飞瓜数据B站UP主排行榜发布!

飞瓜轻数发布2023年8月28日-9月3日飞瓜数据UP主排行榜&#xff08;B站平台&#xff09;&#xff0c;通过充电数、涨粉数、成长指数、带货数据等维度来体现UP主账号成长的情况&#xff0c;为用户提供B站号综合价值的数据参考&#xff0c;根据UP主成长情况用户能够快速找到运营能…

无限访问 GPT-4,OpenAI 强势推出 ChatGPT 企业版!

继 ChatGPT 收费大降价、推出 App 版等系列动作之后&#xff0c;OpenAI 于今日宣布正式发布面向企业的 AI 助手——ChatGPT Enterprise 版。 与 To C 端的 ChatGPT 版本有所不同的是&#xff0c;该版本可以以更快速度无限制地访问 GPT-4&#xff0c;还可以用来处理更长输入的上…

vue3 + elementplus Cannot read properties of null (reading ‘isCE‘)

使用命令行直接下载的element-plus&#xff0c;使用时会报错。 卸载掉&#xff0c;然后在项目根目录下&#xff0c;使用vue ui安装依赖&#xff0c; 即可使用

搭建PyTorch神经网络进行气温预测

import numpy as np import pandas as pd import matplotlib.pyplot as plt import torch import torch.optim as optim import warnings warnings.filterwarnings("ignore") %matplotlib inline features pd.read_csv(temps.csv)#看看数据长什么样子 features.he…

stable diffusion实践操作-LyCORIS

系列文章目录 stable diffusion实践操作 文章目录 系列文章目录前言一、LyCORIS是什么&#xff1f;二、使用步骤1.下载2.安装3 使用 二、整理模型1.LoHa-v1.0-pynoise 总结 前言 LyCORIS&#xff0c;可以理解为lora的加强版本。 LyCORIS - Lora beYond Conventional methods,…

leetcode:1941. 检查是否所有字符出现次数相同(python3解法)

难度&#xff1a;简单 给你一个字符串 s &#xff0c;如果 s 是一个 好 字符串&#xff0c;请你返回 true &#xff0c;否则请返回 false 。 如果 s 中出现过的 所有 字符的出现次数 相同 &#xff0c;那么我们称字符串 s 是 好 字符串。 示例 1&#xff1a; 输入&#xff1a;s…

vue中实现签名画板

特意封装成了一个组件&#xff0c;签名之后会生成一张图片 signBoard.vue <template><el-drawer title"签名" :visible.sync"isShowBoard" append-to-body :show-close"false" :before-close"closeBoard" size"50%&quo…

数学建模--非整数规划问题蒙特卡洛方法的Python求解

目录 1.算法流程简介 2.算法核心代码 1.算法流程简介 #非线性整数规划 #我们一般采用蒙特卡洛算法来进行估算求解 #在实验次数足够多的情况下我们认为此解是非线性整数规划的最优解 """ #Qustion1:求解: max zx1^2x2^23x^24x4^22x5^2-8x1-2x2-3x3-x4-2x5s.t…

使用redis实现队列功能

使用redis实现队列功能 操作方法描述LPUSHLong lPush(String key, String… values)将一个或多个值 value 插入到列表 key 的表头&#xff0c;返回插入后列表中value的数量&#xff0c;若key不存在&#xff0c;会创建一个新的列表并执行 LPUSH 操作RPOPLPUSHString rPopLPush(S…

Modbus协议详解2:通信方式、地址规则、主从机通信状态

首先我们要清楚&#xff1a;Modbus是一种串行链路上的主从协议&#xff0c;在通信线路上只能有一个主机存在&#xff0c;不会有多主机存在的情况。虽然主机只有一个&#xff0c;但是从机是可以有多个的。 Modbus的通信过程都是由主机发起的&#xff0c;从机在接收到主机的请求后…

渗透测试漏洞原理之---【任意文件读取漏洞】

文章目录 1、概述1.1、漏洞成因1.2、漏洞危害1.3、漏洞分类1.4、任意文件读取1.4.1、文件读取函数1.4.2、任意文件读取 1.5、任意文件下载1.5.1、一般情况1.5.2、PHP实现1.5.3、任意文件下载 2、任意文件读取攻防2.1、路径过滤2.1.1、过滤../ 2.2、简单绕过2.2.1、双写绕过2.2.…