RabbitMQ 四种模式 简易测试

本文介绍了RabbitMQ的三种模式:Topic、Header和fanout。在Topic模式中,生产者使用topic交换机,消费者通过Ribbon轮询机制消费信息。Header模式允许Map条件判断,适用于信息字节传输。而在fanout模式下,生产者无需指定key,消息会广播到所有绑定的队列,消费者配置相应端口接收。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Connection 连接TCP/IP 一个应用一般只会 RabbitMQ 连接一个
Channel 寄生在 Connection 和 Exchange 消息队列相关

一个Channel对应着一个消息队列
Connection一般只有一个

多个消费者,消费同一个消息队列
非常有规律的轮流消费生产者发布的信息(Ribbon轮询机制)

多个消费者,同时消费一个 Rounting key ,但队列
不同

多个消费者都可以获取到消息,不会产生轮询
生产者只要生产一次,可以通过相同的 Rounting key,不同消息队列名称都可以消费这条消息
在这里插入图片描述

1、Topic

在这里插入图片描述
在这里插入图片描述
Producer 生产者:
——config:
注册 topic 交换机

@Configuration
public class TopicConfig {

    @Bean
    TopicExchange topicExchange() {
        return new TopicExchange("topic-exchange");
    }
}

——controller:

@RestController
@RequestMapping("/topic")
public class TopicController {

    @Autowired
    RabbitTemplate rabbitTemplate;

    @RequestMapping("/gc/lang")
    public String sendgclang(String msg) {
        rabbitTemplate.convertAndSend("topic-exchange","gc.lang",msg);
        return "/gc.lang 发送" + msg;
    }

    @RequestMapping("/gc/lang/java")
    public String sendLangJava(String msg) {
        rabbitTemplate.convertAndSend("topic-exchange","gc.lang.java",msg);
        return "/gc/lang/java 发送" + msg;
    }

    @RequestMapping("/gc/lang/sql")
    public String sendLangsql(String msg) {
        rabbitTemplate.convertAndSend("topic-exchange","gc.lang.sql",msg);
        return "/gc/lang/sql 发送" + msg;
    }

    @RequestMapping("/gc/lang/http")
    public String sendLanghttp(String msg) {
        rabbitTemplate.convertAndSend("topic-exchange","gc.lang.http",msg);
        return "/gc/lang/http 发送" + msg;
    }

    @RequestMapping("/gc/db/socket")
    public String senddbsocket(String msg) {
        rabbitTemplate.convertAndSend("topic-exchange","gc.db.socket",msg);
        return "/gc/db/socket 发送" + msg;
    }

    @RequestMapping("/gc/db/db")
    public String senddbdb(String msg) {
        rabbitTemplate.convertAndSend("topic-exchange","gc.db.db",msg);
        return "/gc/db/db 发送" + msg;
    }
}

consumer 消费者:
——config:

@Configuration
public class TopicConfig {

    @Bean
    TopicExchange topicExchange() {
        return new TopicExchange("topic-exchange");
    }

    @Bean
    Queue langQueue() {
        return new Queue("gclang");
    }

    @Bean
    Queue dbQueue() {
        return new Queue("gcdb");
    }

    @Bean
    Queue gcQueue() {
        return new Queue("gc");
    }

    @Bean
    Binding langBind() {
        Binding binding = BindingBuilder.bind(langQueue())
                .to(topicExchange())
                .with("gc.lang.#");
        return binding;
    }

    @Bean
    Binding dbBind() {
        Binding binding = BindingBuilder.bind(dbQueue())
                .to(topicExchange())
                .with("gc.db.#");
        return binding;
    }

    @Bean
    Binding gcBind() {
        Binding binding = BindingBuilder.bind(gcQueue())
                .to(topicExchange())
                .with("gc.#");
        return binding;
    }

}

输出结果:

//消费方收到消息做业务处理,检测敏感字符
@Service
public class Topicservices {

    @Autowired(required = false)
    private StudentDao studentDao;

    //Queue helloQ() {
    //        return new Queue("helloQ");
    //    }
    @RabbitListener(queues = "gclang")
    public void dolang(String msg) {
        System.out.println(new Date() + "gc-lang" + msg);
    }

    @RabbitListener(queues = "gcdb")
    public void dodb(String msg) {
        System.out.println(new Date() + "gc-db" + msg);
    }

    /**
     @RabbitListener(queues = "gc")
     public void dogc(String msg) {
     System.out.println(new Date() + "gc" + msg);
     }
     **/
}

2、Header(Map条件判断,信息字节传输)

生产者:
config

@Configuration
public class headerConfig {

    @Bean
    public HeadersExchange headersExchange() {
        return new HeadersExchange("header-exchange");
    }
}

controller:

@RestController
@RequestMapping("/head")
public class HeaderController {

    @Autowired
    RabbitTemplate rabbitTemplate;

    @RequestMapping("/send")
    public String send(Integer id,String token,String msg) {
        System.out.println("id:" + id);
        System.out.println("token:" + token);
        System.out.println("msg:" + msg);
        MessageProperties mp = new MessageProperties();
        if (id != null) {
            mp.setHeader("id",id);
        }
        if (token != null) {
            mp.setHeader("token",token);
        }
        Message message = new Message(msg.getBytes(),mp);
        rabbitTemplate.convertAndSend("header-exchange",null,message);
        return "header send ==>id:" + id + "、token:" + token + "、msg:" + msg;
    }
}

消费者:
config
(any、all、exist、match)

@Configuration
public class headerConfig {

    @Bean
    public HeadersExchange headersExchange() {
        return new HeadersExchange("header-exchange");
    }

    @Bean
    Queue queue1() {
        return new Queue("q1");
    }

    @Bean
    Queue queue2() {
        return new Queue("q2");
    }

    @Bean
    Queue queue3() {
        return new Queue("q3");
    }

    @Bean
    Queue queue4() {
        return new Queue("q4");
    }

    @Bean
    Binding binding1() {    //全部存在 key
        Binding b = BindingBuilder.bind(queue1())
                .to(headersExchange()).whereAll("id","token").exist();
        return b;
    }

    @Bean
    Binding binding2() {    //任意存在
        Binding b = BindingBuilder.bind(queue2())
                .to(headersExchange()).whereAny("id","token").exist();
        return b;
    }

    @Bean
    Binding binding3() {
        Map<String,Object> map = new HashMap<>();
        map.put("id",101);
        map.put("token","t1");
        Binding b = BindingBuilder.bind(queue3())
                .to(headersExchange()).whereAll(map).match();   //value 101 t1
        return b;
    }

    @Bean
    Binding binding4() {
        Map<String,Object> map = new HashMap<>();
        map.put("id",101);
        map.put("token","t1");
        Binding b = BindingBuilder.bind(queue4())
                .to(headersExchange()).whereAny(map).match();   //value 101 t1  任一
        return b;
    }
}

service:

//消费方收到消息做业务处理,检测敏感字符
@Service
public class Hederservices {

    //Queue helloQ() {
    //        return new Queue("helloQ");
    //    }
    @RabbitListener(queues = "q1")
    public void doq1(String msg) {
        System.out.println(new Date() + "q1 id token all" + msg);
    }

    @RabbitListener(queues = "q1")
    public void doq2(String msg) {
        System.out.println(new Date() + "q1_2 id token any" + msg);
    }

    @RabbitListener(queues = "q3")
    public void doq3(String msg) {
        System.out.println(new Date() + "q3 map id=101 token=t1 all value matche" + msg);
    }

    @RabbitListener(queues = "q4")
    public void doq4(String msg) {
        System.out.println(new Date() + "q4 map id=101 token=t1 value anymatche" + msg);
    }

    @RabbitListener(queues = "q1")
    public void doTest(Message message, Channel channel) {
        System.out.println("采用Message格式来接收数据...channel---" + channel.toString());
        System.out.println("message:" + new String(message.getBody()) );
    }
}

3、fanout(广播)

生产者:
config

@Configuration
public class fanoutConfig {

    @Bean
    FanoutExchange fanoutExchange() {
        return new FanoutExchange("fanout-exchange");
    }
}

controller:
无需指定key,只需要绑定模式和端口,即可接收

@RestController
@RequestMapping("/fanout")
public class fanoutController {

    @Autowired
    private AmqpTemplate amqpTemplate;

    @RequestMapping("/send")
    public String sendeMessage(String msg) {
        amqpTemplate.convertAndSend("fanout-exchange","",msg);
        return "/fanout/send 发送" + msg;
    }

}

消费者:
config

@Configuration
public class fanoutConfig {

    @Bean
    FanoutExchange fanoutExchange() {
        return new FanoutExchange("fanout-exchange");
    }

    @Bean
    Queue fanout_queue() {
        return new Queue("fanout_queue");
    }

    @Bean
    Binding fanoutBind() {
        Binding binding = BindingBuilder.bind(fanout_queue())
                .to(fanoutExchange());
        return binding;
    }
}

services:

//消费方收到消息做业务处理,检测敏感字符
@Service
public class fanoutservices {

    //Queue helloQ() {
    //        return new Queue("helloQ");
    //    }
    @RabbitListener(queues = "fanout_queue")
    public void do_fanout_queue(String msg) {
        System.out.println(new Date() + "fanout_queue msg:" + msg);
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值