RabbitMQ 多数据源封装插件

独自空忆成欢 提交于 2020-02-02 01:47:33

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);
    }
}

源码地址

github源码地址

jar文件下载地址
pom文件下载地址

结语

目前插件尚处于SNAPSHOT阶段,有任何意见或者bug可以直接提PR,我会更新。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!