Springboot集成RabbitMQ 多数据源封装插件
- 支持对多个RabbitMQ数据源的集成和使用
- 支持发送者Confirm机制和接收者ACK机制
- 支持RabbitMQ常用的五种模型
Pom依赖
<dependency>
<groupId>cn.js.icode</groupId>
<artifactId>message-queue</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
基本使用方法
1.启动类注解
在springboot启动类上面加上注解:
@EnableRabbitMQ(producerPackages = {"com.example.demo.example.*"}, consumerPackages = {"com.example.demo.example.*"})
该注解有两个参数 String[] consumerPackages 和 String[] producerPackages
用consumerPackages 表示所有消息接收者的包路径
用producerPackages 表示所有消息发送者的包路径
注意:底层通过扫包实现,请尽可能定位到最下级包,用*匹配一个字段
2.配置properties
通过rabbitMQService.rabbitMQ-num来配置mq数据源数量
每条数据源公有配置
###数据源名称
rabbitMQService.MQ1.name=queue1
###数据源类型
rabbitMQService.MQ1.type=simpleQueue
###服务器地址
rabbitMQService.MQ1.host=106.13.168.81
###服务器端口(AMQP)
rabbitMQService.MQ1.port=5672
rabbitMQService.MQ1.username=admin
rabbitMQService.MQ1.password=123456
rabbitMQService.MQ1.virtual-host=v_host
###开启自动ack模式,默认为true
rabbitMQService.MQ2.autoAck=false
其中前缀rabbitMQService.MQ1为rabbitMQService.MQ+当前数据源序号(首位从1开始)
name是唯一区分每个数据源的判断条件,请不要重复
如果某个数据源没有配置host,port,username,password,virtual-host,则会使用第一条正确的配置项作为默认配置使用,虽然程序能处理部分不规范配置,但请尽量避免使用不规范的配置!
接下来定义队列
###队列名
rabbitMQService.MQ1.queue-name1=simple-queue
###是否需要关闭持久化到硬盘(默认为false)
rabbitMQService.MQ1.durable1=true
###在失去消费者后是否删除此队列(默认为false)
rabbitMQService.MQ1.autoDelete1=true
###连接通道是否私有(默认为false)
rabbitMQService.MQ1.exclusive1=true
在定义每个队列的时候在配置参数最后加上queue序号(首位从1开始),程序将依次读取
3.使用发送者发送消息
package com.example.demo.example;
@RestController
public class TestController {
@MQProducer(MQName = "queue1")
private MQSender sender1;
@RequestMapping("/a")
String test1() throws Exception {
return sender1.send("", "simple-queue", null, "1".getBytes()) ? "success" : "fail";
}
}
首先在类中定义一个成员变量Field,类型为MQSender,使用@MQProducer,他需要一个String类型参数,就是刚刚配置的数据源的name
我们在需要发送消息的时候直接调用这个field的send()方法就可以了
public interface MQSender {
boolean send(String exchange, String routingKey, BasicProperties props, byte[] body) throws Exception;
boolean send(String exchange, String routingKey, BasicProperties props, byte[] body, boolean enableConfirm) throws Exception;
}
这里第一种是常用方法,第二种还支持消息的confirm机制,当传入的参数enableConfirm为true时,该方法会返回此次消息发送是否成功。在非高并发情况下请尽量避免使用,该方法是同步的并且性能消耗较高!
参数说明
String exchange:交换机名称 在使用simple和work时仅为占位符,没有实际作用
String routingKey:路由键 在使用simple和work时为队列名
BasicProperties props:原生RabbitMQ Channel.basicPublish方法的附加参数,一般为空
byte[] body:要发送的消息体的字节流形式
public interface MQSender {
boolean send(String exchange, String routingKey, BasicProperties props, byte[] body) throws Exception;
boolean send(String exchange, String routingKey, BasicProperties props, byte[] body, boolean enableConfirm) throws Exception;
}
4.使用消息接收者接收消息
先定义一个类,并将其注入到spring容器中
在需要的监听方法Method上加上 @MQConsumer注解
他要求两个参数: MQName就是数据源的name,queueName就是需要监听的队列名称
该方法要求的参数Parameter要求:
必须要有一个String类型参数,在该参数前加上@ListenerMSG注解,表示这个参数是接收的消息
如果这个队列需要手动Ack,则还需要一个BascAck类型的参数,在该参数前加上@ListenerACK注解,表示这个参数用来ack,在需要ack的时候调用BascAck的ack()方法。
@Component
public class Consumer {
@MQConsumer(MQName = "queue1", queueName = "simple-queue")
public void listener1(@ListenerMSG String msg, @ListenerACK BaseAck baseAck) throws IOException {
System.out.println("listener1——来自*queue1* *simple-queue*的信息:" + msg);
}
}
源码地址
结语
目前插件尚处于SNAPSHOT阶段,有任何意见或者bug可以直接提PR,我会更新。
来源:CSDN
作者:qq_26023163
链接:https://blog.csdn.net/qq_26023163/article/details/104132187