springboot2.x +rabbitmq使用和源码分析一(自动装配)

序言:

之前描述过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
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值