目标
减少重复代码的开发工作,简化RabbitMQ的接入工作,让程序员的关注点更多的集中在业务逻辑的处理上。
实现原理
动态创建核心原理
在Spring启动时,利用Spring Bean管理工厂BeanFactory接口,实现动态创建交换机、队列、交换机和队列的绑定关系,让我们无需进行重复的编码工作。
源码解析
RabbitMqProperties
/**
* rabbitmq 消息队列和交换机 配置文件
*
* @author zhumin
*/
@Slf4j
@Data
@ConfigurationProperties(
prefix = "rabbit"
)
public class RabbitMqProperties {
/**
* 装载自定义配置交换机
*/
private List<ExchangeConfig> exchanges = new ArrayList<>();
/**
* 装载自定义配置队列
*/
private List<QueueConfig> queues = new ArrayList<>();
@Data
public static class QueueConfig {
/**
* 队列名(每个队列的名称应该唯一)
* 必须*
*/
private String name;
/**
* 指定绑定交互机,可绑定多个(逗号分隔)
* 必须*
*/
private String exchangeName;
/**
* 队列路由键(队列绑定交换机的匹配键,例如:“user” 将会匹配到指定路由器下路由键为:【*.user、#.user】的队列)
*/
private String routingKey;
/**
* 是否为持久队列(该队列将在服务器重启后保留下来)
*/
private Boolean durable = Boolean.TRUE;
/**
* 是否为排它队列
*/
private Boolean exclusive = Boolean.FALSE;
/**
* 如果队列为空是否删除(如果服务器在不使用队列时是否删除队列)
*/
private Boolean autoDelete = Boolean.FALSE;
/**
* 头队列是否全部匹配
* 默认:是
*/
private Boolean whereAll = Boolean.TRUE;
/**
* 参数
*/
private Map<String, Object> args;
/**
* 消息头
*/
private Map<String, Object> headers;
}
@Data
public static class ExchangeConfig {
/**
* 交换机名
*/
private String name;
/**
* 交换机类型
*/
private ExchangeType type;
/**
* 自定义交换机类型
*/
private String customType;
/**
* 交换机参数(自定义交换机)
*/
private Map<String, Object> arguments;
}
public enum ExchangeType {
/**
* 自定义交换机
*/
CUSTOM,
/**
* 直连交换机(全文匹配)
*/
DIRECT,
/**
* 通配符交换机(两种通配符:*只能匹配一个单词,#可以匹配零个或多个)
*/
TOPIC,
/**
* 头交换机(自定义键值对匹配,根据发送消息内容中的headers属性进行匹配)
*/
HEADERS,
/**
* 扇形(广播)交换机 (将消息转发到所有与该交互机绑定的队列上)
*/
FANOUT;
}
public ExchangeConfig getExchangeConfig(String name) {
Map<String, ExchangeConfig> collect = exchanges.stream().collect(Collectors.toMap(e -> e.getName(), e -> e));
return collect.get(name);
}
/**
* 动态创建交换机
*
* @return
*/
@Bean
public Object createExchange() {
List<ExchangeConfig> exchanges = getExchanges();
if (!CollectionUtils.isEmpty(exchanges)) {
exchanges.forEach(e -> {
// 声明交换机
Exchange exchange = null;
switch