spring整合rabbitmq五种工作模式

目录

1.简单队列模式

2.工作模式

3.发布/订阅

3.1Fanout广播模式

3.2direct定向模式 

3.3通配符模式


1.简单队列模式

说明:

一个生产者对应一个消费者

代码:

1.配置文件

spring:
  rabbitmq:
    host: ip
    port: 5672
    username: username
    password: password
    virtual-host: test

2.生产者代码 

    @Test
    public void basipushmessage(){
//        声明存入消息的队列
        String queueName = "basicmessage";
//        发送消息
        rabbitTemplate.convertAndSend(queueName, "hello basicMessage");
    }

3.消费者代码

    //监听器模式
    @RabbitListener(queues = "basicmessage")
    public void listenSimpleQueueMessage(String message){
        System.out.println("spring 消费者接收到消息:【" + message + "】");
    }

2.工作模式

 说明:

1.一个生产者对应多个消费者

2.当消费者在消费信息的时候,生产者可能频繁的生产消息,消费者如果处理不过来,会导致消息挤压,无法及时处理,所以可以选择工作模式,由多个消费者进行消息处理

3.多个消费者绑定到一个队列,同一条消息只会被一个消费者处理

代码:

1.生产者生产消息

    @Test
    public void workquenePushmessage() throws InterruptedException {
        // 队列名称
        String queueName = "workquene";
        // 消息
        String message = "rabbitmq工作模式";
        for (int i = 0; i < 50; i++) {
            // 发送消息
            rabbitTemplate.convertAndSend(queueName, message + i);
            Thread.sleep(20);
        }
    }

2.消费者消费消息

    @RabbitListener(queues = "workquene")
    public void listenworkqueneQueueMessage(String message) throws InterruptedException {
        System.out.println("spring 消费者1接收到消息:【" + message + "】");
        Thread.sleep(20);
    }

    @RabbitListener(queues = "workquene")
    public void listenworkqueneQueueMessage2(String message) throws InterruptedException {
        System.out.println("spring 消费者2接收到消息:【" + message + "】");
        Thread.sleep(200);
    }

3.发布/订阅

说明:

1.在发布/订阅模式中,多了一个exchange交换机

2.exchange:交换机

  • 接受生产者的消息
  • 通过exchange进行不同的消息处理:
  1. Fanout:广播,将消息交给所有绑定到交换机的队列
  2. Direct:定向,把消息交给符合指定routing key 的队列
  3. Topic:通配符,把消息交给符合routing pattern(路由模式) 的队列

3.Exchange(交换机)只负责转发消息,不具备存储消息的能力,因此如果没有任何队列与Exchange绑定,或者没有符合路由规则的队列,那么消息会丢失

3.1Fanout广播模式

代码:

1.生产者代码

    @Test
    public void fanoutMessage(){
        // 队列名称
        String exchangeName = "test.fanout";
        // 消息
        String message = "hello, fanout广播模式!";
        rabbitTemplate.convertAndSend(exchangeName, "", message);
    }

2.消费者代码

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "fanout.queue1"),
            exchange = @Exchange(name = "test.fanout", type = ExchangeTypes.FANOUT)
    ))
    public void listenFanoutQueue1(String msg) {
        System.out.println("消费者1接收到Fanout消息:【" + msg + "】");
    }

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "fanout.queue2"),
            exchange = @Exchange(name = "test.fanout", type = ExchangeTypes.FANOUT)
    ))
    public void listenFanoutQueue2(String msg) {
        System.out.println("消费者2接收到Fanout消息:【" + msg + "】");
    }

3.2direct定向模式 

说明:

  • 队列与交换机的绑定,不能是任意绑定了,而是要指定一个RoutingKey(路由key)
  • 消息的发送方在 向 Exchange发送消息时,也必须指定消息的 RoutingKey

  • Exchange不再把消息交给每一个绑定的队列,而是根据消息的Routing Key进行判断,只有队列的Routingkey与消息的 Routing key完全一致,才会接收到消息

 

代码:

1.生产者代码

    @Test
    public void directMessage(){
        // 队列名称
        String exchangeName = "test.direct";
        // 消息
        String message = "hello, direct定向模式!";
        rabbitTemplate.convertAndSend(exchangeName, "yellow", message);
    }

2.消费者代码

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "direct.queue1"),
            exchange = @Exchange(name = "test.direct", type = ExchangeTypes.DIRECT),
            key = {"red", "blue"}
    ))
    public void listenDirectQueue1(String msg){
        System.out.println("消费者接收到direct.queue1的消息:【" + msg + "】");
    }


    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "direct.queue2"),
            exchange = @Exchange(name = "test.direct", type = ExchangeTypes.DIRECT),
            key = {"red", "yellow"}
    ))
    public void listenDirectQueue2(String msg){
        System.out.println("消费者接收到direct.queue2的消息:【" + msg + "】");
    }

3.3通配符模式

 

说明:

#:匹配一个或多个词

*:匹配不多不少恰好1个词

Queue1:绑定的是china.# ,因此凡是以 china.开头的routing key 都会被匹配到。包括china.news和china.weather

Queue2:绑定的是#.news ,因此凡是以 .news结尾的 routing key 都会被匹配。包括china.news和japan.news

代码:

1.生产者代码

    @Test
    public void topicmessage(){
        // 队列名称
        String exchangeName = "test.topic";
        // 消息
        String message = "hello, topic通配符模式!";
        rabbitTemplate.convertAndSend(exchangeName, "test.news", message);

    }

2.消费者代码

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "topic.queue1"),
            exchange = @Exchange(name = "test.topic", type = ExchangeTypes.TOPIC),
            key = "test.#"
    ))
    public void listentopicQueue1(String msg){
        System.out.println("消费者接收到topic.queue1的消息:【" + msg + "】");
    }


    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "topic.queue2"),
            exchange = @Exchange(name = "test.topic", type = ExchangeTypes.TOPIC),
            key = "test.*"
    ))
    public void listentopicQueue2(String msg){
        System.out.println("消费者接收到topic.queue2的消息:【" + msg + "】");
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot中,可以使用spring-boot-starter-amqp库来轻松地集成RabbitMQ,并且封装了多种模式的实现方式。 1. 简单模式(Simplest Model): ```java @Autowired private RabbitTemplate rabbitTemplate; public void sendSimpleMessage(String message) { rabbitTemplate.convertAndSend("simple-queue", message); } @RabbitListener(queues = "simple-queue") public void receiveSimpleMessage(String message) { System.out.println("Received message: " + message); } ``` 2. 工作队列模式(Work queues Model): ```java @Autowired private RabbitTemplate rabbitTemplate; public void sendWorkMessage(String message) { rabbitTemplate.convertAndSend("work-queue", message); } @RabbitListener(queues = "work-queue") public void receiveWorkMessage(String message) throws InterruptedException { System.out.println("Received message: " + message); Thread.sleep(1000); // 模拟消费者耗时操作 } ``` 3. 发布/订阅模式(Publish/Subscribe Model): ```java @Autowired private RabbitTemplate rabbitTemplate; public void sendPublishMessage(String message) { rabbitTemplate.convertAndSend("fanout-exchange", "", message); } @RabbitListener(queues = "fanout-queue-1") public void receivePublishMessage1(String message) { System.out.println("Received message from queue 1: " + message); } @RabbitListener(queues = "fanout-queue-2") public void receivePublishMessage2(String message) { System.out.println("Received message from queue 2: " + message); } ``` 4. 路由模式(Routing Model): ```java @Autowired private RabbitTemplate rabbitTemplate; public void sendRoutingMessage(String message, String routingKey) { rabbitTemplate.convertAndSend("direct-exchange", routingKey, message); } @RabbitListener(queues = "direct-queue-1") public void receiveRoutingMessage1(String message) { System.out.println("Received message from queue 1: " + message); } @RabbitListener(queues = "direct-queue-2") public void receiveRoutingMessage2(String message) { System.out.println("Received message from queue 2: " + message); } ``` 5. 主题模式(Topic Model): ```java @Autowired private RabbitTemplate rabbitTemplate; public void sendTopicMessage(String message, String routingKey) { rabbitTemplate.convertAndSend("topic-exchange", routingKey, message); } @RabbitListener(queues = "topic-queue-1") public void receiveTopicMessage1(String message) { System.out.println("Received message from queue 1: " + message); } @RabbitListener(queues = "topic-queue-2") public void receiveTopicMessage2(String message) { System.out.println("Received message from queue 2: " + message); } ``` 6. 随机模式(Headers Model): ```java @Autowired private RabbitTemplate rabbitTemplate; public void sendHeadersMessage(String message, Map<String, Object> headers) { MessageProperties messageProperties = new MessageProperties(); messageProperties.getHeaders().putAll(headers); Message messageObj = MessageBuilder.withBody(message.getBytes()) .andProperties(messageProperties) .build(); rabbitTemplate.send("headers-exchange", "", messageObj); } @RabbitListener(queues = "headers-queue-1") public void receiveHeadersMessage1(String message) { System.out.println("Received message from queue 1: " + message); } @RabbitListener(queues = "headers-queue-2") public void receiveHeadersMessage2(String message) { System.out.println("Received message from queue 2: " + message); } ``` 以上是Spring Boot中封装RabbitMQ的6种模式的简单示例。实际使用时,可能需要更加复杂的逻辑,例如消息确认、消息重试、死信队列等功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值