SSM整合RabbitMQ,Spring4.x整合RabbitMQ

SSM整合RabbitMQ目录

  • 前言
  • 版本
  • 实现
    • 目录参考
    • pom.xml依赖
    • rabbitmq.properties配置文件
    • spring-rabbitmq.xml
    • spring-mvc.xml或applicationContext.xml
    • rabbitmq目录下
      • MessageConsumer.java
      • MessageConsumer2.java
      • MessageProducer.java
      • MessageConstant.java
    • 测试调用
  • 扩展
    • 消息重发

前言

SSM框架整合RabbitMQ【比较简单,复制粘贴可用】
本人使用的Spring版本是4.x

版本

RabbitMQ相关
erl10.0.1
RabbitMQ3.7.9
安装步骤参考:https://www.cnblogs.com/saryli/p/9729591.html

相关依赖
spring4.0.2.RELEASE
spring-rabbit1.3.5.RELEASE

实现

目录参考

这是我整合时的项目结构
关键:rabbitmq文件包和rabbitmq.properties、spring-rabbitmq.xml、spring-mvc.xml
在这里插入图片描述

pom.xml依赖

在现成的SSM项目中整合

	<!--rabbitmq依赖 --><dependency><groupId>org.springframework.amqp</groupId><artifactId>spring-rabbit</artifactId><version>1.3.5.RELEASE</version></dependency>

rabbitmq.properties配置文件

将 rabbitmq.properties配置文件添加到resources目录下

mq.host=127.0.0.1
mq.username=guest
mq.password=guest
mq.port=5672
mq.virtual-host=/

spring-rabbitmq.xml

将spring-rabbitmq.xml添加到resources目录下

<?xml version="1.0" encoding="UTF-8"?>
<beans 	xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:rabbit="http://www.springframework.org/schema/rabbit"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsdhttp://www.springframework.org/schema/rabbithttp://www.springframework.org/schema/rabbit/spring-rabbit-1.3.xsd"><!-- 引入连接配置文件 --><bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">    <property name="location" value="classpath:rabbitmq.properties" /></bean> <!-- 定义rabbitmq connectionFactory连接工厂 --><rabbit:connection-factory id="connectionFactory"username="${mq.username}"password="${mq.password}" host="${mq.host}" port="${mq.port}"virtual-host="${mq.virtual-host}" /><!--通过指定下面的admin信息,当前producer中的exchange和queue会在rabbitmq服务器上自动生成 --><rabbit:admin id="connectAdmin" connection-factory="connectionFactory" /><!--定义queue队列 --><rabbit:queue name="queueTest" durable="true" auto-delete="false" exclusive="false" declared-by="connectAdmin" /><rabbit:queue name="queueTest1" durable="true" auto-delete="false" exclusive="false" declared-by="connectAdmin" /><!-- 定义direct exchange(也就是交换机),绑定queueTest队列(queueTest名称可以自定义) --><rabbit:direct-exchange name="exchangeTest" durable="true" auto-delete="false" declared-by="connectAdmin"><rabbit:bindings><rabbit:binding queue="queueTest" key="queueTestKey"></rabbit:binding><rabbit:binding queue="queueTest1" key="queueTestKey1"></rabbit:binding></rabbit:bindings></rabbit:direct-exchange><!--定义rabbit template用于数据的接收和发送 将amqpTemplate对象绑定exchange中交换机--><rabbit:template id="amqpTemplate" connection-factory="connectionFactory" exchange="exchangeTest" /><!-- 消息接收处理 --><bean id="messageReceiver" class="com.rabbitmq.MessageConsumer"></bean><bean id="messageReceiver1" class="com.rabbitmq.MessageConsumer2"></bean><!-- queue litener 观察 监听模式 当有消息到达时会通知监听在对应的队列上的监听对象(监听) --><rabbit:listener-container connection-factory="connectionFactory"><rabbit:listener queues="queueTest" ref="messageReceiver" /><rabbit:listener queues="queueTest1" ref="messageReceiver1" /></rabbit:listener-container><!-- 扫描注入使用注解实例对象 --><context:component-scan base-package="com.rabbitmq" /></beans>

spring-mvc.xml或applicationContext.xml

我这里使用的spring-mvc.xml,根据自己配置文件使用

<import resource="classpath:spring-rabbitmq.xml" />

将这个import引入添加到 spring-mvc.xml 里的最前面,如果不添加到前面可能会报错
在这里插入图片描述

rabbitmq目录下

这个目录下的java文件已在spring-rabbitmq.xml中进行扫描注入

MessageConsumer.java

说明:MessageConsumer和MessageConsumer2其实都可以使用同一个类,修改xml指向即可,但是分开明了些

package com.rabbitmq;import java.nio.charset.Charset;import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener;/*** @Title消息消费者* @date 2023/10/8*/
public class MessageConsumer implements MessageListener {@Overridepublic void onMessage(Message message) {// 逻辑处理System.out.println("message------->:" + new String(message.getBody(), Charset.forName("utf-8")));}}

MessageConsumer2.java

package com.rabbitmq;import java.nio.charset.Charset;import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener;/*** @Title消息消费者2* @date 2023/10/8*/
public class MessageConsumer2 implements MessageListener {@Overridepublic void onMessage(Message message) {// 逻辑处理System.out.println("message2------->:" + new String(message.getBody(), Charset.forName("utf-8")));}}

MessageProducer.java

package com.rabbitmq;import javax.annotation.Resource;import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.stereotype.Service;/*** @Title 消息生产者* @date 2023/10/8*/
@Service
public class MessageProducer {@Resourceprivate AmqpTemplate amqpTemplate;public void sendMessage(String key, Object message){amqpTemplate.convertAndSend(key, message);}}

MessageConstant.java

package com.rabbitmq;/*** @Title 消息队列常量* @date 2023/10/8*/
public class MessageConstant{public static String queueTestKey = "queueTestKey";public static String queueTestKey1 = "queueTestKey1";}

测试调用

比如这个下面在某个类里作为接口调用测试

	@Autowiredprivate MessageProducer messageProducer;@RequestMapping(value = "/testMq")@ResponseBodypublic Result testMq(HttpServletRequest request) throws IOException {messageProducer.sendMessage(MessageConstant.queueTestKey, "登录");messageProducer.sendMessage(MessageConstant.queueTestKey1, "退出");return Result.success("测试成功");}

调用接口后打印结果
在这里插入图片描述
连接结果
在这里插入图片描述
以上即可!

扩展

包括消息手动确认,消息失败重新加入队列处理

消息重发

package com.rabbitmq;import java.nio.charset.Charset;import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.core.ChannelAwareMessageListener;import com.rabbitmq.client.Channel;/*** @Title 消息消费者* @date 2023/10/8*/
public class MessageConsumer2 implements ChannelAwareMessageListener {private int aa = 1;@Overridepublic void onMessage(Message message, Channel channel) throws Exception {try {// 逻辑处理if(aa == 1) {aa = 2;int a = 1/0;}System.out.println("成功处理确认message2------->:" + new String(message.getBody(), Charset.forName("utf-8")));// 消费者ack确认【消息处理成功确认】channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);}catch (Exception e) {System.out.println("失败重新入队message2------->:" + new String(message.getBody(), Charset.forName("utf-8")));// 消费者reject确认【消息失败重新加入队列-重发】channel.basicReject(message.getMessageProperties().getDeliveryTag(), true);}}}

参考类似博客1:https://blog.csdn.net/u012988901/article/details/89499634
参考类似博客2:https://blog.csdn.net/weixin_42654295/article/details/109006276

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

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

相关文章

硬件测试(一):温循

一、定义&#xff1a; 温度循环试验&#xff0c;也称为热循环试验或高低温循环试验&#xff0c;是将试验样品暴露于预设的高低温交替的试验环境中所进行的可靠性试验。 温循作为自然环境的模拟&#xff0c;可以考核产品在不同环境条件下的适应能力&#xff0c;常用于产…

04训练——基于YOLO V8的自定义数据集训练——在windows环境下使用pycharm做训练-1总体步骤

在上文中,笔者介绍了使用google公司提供的免费GPU资源colab来对大量的自定义数据集进行模型训练。该方法虽然简单好用,但是存在以下几方面的短板问题: 一是需要通过虚拟服务器做为跳板机来访问,总体操作起来非常繁杂。 二是需要将大量的数据上传缓慢,管理和使用非常不友…

微信小程序使用CryptoJS加密PassWord(MD5)

微信小程序使用CryptoJS加密PassWord(MD5) 背景及环境&#xff1a; 微信小程序登录页面&#xff0c;需要加密登录密码发送给后端&#xff0c;使用 MD5 来加密密码 开发工具&#xff1a;微信开发者工具 npm安装CryptoJS 查看有哪些crypto的包 npm search crypto 找到自己需要的包…

鱼哥赠书活动第①期:《脑洞大开:透测试另类实战攻略》《Kali Linux高级渗透测试》《CTF实战:技术、解题与进阶》《构建新型网络形态下的网络空间安全体系》

鱼哥赠书活动第①期&#xff1a; 《脑洞大开&#xff1a;透测试另类实战攻略》1.1介绍&#xff1a; 《Kali Linux高级渗透测试》1.1介绍&#xff1a; 《CTF实战&#xff1a;技术、解题与进阶》1.1介绍&#xff1a; 《构建新型网络形态下的网络空间安全体系》1.1介绍&#xff1a…

Django REST framework API版本管理【通过GET参数传递】

API版本 在开发过程中可能会有多版本的API&#xff0c;因此需要对API进行管理。django drf中对于版本的管理也很方便。 http://www.example.com/api/v1/info http://www.example.com/api/v2/info 上面这种形式就是很常见的版本管理 在restful规范中&#xff0c;后端的API需…

算法题:摆动序列(贪心算法解决序列问题)

这道题是一道贪心算法题&#xff0c;如果前两个数是递增&#xff0c;则后面要递减&#xff0c;如果不符合则往后遍历&#xff0c;直到找到符合的。&#xff08;完整题目附在了最后&#xff09; 代码如下&#xff1a; class Solution(object):def wiggleMaxLength(self, nums):…

外汇天眼:罚了!有的面临高额罚款,有的已被拉黑

随着金融监管机构对外汇平台的监管力度不断加强&#xff0c;那些未遵守规则和法律的平台正面临着严厉的制裁&#xff0c;有的将面临高额罚款&#xff0c;有的已被拉黑&#xff0c;旨在确保外汇市场的透明度、公平性和合法性。那么发生了什么&#xff0c;具体新闻如下&#xff1…

串联起深度学习的整体,以及其他领域

1、从模型拟合&#xff08;收敛&#xff09;数据关系出发&#xff1a; 2、f从简单的一层和两层连接开始&#xff0c;发展&#xff1b;被表示成 3、如何判断收敛&#xff1a;,即目标函数 4、如何界定任务&#xff1a;&#xff0c;表示什么&#xff1f;表示什么&#xff1f;&a…

29 WEB漏洞-CSRF及SSRF漏洞案例讲解

目录 CSRF漏洞解释&#xff0c;原理等CSRF漏洞检测&#xff0c;案例&#xff0c;防御等防御方案2、设置随机Token3、检验referer来源 SSRF漏洞会比csrf漏洞重要一些SSRF_PHP&#xff0c;JAVA漏洞代码协议运用演示案例:SSRF_漏洞代码结合某漏洞利用测试 如何查找ssrf漏洞 SSRF漏…

【Spring Boot】SpringBoot 单元测试

SpringBoot 单元测试 一. 什么是单元测试二. 单元测试的好处三. Spring Boot 单元测试单元测试的实现步骤 一. 什么是单元测试 单元测试&#xff08;unit testing&#xff09;&#xff0c;是指对软件中的最⼩可测试单元进⾏检查和验证的过程就叫单元测试。 二. 单元测试的好处…

c语言文件操作详解:fgetc,fputc,fgets,fputs,fscanf,,fprintf,fread,fwrite的使用和区别

前言&#xff1a;在对于c语言的学习中&#xff0c;我们为了持续使用一些数据&#xff0c;为了让我们的数据可以在程序退出后仍然保存并且可以使用&#xff0c;我们引入了文件的概念和操作&#xff0c;本文旨在为大家分享在文件操作中常用的输入输出函数的使用方式和技巧&#x…

计算机的体系与结构

文章目录 前言一、冯诺依曼体系二、现代计算机的结构总结 前言 今天给大家介绍计算机的体系和结构&#xff0c;分为两个板块&#xff1a;冯诺依曼体系和现代计算机的结构。 一、冯诺依曼体系 冯诺依曼体系是将程序指令和数据一起存储的计算机设计概念结构。 冯诺依曼体系可以…

mybatis配置entity下不同文件夹同类型名称的多个类型时启动springboot项目出现TypeException源码分析

记录问题&#xff1a;当配置了 mybatis.type-aliases-packagecom.runjing.erp.entity 配置项时&#xff0c;如果entity文件夹下存在不同子文件夹下的同名类型时&#xff0c;mybatis初始化加载映射时会爆出org.apache.ibatis.type.TypeException&#xff1a; The alias TestDemo…

SpringBoot集成WebSocket讲解

文章目录 1 WebSocket1.1 简介1.2 WebSocket作用和调用1.2.1 作用1.2.2 js端调用 1.3 Javax1.3.1 服务端1.3.1.1 服务端接收1.3.1.2 服务端集成1.3.1.3 ping和pong消息 1.3.2 客户端1.3.2.1 客户端接收1.3.2.2 客户端发送 1.4 WebMVC1.4.1 服务端1.1.4.1 服务端接收1.1.4.2 服务…

如何列出 Ubuntu 和 Debian 上已安装的软件包

当你安装了 Ubuntu 并想好好用一用。但在将来某个时候&#xff0c;你肯定会遇到忘记曾经安装了那些软件包。 这个是完全正常。没有人要求你把系统里所有已安装的软件包都记住。但是问题是&#xff0c;如何才能知道已经安装了哪些软件包&#xff1f;如何查看安装过的软件包呢&a…

集线器、交换机、路由器是如何转发包的

集线器、交换机、路由器是如何转发包的 集线器交换机MAC地址表的维护 路由器路由表中的信息路由器的包接收操作查询路由表确定输出端口找不到匹配路由时选择默认路由包的有效期通过分片功能拆分大网络包路由器发送操作中的一些特点 参考文档 集线器 集线器是一层&#xff08;物…

Springcloud中间件-----分布式搜索引擎 Elasticsearch

该笔记是根据黑马程序员的课来自己写了一遍的,b站有对应教程和资料 第一部分 第二部分 第三部分 # 分布式搜索引擎01 – elasticsearch基础 0.学习目标 1.初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎&#xff0c…

【centos7安装ElasticSearch】

概述 最近工作中有用到ES &#xff0c;当然少不了自己装一个服务器捣鼓。本文的ElasticSearch 的版本&#xff1a; 7.17.3 一、下载 ElasticSearch 点此下载 下载完成后上传至 Linux 服务器&#xff0c;本文演示放在&#xff1a; /root/ 下&#xff0c;进行解压&#xff1…

C++对string进行大小写转换的三种方法

C对string进行大小写转换的三种方法 方法一&#xff1a;下标 #include <iostream> #include <string> using namespace std;int main() {string s "ABCDEFG";for( int i 0; i < s.size(); i ){s[i] tolower(s[i]);}cout<<s<<endl;re…