在前面,我写过两篇SpringBoot
整合使用RabbitMq
的文章,链接如下
SpringBoot整合rabbitMq | 半月无霜 (banmoon.top)
SpringBoot动态创建绑定rabbitMq队列 | 半月无霜 (banmoon.top)
但是,这边有个问题,那就是太繁琐了
bean
的方式,什么Queue
,Exchange
,Binding
都需要创建,使用的是添加@Bean
注解queue
、exchange
、binding
的配置信息,但也有下面的缺点queue
等信息,却还要在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
好的,那接下来就是我们的重头戏,注解是这个@RabbitListener
,
你可能会有疑惑,这不是消费者监听所需要的注解吗
先别急着疑惑,看下面的使用方式
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
等
这样就完成了绑定,非常好用
我们需要一个生产者,而生产者的使用也十分简单,上一篇文章中写了个抽象类AbstractProducer.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
即可
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 删除。