下载安装Erlang和RabbitMQ

Erlang和RabbitMQ:https://www.cnblogs.com/theRhyme/p/10069611.html

AMQP协议详解与RABBITMQ,MQ消息队列的应用场景,如何避免消息丢失

https://www.cnblogs.com/theRhyme/p/9578675.html

项目创建和依赖

推荐SpringCloud项目在线创建:https://start.spring.io/

不用上面这个也行,下面有代码和依赖;

gradle的依赖,和maven差不多:

buildscript {
ext {
springBootVersion = '2.1.1.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
} apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management' group = 'xy.study'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8 repositories {
mavenCentral()
} dependencies {
implementation('org.springframework.boot:spring-boot-starter-amqp')
implementation('org.projectlombok:lombok:1.16.+')
runtimeOnly('org.springframework.boot:spring-boot-devtools')
testImplementation('org.springframework.boot:spring-boot-starter-test')
}

代码

配置文件application.properties

spring.application.name=spring-boot-rabbitmq

spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest server.port = 5678

RabbitMQ配置文件类(注释的代码可以直接删掉):

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; /**
* topic 是RabbitMQ中最灵活的一种方式,可以根据routing_key自由的绑定不同的队列
* 首先对topic规则配置
*/
//@Configuration
public class TopicRabbitConfig { final public static String QUEUE_NAME = "queue.name";
final public static String TEST_TOPIC_ROUTINGKEY = "test.topic.routingKey";
final public static String TEST_EXCHANGE_HAHA = "test.exchange.haha"; /**
* 设置交换器的名称
* @return
*//*
@Bean
TopicExchange exchange() {
return new TopicExchange(TopicRabbitConfig.TEST_EXCHANGE_HAHA);
} *//**
* 队列名称
* @return
*//*
@Bean
public Queue queueMessage() {
return new Queue(TopicRabbitConfig.QUEUE_NAME);
} *//**
* 将指定routing key的名称绑定交换器的队列
* @param queueMessage
* @param exchange
* @return
*//*
@Bean
Binding bindingExchangeMessage(Queue queueMessage, TopicExchange exchange) {
return BindingBuilder.bind(queueMessage).to(exchange).with(TopicRabbitConfig.TEST_TOPIC_ROUTINGKEY);
}*/ /**
* 匹配以topic开头的路由键routing key
* 交换机绑定多个队列
*/ /*@Bean
Binding bindingExchangeMessages(Queue queueMessages, TopicExchange exchange) {
return BindingBuilder.bind(queueMessages).to(exchange).with("topic.#");
}*/
}

生产者,这里根据Exchange和Routing Key,直接发送一个字符串:

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import xy.study.rabbitmq.conf.TopicRabbitConfig; @Component
@Slf4j
public class HelloSender { @Autowired
private RabbitTemplate rabbitTemplate; /**
* 通过exchange和routingKey的方式
* rabbitTemplate.convertAndSend(String exchange, String routingKey, Object object)
* @param i
*/
public void send(int i) {
String context = "hello " + i;
log.info("Sender : {}", context);
this.rabbitTemplate.convertAndSend(TopicRabbitConfig.TEST_EXCHANGE_HAHA,TopicRabbitConfig.TEST_TOPIC_ROUTINGKEY, context);
}
}

消费者,绑定对应的Exchange,Queue和Routing Key,直接打印获取的信息:

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Component;
import xy.study.rabbitmq.conf.TopicRabbitConfig; @Component
@Slf4j
public class HelloReceiver {
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = TopicRabbitConfig.QUEUE_NAME, durable = "true"),
exchange = @Exchange(value = TopicRabbitConfig.TEST_EXCHANGE_HAHA, type = ExchangeTypes.TOPIC),
key = TopicRabbitConfig.TEST_TOPIC_ROUTINGKEY)
)
public void onOrgDeleted(@Payload String msg) {
log.info("HelloReceiver msg : {}",msg);
}
}

测试类,调用生产者发送信息的函数send,消费者会监听消费:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import xy.study.rabbitmq.producer.HelloSender; @RunWith(SpringRunner.class)
@SpringBootTest
public class RabbitmqApplicationTests { @Autowired
private HelloSender sender; @Test
public void testSend() {
sender.send(666);
} }

如图,控制台日志,能生成消息,并且能被对应的消费者消费。

topic exchange 通配路由中多个消费者的情况

修改消费者的代码如下:

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Component;
import xy.study.rabbitmq.conf.TopicRabbitConfig; @Component
@Slf4j
public class HelloReceiver { /**
* 下面四个消费者,exchange和RoutingKey都相同,最后两个消费者队列名都相同
* @param msg
*/
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = TopicRabbitConfig.QUEUE_NAME, durable = "true"),
exchange = @Exchange(value = TopicRabbitConfig.TEST_EXCHANGE_HAHA, type = ExchangeTypes.TOPIC),
key = TopicRabbitConfig.TEST_TOPIC_ROUTINGKEY)
)
public void queueName(@Payload String msg) {
log.info("{}-----HelloReceiver msg : {}",TopicRabbitConfig.QUEUE_NAME,msg);
} @RabbitListener(bindings = @QueueBinding(
value = @Queue(value = TopicRabbitConfig.QUEUE_NAME+".test", durable = "true"),
exchange = @Exchange(value = TopicRabbitConfig.TEST_EXCHANGE_HAHA, type = ExchangeTypes.TOPIC),
key = TopicRabbitConfig.TEST_TOPIC_ROUTINGKEY)
)
public void queueNameTest(@Payload String msg) {
log.info("{}-----HelloReceiver msg : {}",TopicRabbitConfig.QUEUE_NAME+".test",msg);
} /**
* 这里我的消费者队列名"123445",是乱写的,也能够接受
* @param msg
*/
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = 123445+"", durable = "true"),
exchange = @Exchange(value = TopicRabbitConfig.TEST_EXCHANGE_HAHA, type = ExchangeTypes.TOPIC),
key = TopicRabbitConfig.TEST_TOPIC_ROUTINGKEY)
)
public void queueNameNumber(@Payload String msg) {
log.info("{}-----HelloReceiver msg : {}",123445+""+".test",msg);
} /**
* 由于这个和上面的Exchange、RoutingKey、queue完全相同,所以这两个消费者,一条消息,只有一个能消费(随机)
* @param msg
*/
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = 123445+"", durable = "true"),
exchange = @Exchange(value = TopicRabbitConfig.TEST_EXCHANGE_HAHA, type = ExchangeTypes.TOPIC),
key = TopicRabbitConfig.TEST_TOPIC_ROUTINGKEY)
)
public void queueNameNumberSame(@Payload String msg) {
log.info("same+{}-----HelloReceiver msg : {}",123445+""+".test",msg);
}
}

再次执行测试,测试结果如下:

上面四个消费者代码,Exchange和RoutingKey都相同,最后两个消费者队列名都相同。

根据结果可知,当Exchange和RoutingKey相同、queue不同时,所有消费者都能消费同样的信息;

当Exchange和RoutingKey、queue都相同时(最后两个消费者),消费者中只有一个能消费信息,其他消费者都不能消费该信息。

SpringBoot整合RabbitMQ,实现消息发送和消费以及多个消费者的情况的更多相关文章

  1. SpringBoot 整合 RabbitMQ 实现消息可靠传输

    消息的可靠传输是面试必问的问题之一,保证消息的可靠传输主要在生产端开启 comfirm 模式,RabbitMQ 开启持久化,消费端关闭自动 ack 模式. 环境配置 SpringBoot 整合 Rab ...

  2. springboot整合rabbitmq,支持消息确认机制

    安装 推荐一篇博客https://blog.csdn.net/zhuzhezhuzhe1/article/details/80464291 项目结构 POM.XML <?xml version= ...

  3. springboot整合rabbitMq实现消息延时发送

    实现思路:利用mq的ttl设置消息失效时间 当达到设置时间后通过交换机到达死信队列中,消费者端绑定读取死信队列中信息来达到延时发送消息的功能. demo 如下: (1)在pom.xml 中引入rabb ...

  4. SpringBoot整合Rabbitmq设置消息请求头

    String str = "{\"origin\":\"BBC\",\"origin_coupon_id\":51,\" ...

  5. SpringBoot系列八:SpringBoot整合消息服务(SpringBoot 整合 ActiveMQ、SpringBoot 整合 RabbitMQ、SpringBoot 整合 Kafka)

    声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:SpringBoot 整合消息服务 2.具体内容 对于异步消息组件在实际的应用之中会有两类: · JMS:代表作就是 ...

  6. springboot整合rabbitmq实现生产者消息确认、死信交换器、未路由到队列的消息

    在上篇文章  springboot 整合 rabbitmq 中,我们实现了springboot 和rabbitmq的简单整合,这篇文章主要是对上篇文章功能的增强,主要完成如下功能. 需求: 生产者在启 ...

  7. springboot学习笔记-6 springboot整合RabbitMQ

    一 RabbitMQ的介绍 RabbitMQ是消息中间件的一种,消息中间件即分布式系统中完成消息的发送和接收的基础软件.这些软件有很多,包括ActiveMQ(apache公司的),RocketMQ(阿 ...

  8. 一篇学习完rabbitmq基础知识,springboot整合rabbitmq

    一   rabbitmq 介绍 MQ全称为Message Queue,即消息队列, RabbitMQ是由erlang语言开发,基于AMQP(Advanced MessageQueue 高级消息队列协议 ...

  9. 【MQ中间件】RabbitMQ -- SpringBoot整合RabbitMQ(3)

    1.前言说明 前面一篇博客中提到了使用原生java代码进行测试RabbitMQ实现多种交换机类型的队列场景.但是在项目中我们一般使用SpringBoot项目,而且RabbitMQ天生对于Spring的 ...

随机推荐

  1. solr 忽略大小写

    1.types标签下加入如下fieldType <fieldType name="str_lower" class="solr.TextField" so ...

  2. Ansible:遇到错误 "sudo: /etc/sudoers is world writable\r\nsudo: no valid sudoers sources found, quitting

    执行ansible-playbook时,遇到该错误: 经过检查发现是因为在Linux中 /etc/sudoers该文件必须是只读权限的才行,故我们需要修改其权限为440,到root账户下修改,直接ch ...

  3. Geany 编辑器打开 高亮所选单词 功能

    Geany 编辑器打开 高亮所选单词 功能 在Ubuntu 系统的Software Center 工具中,搜索到geany, 下方有个 Miscellanous Plugins for Geany, ...

  4. 高级php面试题转载

    在网上看到一些高级php 的面试题目.. 最近接连面试了几家公司,有些重要问题记录一下,督促自己学习提高,同时希望给朋友们一些帮助.内容很多,一点点完善,一步步学习..有些是面试被问,有些是招聘要求, ...

  5. Maven传递依赖的范围

    calsspath:仅加载本工程中的配置文件 classpath*:既要加载本工程中配置文件,也要加载jar包中的配置文件

  6. apache 重点难点

    apache 重点难点 在于难以理解其工作原理,因为它是c 写的:其模块众多:功能强大而复杂. 其配置也是格式不齐, 比如一下子是 key value , 一下子就成了 xml. 转载: http:/ ...

  7. hdfs 如何实现退役节点快速下线(也就是退役节点上的数据块快速迁移)speed up decommission blocks removal

    以下是选择复制源节点的代码 代码总结: A=datanode上要复制block的Queue size与 target datanode没被选出之前待处理复制工作数之和. 1. 优先选择退役中的节点,因 ...

  8. <记录> PHP Redis操作类

    namespace common\controller; class Redis { public $redisObj = null; //redis实例化时静态变量 static protected ...

  9. <基础> PHP 进阶之 类(Class)

    属性 类的变量成员叫做“属性”,或者叫“字段”.“特征”,在本文档统一称为“属性”.属性声明是由关键字 public,protected 或者 private 开头,然后跟一个普通的变量声明来组成.属 ...

  10. python 机器学习实践入门

    机器学习概念概念 机器 学习是计算机科学的一个分支,从模式识别.人工智能和计算学习理论发展而来,我们可以将其作为数据挖掘的工具 侧重用于数据分析方法理解给定的数据 目的是:开发能够从先前观测的数据,通 ...