前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot如何更加优雅的使用RabbitMq

SpringBoot如何更加优雅的使用RabbitMq

原创
作者头像
半月无霜
修改2024-07-22 12:01:39
1730
修改2024-07-22 12:01:39
举报
文章被收录于专栏:半月无霜

SpringBoot如何更加优雅的使用RabbitMq

一、介绍

在前面,我写过两篇SpringBoot整合使用RabbitMq的文章,链接如下

SpringBoot整合rabbitMq | 半月无霜 (banmoon.top)

SpringBoot动态创建绑定rabbitMq队列 | 半月无霜 (banmoon.top)

但是,这边有个问题,那就是太繁琐了

  • 第一篇文章中,是指定创建bean的方式,什么QueueExchangeBinding都需要创建,使用的是添加@Bean注解
  • 第二篇文章中,使用了一种动态的方式,虽然只需要在配置文件中指定queueexchangebinding的配置信息,但也有下面的缺点
    • 配置简单仅针对直连交换机,其他的配置依旧很繁琐,还增加了学习成本,寻常开发需要教学一段时间才能上手添加队列
    • 就算在配置文件中指定了queue等信息,却还要在Java常量类中再写一遍,有点冗余

好的额,针对上面的问题,我今天推荐一种更加简洁的创建队列的方式

话不多说,直接上代码

二、代码

1)常量类

首先,是我们定义的常量类,这个在前面两篇文章都有出现过

代码语言:java
复制
package com.banmoon.constant;

/**
 * 记录rabbitmq相关的队列,交换机,路由KEY名称
 *
 * @author banmoon
 * @date 2024/02/27 12:22:13
 */
public interface RabbitmqConstant {

    /**
     * 定义的前缀
     */
    String RABBITMQ_PREFIX = "#{'${spring.rabbitmq.prefix:}'.empty ? '' : '${spring.rabbitmq.prefix:}' + '.'}";

    /**
     * 仅用注解方法队列
     */
    String ANNOTATION_TEST_QUEUE = RABBITMQ_PREFIX + "test.annotation.queue";
    String ANNOTATION_TEST_EXCHANGE = RABBITMQ_PREFIX + "test.annotation.exchange";
    String ANNOTATION_TEST_ROUTER_KEY = RABBITMQ_PREFIX + "test.annotation.routerKey";

}

上面的RABBITMQ_PREFIX是定义的前缀,主要是解决开发环境,同事之间的本地环境,生产者消费者冲突的情况 避免了同事想测试一个队列功能,生产出来消息却被另一个同事给消费走了 有了这个前缀,只需要在配置文件指定一下就行 spring: rabbitmq:# 交换机,队列前缀 prefix: banmoon

2)注解创建队列

好的,那接下来就是我们的重头戏,注解是这个@RabbitListener

你可能会有疑惑,这不是消费者监听所需要的注解吗

先别急着疑惑,看下面的使用方式

代码语言:java
复制
package com.banmoon.queues.consumer;

import com.banmoon.constant.RabbitmqConstant;
import lombok.extern.slf4j.Slf4j;
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.stereotype.Component;

/**
 * 仅使用注解的方式创建队列
 *
 * @author banmoon
 * @date 2024/07/19 20:42:51
 */
@Slf4j
@Component
public class TestAnnotationConsumer {

    @RabbitListener(bindings = @QueueBinding(
            exchange = @Exchange(value = RabbitmqConstant.ANNOTATION_TEST_EXCHANGE),
            value = @Queue(value = RabbitmqConstant.ANNOTATION_TEST_QUEUE),
            key = RabbitmqConstant.ANNOTATION_TEST_ROUTER_KEY))
    public void test(String message) {
        log.info("仅使用注解的方式创建队列消费者:{}", message);
    }

}

看到里面使用了@QueueeBinding注解,里面又指定了@Queue@Exchange

这样就完成了绑定,非常好用

3)验证一下

我们需要一个生产者,而生产者的使用也十分简单,上一篇文章中写了个抽象类AbstractProducer.java

我们只需要实现它即可,如下

代码语言:java
复制
package com.banmoon.queues.producer;

import com.banmoon.constant.RabbitmqConstant;
import com.banmoon.queues.AbstractProducer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * @author banmoon
 * @date 2024/07/19 20:55:02
 */
@Slf4j
@Component
public class TestAnnotationProducer extends AbstractProducer {

    public TestAnnotationProducer(AmqpTemplate amqpTemplate) {
        super(amqpTemplate);
    }

    @Override
    @Value(RabbitmqConstant.ANNOTATION_TEST_QUEUE)
    public void setQueueName(String queueName) {
        super.setQueueName(queueName);
    }

    @Override
    @Value(RabbitmqConstant.ANNOTATION_TEST_EXCHANGE)
    public void setExchangeName(String exchangeName) {
        super.setExchangeName(exchangeName);
    }

    @Override
    @Value(RabbitmqConstant.ANNOTATION_TEST_ROUTER_KEY)
    public void setRoutingKey(String routingKey) {
        super.setRoutingKey(routingKey);
    }
}

我们只需要使用这个TestAnnotationProducer.java即可

代码语言:java
复制
package com.banmoon.controller;

import com.banmoon.feign.MqProducerClient;
import com.banmoon.queues.producer.TestAnnotationProducer;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import static com.banmoon.feign.MqProducerClient.PREFIX_URL;

@Slf4j
@Api(tags = "生产者")
@RestController
@RequestMapping(PREFIX_URL)
@RequiredArgsConstructor
public class MqProducerController implements MqProducerClient {

    private final TestAnnotationProducer testAnnotationProducer;

    @Override
    @ApiOperation("测试注解队列生产者")
    @ApiImplicitParam(name = "message", value = "消息", required = true, paramType = "query")
    @PostMapping("/sendTestAnnotationMessage")
    public void sendTestAnnotationMessage(String message) {
        testAnnotationProducer.send(message);
    }

}

调用接口http://localhost:8082/produce/sendTestAnnotationMessage,查看结果

三、最后

以上,就是使用注解的方式创建队列,比起之前的创建方式简单易懂多了

后面再看看使用这种方式,如何去创建延迟队列

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SpringBoot如何更加优雅的使用RabbitMq
    • 一、介绍
      • 二、代码
        • 1)常量类
        • 2)注解创建队列
        • 3)验证一下
      • 三、最后
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档