Spring Boot 搭配 RabbitMQ 使用

导入依赖

 

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

项目结构

编写yml文件

spring:
  rabbitmq:
#    地址
    host: 172.20.10.7
#    服务器端口
    port: 5672
#    账号
    username: guest
#    密码
    password: llh123456
#    SSL
    virtual-host: /

编写配置类

package com.guigu.www.springboot_rabbitmq.config;


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;

@Configuration
public class RabbitMQConfig {

    /*申明队列*/
    @Bean
    public Queue createQueue(){
        /*队列name*/
        return new Queue("topics_springBoot");
    }

    /*申明交换机*/
    @Bean
    public TopicExchange createTopicExchange(){
        /*交换机name*/
        return new TopicExchange("topics_springBoot_exchange");
    }

    /*绑定队列和交换机并加入路由*/
    @Bean
    public Binding binding(){
        /*
        * .bind(队列)
        * .to(交换机)
        * .with(路由键)
        * */
        return BindingBuilder.bind(createQueue()).to(createTopicExchange()).with("operation.#");
    }
}

编写消息接收者

package com.guigu.www.springboot_rabbitmq.consumer;

import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.nio.charset.StandardCharsets;

@Component
public class TopicsConsumer {
    /*此侦听器的队列。 条目可以是“队列名”、“属性-占位符键”或“表达式”。
    表达式必须解析为队列名称或queue对象。
    该队列必须存在,或者在应用程序上下文中被定义为带有org.springframework.amqp.rabbit.core.RabbitAdmin的bean。
    与bindings()和queuesToDeclare()互斥*/
    @RabbitListener(queues = "topics_springBoot")
    public void ConsumerMassges(Message message, Channel channel) throws IOException, InterruptedException {
        //消息打印
        System.out.println(new String(message.getBody(), StandardCharsets.UTF_8));

        //线程延迟(减轻服务器压力)
        Thread.sleep(30);
    }
}

启动SpringBootRabbitmqApplication

测试消息发送者

package com.guigu.www.springboot_rabbitmq;

import org.junit.jupiter.api.Test;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;
import java.nio.charset.StandardCharsets;

@SpringBootTest
class SpringBootRabbitmqApplicationTests {

    @Resource
    private RabbitTemplate rabbitTemplate;

    @Test
    void contextLoads() {
        /*发送消息*/
        rabbitTemplate.convertAndSend("topics_springBoot_exchange","operation.delete","整合成功!!!");
    }

    @Test
    void contextLoads2() {
        /*发送者连接交换机回调*/
        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback(){
            @Override
            public void confirm(CorrelationData correlationData, boolean ack, String cause) {
                System.out.println("发送到交换机是否成功!:【"+ack+"】");
            }
        });
        /*发送消息*/
        rabbitTemplate.convertAndSend("topics_springBoot_exchange2","operation.delete","测试交换机连接!!!");
    }

    @Test
    void contextLoads3(){
        /*交换机连接队列回调*/
        rabbitTemplate.setMandatory(true);
        rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
            @Override
            public void returnedMessage(Message message, int replyCode,
                                        String replyText, String exchange,
                                        String routingKey) {
                System.out.println("路由失败!!!");
                System.out.println("消息:"+new String(message.getBody(), StandardCharsets.UTF_8));
                System.out.println("replyCode:" + replyCode);
                System.out.println("replyText:" + replyText);
                System.out.println("exchange:" + exchange);
                System.out.println("routingKey:" + routingKey);
            }
        });
        /*发送消息*/
        rabbitTemplate.convertAndSend("topics_springBoot_exchange","operation2.delete","测试路由转发!!!");
    }

    @Test
    void contextLoads4() {
        /*测试服务器压力*/
        for (int i = 0; i < 5000; i++) {
            rabbitTemplate.convertAndSend("topics_springBoot_exchange","operation.delete","拉取测试"+i);
        }
    }
}

运行结果:

接收的类是:

org.springframework.amqp.core.Message

接受消息:

(Body:'删除成功!!!' MessageProperties [headers={}, contentType=text/plain, contentEncoding=UTF-8, contentLength=0, receivedDeliveryMode=PERSISTENT, priority=0, redelivered=false, receivedExchange=topics_springBoot_exchange, receivedRoutingKey=operation.delete, deliveryTag=1, consumerTag=amq.ctag-krNfa2dtQnyYFgJLZcmR-g, consumerQueue=topics_springBoot])

附上工程链接,仅供学习参考!!!

springBoot_rabbitmq.zip - 蓝奏云文件大小:94.4 K|https://llh317.lanzout.com/i7Lnfy9aibc

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值