SSM整合RabbitMQ,Spring4.x整合RabbitMQ

news2024/10/2 8:37:06

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/beans
						   	http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
							http://www.springframework.org/schema/context 
							http://www.springframework.org/schema/context/spring-context-4.0.xsd
						    http://www.springframework.org/schema/rabbit
						    http://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 {

    @Override
    public 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 {

    @Override
    public 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 {

    @Resource
    private 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";
    
	
}

测试调用

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

	@Autowired
    private MessageProducer messageProducer;

	@RequestMapping(value = "/testMq")
    @ResponseBody
    public 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;

	@Override
	public 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.coloradmin.cn/o/1072216.html

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

相关文章

飞桨大模型套件:一站式体验,性能极致,生态兼容

在Wave Summit 2023深度学习开发者大会上&#xff0c;来自百度的资深研发工程师贺思俊和王冠中带来的分享主题是&#xff1a;飞桨大模型套件&#xff0c;一站式体验&#xff0c;性能极致&#xff0c;生态兼容。 大语言模型套件PaddleNLP 众所周知PaddleNLP并不是一个全新的模型…

Google-CTF-2016-Stego.pcap数据包解析

Google-CTF-2016&#xff08;a-cute-stegosaurus-100&#xff09; 前言&#xff1a;别人发的题目 随便看看 记录一下解题过程&#xff01; 知识点: 在报文段中有 6Bit 的状态控制码&#xff0c; 分别如下tcp URG&#xff1a;紧急比特&#xff08;urgent&#xff09;&#x…

机械臂抓取的产业落地进展与思考

工业机械臂是一种能够模拟人类手臂动作的机械装置&#xff0c;具有高精度、高速度和高灵活性的特点。近年来&#xff0c;随着人工智能和机器人技术的快速发展&#xff0c;机械臂在工业生产、物流仓储、医疗护理等领域得到了广泛应用。机械臂抓取技术作为机械臂的核心功能之一&a…

C语言进阶---程序环境和预处理

C语言进阶---程序环境和预处理 前言一、程序的翻译环境、执行环境二、详解&#xff1a;C语言程序的编译链接三、预定义符号介绍四、预处理指令 #define五、宏和函数的对比&#xff08;思维导图&#xff09;六、命令定义、预处理指令 #include #undef1.命名约定2.命令行定义 七、…

撤销git本地修改(万能)

使用 git reflog 和 git reset 命令。 git reflog 命令可以查看 Git 中所有的提交历史和分支移动情况&#xff0c;包括已经删除的提交。 您可以通过这个命令找到git操作时间线上的某一个节点&#xff0c;也就是git提交快照的Hash值。 假设您要回滚的提交的哈希值是 e9769f5…

轻松实现时间录入自由!如何在Microsoft Word中轻松插入格式化的日期和时间

在文档中插入当前日期和时间有几个原因。你可能希望将其插入信函或页眉或页脚中。无论是什么原因&#xff0c;Word都可以轻松地将日期和时间插入文档。 如果希望在打开或打印文档时自动更新日期和时间&#xff0c;可以将其作为自动更新的字段插入。该字段也可以随时手动更新。…

【虚拟机】桥接模式下访问外网

目录 一、桥接模式的作用原理 二、配置桥接模式实现外网访问 1、设置 VMnet0 要桥接的网卡 2、虚拟机选择 VMnet0 网卡 3、手动配置虚拟机IP 一、桥接模式的作用原理 桥接模式相当于在当前局域网里创立了一个单独的主机&#xff0c;该主机桥接到宿主主机的网卡&#xff0…

TPU编程竞赛|Stable Diffusion大模型巅峰对决,第五届全球校园人工智能算法精英赛正式启动!

目录 赛题介绍 赛题背景 赛题任务 赛程安排 评分机制 奖项设置 近日&#xff0c;2023第五届全球校园人工智能算法精英赛正式开启报名。作为赛题合作方&#xff0c;算丰承办了“算法专项赛”赛道&#xff0c;提供赛题「面向Stable Diffusion的图像提示语优化」&#xff0c…

ORB-SLAM2运行自己的数据集进行定位教程

ORB-SLAM2只做定位的话&#xff0c;精度还是挺准确的&#xff0c;所以用单目摄像头录制视频&#xff0c;制作自己的数据集跑一下&#xff0c;看看定位精度&#xff0c;将过程加以记录。 文章目录 一、系统配置二、制作数据集1、脚本编写2、配置文件编写3、录制视频素材&#x…

亚马逊、速卖通卖家旺季攻略:抢占旺季销售先机!

随着11月的到来&#xff0c;海外跨境电商又将迎来一年中最重要的营销季节。 11月营销节点 1. 黑色星期五&#xff08;Black Friday&#xff09;&#xff1a;11月的第四个星期五 作为西方传统节日&#xff0c;黑色星期五通常位于11月第四个星期五&#xff0c;是购物狂欢的黄金…

LeetCode刷题笔记【35】:动态规划专题-7(爬楼梯、零钱兑换、完全平方数)

文章目录 前置知识70. 爬楼梯 &#xff08;进阶&#xff09;题目描述解题思路代码 322. 零钱兑换题目描述解题思路代码 279.完全平方数题目描述解题思路代码 总结 前置知识 今天的三道题都聚焦完全背包问题, 关于完全背包, 基础性的思路可以参考上一篇文章 本文的很多操作就是…

4.Docker 搭建 redis6

1.下载redis docker pull redis:6.2.62.创建需要挂载的宿主机文件夹 mkdir -p /data/redis/conf mkdir -p /data/redis/data3.配置redis 切换到/data/redis/conf文件夹下&#xff0c;创建redis.conf,复制redis.conf配置文件内容到redis.conf文件中&#xff0c;然后按下键盘 …

多层包的java程序使用命令行编译、运行、打包

对于没有包层级的java程序&#xff0c;用命令行进行编译、运行、打包很简单。对于多层级包的java程序会有所不同。以如下程序为例 package HeadFirstJava.chapter01.guessGame;public class GameLanucher {public static void main(String[] args) {GuessGame game new Guess…

CentOS停服遭替代,这些操作差异,你了解了吗?

背景 随着 CentOS停服&#xff0c;各个行业的运维都在寻找各自的替代方案&#xff0c;考虑的出发点有&#xff1a; 新操作系统是否兼容CentOS&#xff0c;避免太大的操作差异&#xff1b; 新操作系统是否为信创&#xff0c;其具体收费情况如何&#xff1b; 新操作系统是否支…

亚马逊电子产品日本站PSE认证,TELEC认证如何办理?

日本市场准入认证——PSE认证&#xff0c;TELEC认证 日本作为第三大经济体国家&#xff0c;是中国商品对外出口的最多的国家之一&#xff0c;无论是在日本亚马逊销售还是在日本当地销售&#xff0c;都需要符合日本市场准入许可。需要注意的是日本的电气安全标准都是自主特色的…

2023最新站长必备在线工具箱系统源码优化修复版

2023最新站长必备在线工具箱系统源码 含上百款工具 带后台版本 自适应模板 优化修复版 搭建看了一下,系统一切正常可用,就是后台登录方式使用的是QQ扫码登录的,建议有能力的可以改一改 此工具箱系统源码还是比较成熟的&#xff0c;虽然没有那么花里胡哨&#xff0c;但贵在简洁大…

软件项目管理【第一章:软件项目管理概述/项目启动】

目录 一、软件项目管理概述 1.项目 2.项目管理 3.项目管理框架 3.整个软件项目管理概述 二、项目启动 1.项目类型 2.初始化项目分析 3.生存期模型(常用) 4.项目立项 一、软件项目管理概述 1.项目 项目的定义&#xff1a; 是为了创造一个唯一的产品或提供一个唯一的…

N9030B是德科技信号分析仪

181/2461/8938它能够实现对复杂信号的实时捕获、分析和处理。Keysight N9030B采用了最先进的技术和设计&#xff0c;为工程师和科学家们提供了一系列强大的功能&#xff0c;帮助他们更好地进行信号分析&#xff0c;以满足不断变化的应用需求。 Keysight N9030B采用了全新的硬件…

TensorFlow入门(十二、分布式训练)

1、按照并行方式来分 ①模型并行 假设我们有n张GPU,不同的GPU被输入相同的数据,运行同一个模型的不同部分。 在实际训练过程中,如果遇到模型非常庞大,一张GPU不够存储的情况,可以使用模型并行的分布式训练,把模型的不同部分交给不同的GPU负责。这种方式存在一定的弊端:①这种方…

COM组件IDispatch操作

IDispatch 组件接口&#xff0c;继承IUnkown&#xff0c;实现了反射机制&#xff0c;可以通过invoke调用dll函数 一般执行过程需要GetIDsOfNames、InvokeHelper函数执行&#xff0c;queryinterface查询获取对象 检查GetIDsOfNames返回的dispid是否正确 COleDispatchDriver 单…