热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Spring集成RabbitMq

Spring集成RabbitMq一、基本配置1、pom添加以下jarcom.fasterxml.jackson.core

Spring 集成RabbitMq 

一、基本配置

1、pom添加以下jar

     com.fasterxml.jackson.corejackson-databind2.7.5org.springframework.amqpspring-rabbit2.1.7.RELEASE

2、spring配置文件springContext.xml添加以下配置


xmlns:xsi&#61;"http://www.w3.org/2001/XMLSchema-instance" xmlns:tx&#61;"http://www.springframework.org/schema/tx"xmlns:task&#61;"http://www.springframework.org/schema/task" xmlns:context&#61;"http://www.springframework.org/schema/context"xmlns:aop&#61;"http://www.springframework.org/schema/aop"xsi:schemaLocation&#61;"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd">package&#61;"com.pinghengxing..*"><import resource&#61;"classpath*:com/config/rabbitmq_producer.xml" /><import resource&#61;"classpath*:com/config/rabbitmq_consumer.xml" />

 

3、rabbitmq_producer.xml生产者配置如下&#xff08;其中配置了exchange的三种类型&#xff1a;fanout&#xff0c;direct&#xff0c;topic&#xff09;

 


xmlns:xsi&#61;"http://www.w3.org/2001/XMLSchema-instance" xmlns:context&#61;"http://www.springframework.org/schema/context"xmlns:rabbit&#61;"http://www.springframework.org/schema/rabbit"xsi:schemaLocation&#61;"http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.3.xsdhttp://www.springframework.org/schema/rabbithttp://www.springframework.org/schema/rabbit/spring-rabbit.xsd">host&#61;"140.143.xx.xx" username&#61;"ww" password&#61;"ww" port&#61;"5672"virtual-host&#61;"ww" channel-cache-size&#61;"25" cache-mode&#61;"CHANNEL"publisher-confirms&#61;"true" publisher-returns&#61;"true" connection-timeout&#61;"200" />class&#61;"org.springframework.retry.support.RetryTemplate">class&#61;"org.springframework.retry.backoff.ExponentialBackOffPolicy">class&#61;"org.springframework.retry.policy.SimpleRetryPolicy"> message-converter&#61;"jsonMessageConverter" confirm-callback&#61;"confirmCallback" return-callback&#61;"returnCallback" mandatory&#61;"true" />

class&#61;"org.springframework.amqp.support.converter.Jackson2JsonMessageConverter">

 

3、rabbitmq_consumer.xml消费者配置如下&#xff1a;&#xff08;其中定义了三种exchange类型对应队列的消费者 &#xff0c;&#xff09;


xmlns:xsi&#61;"http://www.w3.org/2001/XMLSchema-instance" xmlns:context&#61;"http://www.springframework.org/schema/context"xmlns:rabbit&#61;"http://www.springframework.org/schema/rabbit"xsi:schemaLocation&#61;"http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.3.xsdhttp://www.springframework.org/schema/rabbithttp://www.springframework.org/schema/rabbit/spring-rabbit.xsd">host&#61;"140.143.xx.xx" username&#61;"ww" password&#61;"ww" port&#61;"5672"virtual-host&#61;"ww" channel-cache-size&#61;"25" cache-mode&#61;"CHANNEL"connection-timeout&#61;"200" />prefetch&#61;"1" concurrency&#61;"1" >




二、编写测试代码&#xff08;在此只进行Direct类型 交换机测试代码的表写&#xff0c;其他类型仿照此示例即可&#xff09;

1、定义消息生产者&#xff08;DirectProducer&#xff09;

package com.pinghengxing.direct;import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/** * &#64;author ww*/public class DirectProducer {private static ApplicationContext ac;public static void sendMessage(String exchange,String routingKey,Object message){ac &#61; new ClassPathXmlApplicationContext("classpath:com/config/springContext.xml");RabbitTemplate rt &#61; ac.getBean(RabbitTemplate.class);for(int i&#61;0;i<10;i&#43;&#43;){rt.convertAndSend(exchange, routingKey, message&#43;""&#43;i);}}public static void main(String[] args) {DirectProducer.sendMessage("myDirectExchange","direct","路由模式");}}

2、定义消息消费者&#xff08;DirectReceiver1&#xff0c;DirectReceiver1  &#xff09;-多个消费者

消费者1

package com.pinghengxing.direct;import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;
import org.springframework.stereotype.Component;import com.rabbitmq.client.Channel;
&#64;Component(
"directReceiver")
public class DirectReceiver implements ChannelAwareMessageListener{&#64;Overridepublic void onMessage(Message message, Channel channel) throws Exception {System.out.println("************************direct111********************************");System.out.println("路由模式direct111 接收信息&#xff1a;"&#43;new String(message.getBody()));System.out.println("********************************************************");//设置手工应答
// if(true){
// throw new Exception();
// }channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);}}

消费者2

package com.pinghengxing.direct;import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;
import org.springframework.stereotype.Component;import com.rabbitmq.client.Channel;
&#64;Component(
"directReceiver2")
public class DirectReceiver2 implements ChannelAwareMessageListener{&#64;Overridepublic void onMessage(Message message, Channel channel) throws Exception {System.out.println("************************direct222********************************");System.out.println("路由模式direct222 接收信息&#xff1a;"&#43;new String(message.getBody()));System.out.println("********************************************************");//设置手工应答
// if(true){
// throw new Exception();
// }channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);}}

 

三、测试

1、进行测试&#xff0c;结果如下&#xff1a;&#xff08;两个消费者都可以从队列中取到数据&#xff0c;且数据不重复&#xff09;

 

四、confirm-callback监听&#xff08;用于监听exchange是否接收成功&#xff09;

1、在配置工厂连接的时候&#xff0c;设置publisher-confirms&#61;"true"

host&#61;"140.143.xx.xx" username&#61;"ww" password&#61;"ww" port&#61;"5672"virtual-host&#61;"ww" channel-cache-size&#61;"25" cache-mode&#61;"CHANNEL"publisher-confirms&#61;"true" publisher-returns&#61;"true" connection-timeout&#61;"200" />

2、在定义rabbitmq模板时&#xff0c;指定confirm-callback的实现类

message-converter&#61;"jsonMessageConverter" confirm-callback&#61;"confirmCallback" return-callback&#61;"returnCallback" mandatory&#61;"true" />

3、创建实现类ConfirmCallback&#xff0c;实现RabbitTemplate.ConfirmCallback接口

 

package com.pinghengxing.callback;import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;/*** confirm-callback监听&#xff08;用于监听exchange是否接收成功&#xff09;* &#64;author ww**/
&#64;Component(
"confirmCallback")
public class ConfirmCallBack implements RabbitTemplate.ConfirmCallback{/*** CorrelationData 是在发送消息时传入回调方法的参数&#xff0c;可以用于区分消息对象。 CorrelationData对象中只有一个属性 String id。* 通过这个参数&#xff0c;我们可以区分当前是发送哪一条消息时的回调&#xff0c;并通过ack参数来进行失败重发功能* &#64;param correlationData 回调的相关数据.* &#64;param ack true for ack, false for nack* &#64;param cause 专门给NACK准备的一个可选的原因&#xff0c;其他情况为null。*/public void confirm(CorrelationData correlationData, boolean ack,String cause) {System.out.println("********************************************************");System.out.println("exChange确认" &#43; ack &#43; "   " &#43; cause);System.out.println("********************************************************");}}

4、测试

五、returnCallback监听&#xff08;basicpublish推送消息到queue失败时回调&#xff09;

1、在配置工厂连接的时候&#xff0c;设置publisher-returns&#61;"true"

host&#61;"140.143.xx.xx" username&#61;"ww" password&#61;"ww" port&#61;"5672"
virtual-host&#61;"ww" channel-cache-size&#61;"25" cache-mode&#61;"CHANNEL"
publisher-confirms&#61;"true" publisher-returns&#61;"true" connection-timeout&#61;"200" />

2、在定义rabbitmq模板时&#xff0c;指定return-callback的实现类&#xff0c;并且设置mandatory&#61;"true"

message-converter&#61;"jsonMessageConverter" confirm-callback&#61;"confirmCallback" return-callback&#61;"returnCallback" mandatory&#61;"true" />

3、创建实现类ReturnCallBack&#xff0c;实现RabbitTemplate.ReturnCallback接口

package com.pinghengxing.callback;import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;/*** 推送消息到queue失败时回调* &#64;author ww**/
&#64;Component(
"returnCallback")
public class ReturnCallBack implements RabbitTemplate.ReturnCallback {&#64;Overridepublic void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {System.out.println("********************************************************");System.out.println("失败确认:"&#43;message&#43;" | "&#43;replyCode&#43;" | "&#43;replyText&#43;" | "&#43;exchange&#43;" | "&#43;routingKey);System.out.println("********************************************************");}}

 4、测试&#xff08;更改routing_key的值为direct123&#xff0c;由于找不到对应的队列&#xff0c;报以下错误&#xff09;

六、json转换&#xff08;可以将map等自动转换成json格式&#xff09;

1、pom.xml添加以下maven依赖

     com.fasterxml.jackson.corejackson-databind2.7.5

 2、定义消息转换器&#xff0c;转成json格式

class&#61;"org.springframework.amqp.support.converter.Jackson2JsonMessageConverter">

 

3、在定义rabbitmq模板时&#xff0c;指定转换器message-converter&#61;"jsonMessageConverter"

message-converter&#61;"jsonMessageConverter" confirm-callback&#61;"confirmCallback" return-callback&#61;"returnCallback" mandatory&#61;"true" />

 

 4、测试&#xff0c;创建map&#xff0c;进行生产&#xff0c;消费者接收到的信息如下&#xff1a;为json格式

 

友情链接&#xff1a;

完整的项目配置下载地址如下&#xff1a;可下载参考

https://files.cnblogs.com/files/pinghengxing/spring_rabbitmq_test.zip

 

转:https://www.cnblogs.com/pinghengxing/p/11210295.html



推荐阅读
  • 在Java应用程序中调用`response.getStatus()`方法时遇到了`NoSuchMethodError`异常,经过分析,初步判断为依赖冲突问题。通过检查项目依赖树发现,当前项目版本与某些库的版本不兼容,导致该方法无法被正确识别。建议通过更新相关依赖版本或使用依赖管理工具(如Maven或Gradle)来解决此问题,确保所有依赖项版本一致且兼容。 ... [详细]
  • 如何构建基于Spring MVC框架的Java Web应用项目
    在构建基于Spring MVC框架的Java Web应用项目时,首先应创建一个新的动态Web项目。接着,需将必要的JAR包导入至WebContent/WEB-INF/lib目录下,确保包括Spring核心库及相关依赖。如遇缺失的JAR包,可向社区求助或通过Maven等工具自动下载。正确配置后,即可开始搭建应用结构与功能模块。 ... [详细]
  • 深入解析Spring Boot自动配置机制及其核心原理
    Spring Boot 的自动配置机制是其核心特性之一,旨在简化开发过程并提高效率。本文将深入探讨这一机制的工作原理,解释其如何通过智能化的类路径扫描和条件注解实现自动装配。通过对 Spring Boot 自动配置的详细解析,读者将能够更好地理解和应用这一强大功能,从而在实际项目中更加高效地利用 Spring Boot。 ... [详细]
  • 在Spring框架中,基于Schema的异常通知与环绕通知的实现方法具有重要的实践价值。首先,对于异常通知,需要创建一个实现ThrowsAdvice接口的通知类。尽管ThrowsAdvice接口本身不包含任何方法,但开发者需自定义方法来处理异常情况。此外,环绕通知则通过实现MethodInterceptor接口来实现,允许在方法调用前后执行特定逻辑,从而增强功能或进行必要的控制。这两种通知机制的结合使用,能够有效提升应用程序的健壮性和灵活性。 ... [详细]
  • 在Maven中高效管理多模块项目的依赖关系是一项重要的技能。通过合理配置父POM文件,可以统一管理和控制各子模块的依赖版本,避免重复导入和版本冲突。本文将探讨如何利用Maven的最佳实践,确保项目依赖的一致性和可维护性,同时提高开发效率。 ... [详细]
  • Spring Boot 实战(一):基础的CRUD操作详解
    在《Spring Boot 实战(一)》中,详细介绍了基础的CRUD操作,涵盖创建、读取、更新和删除等核心功能,适合初学者快速掌握Spring Boot框架的应用开发技巧。 ... [详细]
  • Android 图像色彩处理技术详解
    本文详细探讨了 Android 平台上的图像色彩处理技术,重点介绍了如何通过模仿美图秀秀的交互方式,利用 SeekBar 实现对图片颜色的精细调整。文章展示了具体的布局设计和代码实现,帮助开发者更好地理解和应用图像处理技术。 ... [详细]
  • Spring框架入门指南:专为新手打造的详细学习笔记
    Spring框架是Java Web开发中广泛应用的轻量级应用框架,以其卓越的功能和出色的性能赢得了广大开发者的青睐。本文为初学者提供了详尽的学习指南,涵盖基础概念、核心组件及实际应用案例,帮助新手快速掌握Spring框架的核心技术与实践技巧。 ... [详细]
  • 深入解析Tomcat:开发者的实用指南
    深入解析Tomcat:开发者的实用指南 ... [详细]
  • 如何在Java中高效构建WebService
    本文介绍了如何利用XFire框架在Java中高效构建WebService。XFire是一个轻量级、高性能的Java SOAP框架,能够简化WebService的开发流程。通过结合MyEclipse集成开发环境,开发者可以更便捷地进行项目配置和代码编写,从而提高开发效率。此外,文章还详细探讨了XFire的关键特性和最佳实践,为读者提供了实用的参考。 ... [详细]
  • Spring注解开发指南:@Resource与@Component详解 ... [详细]
  • APKAnalyzer(1):命令行操作体验与功能解析
    在对apkChecker进行深入研究后,自然而然地关注到了Android Studio中的APK分析功能。将APK文件导入IDE中,系统会自动解析并展示其中各类文件的详细信息。官方文档提供了详细的命令行工具使用指南,帮助开发者快速上手。本文以一个RecyclerView的Adapter代理开源库为例,探讨了如何利用这些工具进行高效的APK分析。 ... [详细]
  • 深入解析Spring Boot源码的序章
    本系列文章旨在深入解析Spring Boot的源代码,分享笔者在学习过程中的心得与体会。内容涵盖核心源码分析,可能会对初学者造成一定理解难度,建议读者结合笔者提供的详细注释进行阅读,以获得更好的学习体验。 ... [详细]
  • 在Linux环境下编译安装Heartbeat时,常遇到依赖库缺失的问题。为确保顺利安装,建议预先通过yum安装必要的开发库,如glib2-devel、libtool-ltdl-devel、net-snmp-devel、bzip2-devel和ncurses-devel等。这些库是编译过程中不可或缺的组件,能够有效避免编译错误,确保Heartbeat的稳定运行。 ... [详细]
  • 如何在Android应用中设计和实现专业的启动欢迎界面(Splash Screen)
    在Android应用开发中,设计与实现一个专业的启动欢迎界面(Splash Screen)至关重要。尽管Android设计指南对使用Splash Screen的态度存在争议,但一个精心设计的启动界面不仅能提升用户体验,还能增强品牌识别度。本文将探讨如何在遵循最佳实践的同时,通过技术手段实现既美观又高效的启动欢迎界面,包括加载动画、过渡效果以及性能优化等方面。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有