Springboot集成RabbitMQ(二)

本文详细介绍了如何在Springboot应用中集成并使用RabbitMQ的四种交换机类型:Direct(默认)、Fanout、Topic和Headers。每种类型的交换机在配置、生产和消费消息方面都有具体的步骤和示例,提供了完整的测试流程。
摘要由CSDN通过智能技术生成

背景:基于Springboot集成RabbitMQ(一)进行

一、Direct exchange(默认)

每个新建队列(queue)都会自动绑定到默认交换机上,绑定的路由键(routingKey)名称与队列名称相同,工作方式类似于单播

1. 交换机和队列配置

package com.zsx.config;

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;

@Configuration
public class DirectRabbitConfig {

    public final static String DIRECT_EXCHANGE = "directExchange";
    public final static String DIRECT_QUEUE1 = "direct.queue1";

    @Bean
    public Queue directQueue1(){
        return new Queue(DIRECT_QUEUE1);
    }

    @Bean
    public DirectExchange directExchange(){
        return new DirectExchange(DIRECT_EXCHANGE);
    }

    @Bean
    public Binding binding(Queue directQueue1, DirectExchange directExchange){
        return BindingBuilder.bind(directQueue1).to(directExchange).with(DIRECT_QUEUE1);
    }
}

2. 消息的生产者

package com.zsx.service;

import com.zsx.config.DirectRabbitConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class DirectSender {

    private final static Logger LOGGER = LoggerFactory.getLogger(DirectSender.class);

    @Autowired
    private AmqpTemplate amqpTemplate;

    public void sendDirect() {
        String msg = "directMsg";
        LOGGER.info("DirectSender.sendDirect send content: " + msg);
        amqpTemplate.convertAndSend(DirectRabbitConfig.DIRECT_QUEUE1, msg);
    }
}

3. 消息的消费者

package com.zsx.service;

import com.zsx.config.DirectRabbitConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
public class DirectReceiver {

    private final static Logger LOGGER = LoggerFactory.getLogger(DirectReceiver.class);

    @RabbitListener(queues = DirectRabbitConfig.DIRECT_QUEUE1)
    public void receiveDirect(String msg) {
        LOGGER.info("DirectReceiver.receiveDirect received content: " + msg);
    }
}

二、Fanout exchange

将消息路由给绑定到它身上的所有队列,而不理会绑定的路由键(routingKey),工作方式类似于广播

1. 交换机和队列配置

package com.zsx.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FanoutRabbitConfig {

    public final static String FANOUT_QUEUE1 = "fanout.Queue1";
    public final static String FANOUT_QUEUE2 = "fanout.Queue2";
    public final static String FANOUT_QUEUE3 = "fanout.Queue3";
    public final static String FANOUT_EXCHANGE = "fanoutExchange";

    @Bean
    public Queue fanoutQueue1() {
        return new Queue(FANOUT_QUEUE1);
    }

    @Bean
    public Queue fanoutQueue2() {
        return new Queue(FANOUT_QUEUE2);
    }

    @Bean
    public Queue fanoutQueue3() {
        return new Queue(FANOUT_QUEUE3);
    }

    @Bean
    public FanoutExchange fanoutExchange() {
        return new FanoutExchange(FANOUT_EXCHANGE);
    }

    @Bean
    public Binding bindingExchange1(Queue fanoutQueue1, FanoutExchange fanoutExchange) {
        return BindingBuilder.bind(fanoutQueue1).to(fanoutExchange);
    }

    @Bean
    public Binding bindingExchange2(Queue fanoutQueue2, FanoutExchange fanoutExchange) {
        return BindingBuilder.bind(fanoutQueue2).to(fanoutExchange);
    }

    @Bean
    public Binding bindingExchange3(Queue fanoutQueue3, FanoutExchange fanoutExchange) {
        return BindingBuilder.bind(fanoutQueue3).to(fanoutExchange);
    }
}

2. 消息的生产者

package com.zsx.service;

import com.zsx.config.FanoutRabbitConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class FanoutSender {

    private final static Logger LOGGER = LoggerFactory.getLogger(FanoutSender.class);
    @Autowired
    private AmqpTemplate amqpTemplate;

    public void sendFanout() {
        String msg = "fanoutMsg";
        LOGGER.info("FanoutSender.sendFanout send content: " + msg);
        amqpTemplate.convertAndSend(FanoutRabbitConfig.FANOUT_EXCHANGE, "", msg);
    }
}

3. 消息的消费者

package com.zsx.service;

import com.zsx.config.FanoutRabbitConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
public class FanoutReceiver {

    private final static Logger LOGGER = LoggerFactory.getLogger(FanoutReceiver.class);

    @RabbitListener(queues = FanoutRabbitConfig.FANOUT_QUEUE1)
    public void receiveFanout1(String msg) {
        LOGGER.info("FanoutReceiver.receiveFanout1 received content: " + msg);
    }

    @RabbitListener(queues = FanoutRabbitConfig.FANOUT_QUEUE2)
    public void receiveFanout2(String msg) {
        LOGGER.info("FanoutReceiver.receiveFanout2 received content: " + msg);
    }

    @RabbitListener(queues = FanoutRabbitConfig.FANOUT_QUEUE3)
    public void receiveFanout3(String msg) {
        LOGGER.info("FanoutReceiver.receiveFanout3 received content: " + msg);
    }

}

三、Topic exchange

通过对消息的路由键(routingKey)和队列到交换机的绑定模式之间的匹配,将消息路由给一个或多个队列​​​​​​​,工作方式类似于多播​​​​​​​

1. 交换机和队列配置

package com.zsx.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 TopicRabbitConfig {

    public final static String TOPIC_EXCHANGE = "topicExchange";
    public final static String TOPIC_QUEUE = "topic.queue";
    public final static String TOPIC_DEV_QUEUE = "topic.dev.queue";
    public final static String TOPIC_QUEUES = "topic.queues";
    public final static String ROUTING_KEY1 = "topic.queue";
    public fina
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值