序言:
之前描述过springboot对kafka对支持,这里主要描述springboot对于rabbitmq的支持。这里建立在对rabbitmq有一定了解,若是一个新手建议参考官网结合一些博客来自我学习。
在学习之前需要进行rabbitmq部署,和kafka一样,也部署在docker中,这里直接从远端仓库中pull,在本地创建build.sh文件。
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 -v /Users/fangyuan/Desktop/software/df/rabbitmq/log:/var/lib/rabbitmq/log -v /Users/fangyuan/Desktop/software/df/rabbitmq:/var/lib/rabbitmq --hostname myRabbit -e RABBITMQ_DEFAULT_VHOST=my_vhost -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin rabbitmq:3.8.5-management
等容器启动之后,需要进入容器或外部执行以下命令开启rabbitmq_management插件
docker exec -it rabbit rabbitmq-plugins enable rabbitmq_management
正文:
springboot对于rabbitmq各核心组件初始化都在:autoconfigure包下 (这里用的springboot版本较新2.3.1)
上面描述的这些类中,主要例举一个核心类并对其介绍:
1: RabbitProperties
该类从命名上也知道它是一个属性配置文件类,映射配置文件中以spring.rabbitmq开头属性:
对每个属性的详细介绍,可以自行查看源码,每一个属性中都有相对应的注释,springboot依靠这些配置对rabbitmq进行个factory的初始化。
2: RabbitAutoConfiguration(配置与Rabbitmq connection与生产者有关对象)
源码分析:
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ RabbitTemplate.class, Channel.class })
@EnableConfigurationProperties(RabbitProperties.class)
@Import(RabbitAnnotationDrivenConfiguration.class)
public class RabbitAutoConfiguration {
@Configuration(proxyBeanMethods = false)
@ConditionalOnMissingBean(ConnectionFactory.class)
protected static class RabbitConnectionFactoryCreator {
/**
* 初始化 ConnectionFactory 该类用于创建client与rabbitmq连接
* CachingConnectionFactory 是spring对rabbitmq默认rabbitConnectionFactory的一个包装 添加对
* connection和channel 的Cache 使得connection与channel可复用 避免大量对象被创建和销毁
*/
@Bean
public CachingConnectionFactory rabbitConnectionFactory(RabbitProperties properties,
ObjectProvider<ConnectionNameStrategy> connectionNameStrategy) throws Exception {
PropertyMapper map = PropertyMapper.get();
CachingConnectionFactory factory = new CachingConnectionFactory(
getRabbitConnectionFactoryBean(properties).getObject());
//根据配置配置文件属性初始化
//设置rabbitmq地址
map.from(properties::determineAddresses).to(factory::setAddresses);
//是否开启
map.from(properties::isPublisherReturns).to(factory::setPublisherReturns);
/**
* 设置发送端ack确认机制类型 3种类型
* simple (开启简单模式 同步阻塞方式针对于RabbitTemplate#waitForConfirms()-或者waitForConfirmsOrDie -异常后信道被关闭,生产者发布不能继续发布消息 )
* correlated(开启 通过ConfirmCallback 异步回调方式来达到ack控制)
* none(默认为不开启) 低版本中通过
* spring.rabbitmq.publisher-confirms=true控制
*/
map.from(properties::getPublisherConfirmType).whenNonNull().to(factory::setPublisherConfirmType);
//对channel进行设置
RabbitProperties.Cache.Channel channel = properties.getCache().getChannel();
//要保留在缓存中的通道数。当“check timeout”>0时,对应每个connection的中最大通道数。默认25
map.from(channel::getSize).whenNonNull().to(factory::setChannelCacheSize);
//如果一个connection中已达到缓存大小,改值设定等待获取通道的持续时间。如果为0,则始终创建新channel
//否则 以size为最大值默认为0
map.from(channel::getCheckoutTimeout).whenNonNull().as(Duration::toMillis)
.to(factory::setChannelCheckoutTimeout);
//对connection进行设置
RabbitProperties.Cache.Connection connection = properties.getCache().getConnection();
/**
* 缓存类型
* channel(默认 在这种模式下,所有的createConnection()方法实际上返回的都是同一个Connection)
* connection(在这种模式下 每一次调用createConnection()方法都会新建一个或者从缓存中获取,
* 根据你设置的ConnectionCacheSize的大小,当小于的时候会采用新建的策略,当大于等于的时候会采用从缓存中获取的策略
* 在这个模式下 channel与connection都会缓存 目前channel最大为25个 非高并发情况下 建议使用默认即可
*/
map.from(connection::getMode).whenNonNull().to(factory::setCacheMode);
//connect对应缓存连接数大小
map.from(connection::getSize).whenNonNull().to(factory::setConnectionCacheSize);
//提供一个ConnectionNameStrategy来构建目标RabbitMQ connection的名称 默认为beanName+计算器值
map.from(connectionNameStrategy::getIfUnique).whenNonNull().to(factory::setConnectionNameStrategy);
//所有你获取的Channel对象必须要显式的关闭,如果忘记释放,则可能造成连接池中没有资源可用。
return factory;
}
/**
* 设置基础参数
*/
private RabbitConn