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

springboot+rabbitmq路由模式

路由模式是把队列通过rout绑定到交换机上首先是POMorg.springframework.boot

路由模式是把队列通过rout绑定到交换机上

首先是POM

org.springframework.bootspring-boot-starter-webcom.alibabafastjson1.2.75org.springframework.bootspring-boot-starter-amqp
生产者

配置文件

server:port: 7001
spring:rabbitmq:host: localhostport: 5672username: xxpassword: xxvirtual-host: /

常量类

package com.example.rabbitmq.constant;public class Constant {//队列名称public static final String DIRECT_QUEUE_NAME02 = "testDirectQueue02";//队列名称public static final String DIRECT_QUEUE_NAME = "testDirectQueue";//交换机名称public static final String DIRECT_EXCHANGE_NAME = "testDirectExchange";//交换机绑定routpublic static final String DIRECT_ROUTING = "testDirectRouting";//交换机绑定routpublic static final String DIRECT_ROUTING02 = "testDirectRouting02";
}

rabbitmq配置类

package com.example.rabbitmq.config;import com.example.rabbitmq.constant.Constant;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** rabbitmq配置*/
@Configuration
public class RabbitConfig {// durable:是否持久化,默认是false,持久化队列:会被存储在磁盘上,当消息代理重启时仍然存在,暂存队列:当前连接有效// exclusive:默认也是false,只能被当前创建的连接使用,而且当连接关闭后队列即被删除。此参考优先级高于durable// autoDelete:是否自动删除,当没有生产者或者消费者使用此队列,该队列会自动删除。// return new Queue("TestDirectQueue",true,true,false);//一般设置一下队列的持久化就好,其余两个就是默认false@Beanpublic Queue testDirectQueue() {//第一个队列return new Queue(Constant.DIRECT_QUEUE_NAME, true);}// 路由模式 start// 生产者通过路由方式 把队列绑定到交换机上// 消息对于多个消费者来说 消息只能被消费一次// 生产消息的时候指定交换机和路由,就会发送到绑定的队列上面// 消费者只要消费指定的队列就可以了 不会消费同一个交换机上的其他队列// 也就是说一个交换机可以绑定多个队列//Direct交换机 起名:testDirectExchange@Beanpublic DirectExchange testDirectExchange() {return new DirectExchange(Constant.DIRECT_EXCHANGE_NAME, true, false);}//把第一个队列和交换机绑定@Beanpublic Binding bindingDirect() {return BindingBuilder.bind(testDirectQueue()).to(testDirectExchange()).with(Constant.DIRECT_ROUTING);}// 路由模式 end@Beanpublic Queue testDirectQueue02(){//第二个队列return new Queue(Constant.DIRECT_QUEUE_NAME02,true);}//第二个队列和交换机绑定@Beanpublic Binding bindingDirect02() {return BindingBuilder.bind(testDirectQueue02()).to(testDirectExchange()).with(Constant.DIRECT_ROUTING02);}
}

controller  这里总共调用了10次接口,发现消费者总共消费了10次,因为虽然是同一个交换机  但是绑定的队列不一样,消费者消费的是队列 不是交换机

package com.example.rabbitmq.controller;import com.alibaba.fastjson.JSON;
import com.example.rabbitmq.constant.Constant;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.Map;
import java.util.UUID;@RestController
public class RabbitmqController {&#64;Autowiredprivate RabbitTemplate rabbitTemplate;&#64;RequestMapping("/directMq")public void directMq() {Map map &#61; new HashMap<>();map.put("messageId", UUID.randomUUID());map.put("messageData", "hello testDirect");map.put("createTime", System.currentTimeMillis());//Constant.DIRECT_ROUTING 对应的队列是testDirectQueuerabbitTemplate.convertAndSend(Constant.DIRECT_EXCHANGE_NAME, Constant.DIRECT_ROUTING, JSON.toJSONString(map));//Constant.DIRECT_ROUTING02 对应的队列是testDirectQueue02rabbitTemplate.convertAndSend(Constant.DIRECT_EXCHANGE_NAME, Constant.DIRECT_ROUTING02, JSON.toJSONString(map));//rabbitTemplate.convertAndSend(Constant.DIRECT_QUEUE_NAME,JSON.toJSONString(map));}
}

消费者


配置文件

server:port: 7002
spring:rabbitmq:host: localhostport: 5672username: xxpassword: xxvirtual-host: /listener:simple:acknowledge-mode: manualretry:enabled: trueprefetch: 1

消费者1代码

package com.example.rabbitmq.mq;import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.stereotype.Component;import java.io.IOException;
import java.nio.charset.StandardCharsets;&#64;Component
public class RabbitmqListener {&#64;RabbitListener(queues &#61; "testDirectQueue")public void listener(Message message, &#64;Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag, Channel channel) {String msg &#61; new String(message.getBody(), StandardCharsets.UTF_8);System.out.println("01&#61;&#61;" &#43; msg);try {channel.basicAck(deliveryTag,false);} catch (IOException e) {e.printStackTrace();}}
}

消费者2代码

package com.example.rabbitmq.mq;import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.stereotype.Component;import java.io.IOException;
import java.nio.charset.StandardCharsets;&#64;Component
public class RabbitmqListener {&#64;RabbitListener(queues &#61; "testDirectQueue")public void listener(Message message, &#64;Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag, Channel channel) {String msg &#61; new String(message.getBody(), StandardCharsets.UTF_8);System.out.println("02&#61;&#61;" &#43; msg);try {channel.basicAck(deliveryTag,false);} catch (IOException e) {e.printStackTrace();}}
}

发送10条消息查看消费情况

消费者1

消费者2

这里修改下代码&#xff0c;

        消费者1消费队列testDirectQueue

        消费者2消费队列testDirectQueue02

只修改消费者2的代码即可

package com.example.rabbitmq.mq;import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.stereotype.Component;import java.io.IOException;
import java.nio.charset.StandardCharsets;&#64;Component
public class RabbitmqListener {&#64;RabbitListener(queues &#61; "testDirectQueue02")public void listener(Message message, &#64;Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag, Channel channel) {String msg &#61; new String(message.getBody(), StandardCharsets.UTF_8);System.out.println("02&#61;&#61;" &#43; msg);try {channel.basicAck(deliveryTag,false);} catch (IOException e) {e.printStackTrace();}}
}

再次请求生产者接口10次 发现打印结果是

消费者1

消费者2

再次证明消费者消费的是队列不是交换机


推荐阅读
  • 五、RabbitMQ Java Client基本使用详解
    JavaClient的5.x版本系列需要JDK8,用于编译和运行。在Android上,仅支持Android7.0或更高版本。4.x版本系列支持7.0之前 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • Netty源代码分析服务器端启动ServerBootstrap初始化
    本文主要分析了Netty源代码中服务器端启动的过程,包括ServerBootstrap的初始化和相关参数的设置。通过分析NioEventLoopGroup、NioServerSocketChannel、ChannelOption.SO_BACKLOG等关键组件和选项的作用,深入理解Netty服务器端的启动过程。同时,还介绍了LoggingHandler的作用和使用方法,帮助读者更好地理解Netty源代码。 ... [详细]
  • springboot启动不了_Spring Boot + MyBatis 多模块搭建教程
    作者:枫本非凡来源:www.cnblogs.comorzlinp9717399.html一、前言1、创建父工程最近公司项目准备开始重构,框 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • Postgresql备份和恢复的方法及命令行操作步骤
    本文介绍了使用Postgresql进行备份和恢复的方法及命令行操作步骤。通过使用pg_dump命令进行备份,pg_restore命令进行恢复,并设置-h localhost选项,可以完成数据的备份和恢复操作。此外,本文还提供了参考链接以获取更多详细信息。 ... [详细]
author-avatar
kuqu00
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有