热门标签 | 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

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


推荐阅读
  • 本文探讨了如何通过一系列技术手段提升Spring Boot项目的并发处理能力,解决生产环境中因慢请求导致的系统性能下降问题。 ... [详细]
  • 本文探讨了 Spring Boot 应用程序在不同配置下支持的最大并发连接数,重点分析了内置服务器(如 Tomcat、Jetty 和 Undertow)的默认设置及其对性能的影响。 ... [详细]
  • 华为USG基于源地址的多出口策略路由配置
    网络拓扑如下:组网情况:企业用户主要有技术部(VLAN10)和行政部(VLAN20),通过汇聚交换机连接到USG。企业分别通过两个不同运营商(ISP1和ISP2)连接到 ... [详细]
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • 深入理解Java多线程并发处理:基础与实践
    本文探讨了Java中的多线程并发处理机制,从基本概念到实际应用,帮助读者全面理解并掌握多线程编程技巧。通过实例解析和理论阐述,确保初学者也能轻松入门。 ... [详细]
  • 利用RabbitMQ实现高效延迟任务处理
    本文详细探讨了如何利用RabbitMQ实现延迟任务,包括其应用场景、实现原理、系统设计以及具体的Spring Boot实现方式。 ... [详细]
  • 一、搭建项目创建Maven项目导入rabbitmq包com.rabbitmqamqp-clien ... [详细]
  • 微软Exchange服务器遭遇2022年版“千年虫”漏洞
    微软Exchange服务器在新年伊始遭遇了一个类似于‘千年虫’的日期处理漏洞,导致邮件传输受阻。该问题主要影响配置了FIP-FS恶意软件引擎的Exchange 2016和2019版本。 ... [详细]
  • 利用GitHub热门资源,成功斩获阿里、京东、腾讯三巨头Offer
    Spring框架作为Java生态系统中的重要组成部分,因其强大的功能和灵活的扩展性,被广泛应用于各种规模的企业级应用开发中。本文将通过一份在GitHub上获得极高评价的Spring全家桶文档,探讨如何掌握Spring框架及其相关技术,助力职业发展。 ... [详细]
  • 历经两个月,他成功斩获阿里巴巴Offer
    经过两个月的努力,一位普通的双非本科毕业生最终成功获得了阿里巴巴的录用通知。 ... [详细]
  • 本文介绍了如何在三台CentOS 7.5虚拟机上通过Docker部署RabbitMQ集群,包括环境准备、容器创建、集群配置及故障处理等内容。 ... [详细]
  • Linux双网卡绑定技术详解与实践
    本文详细介绍了如何在Linux系统中实现双网卡绑定,即将两块物理网卡合并为一个逻辑网卡,以提高网络性能和可靠性。文中不仅涵盖了基本的概念,还提供了具体的配置步骤和测试方法。 ... [详细]
  • RabbitMQ 核心组件解析
    本文详细介绍了RabbitMQ的核心概念,包括其基本原理、应用场景及关键组件,如消息、生产者、消费者、信道、交换机、路由键和虚拟主机等。 ... [详细]
  • 从理想主义者的内心深处萌发的技术信仰,推动了云原生技术在全球范围内的快速发展。本文将带你深入了解阿里巴巴在开源领域的贡献与成就。 ... [详细]
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社区 版权所有