Spring @RabbitListener 原理 -- 个人见解

调用层

  1. RabbitAutoConfiguration // 这个是自动配置引入
  2. RabbitAnnotationDrivenConfiguration
  3. @EnableRabbit
  4. RabbitBootstrapConfiguration
  5. RabbitListenerAnnotationBeanPostProcessor
  6. xx 略
  • 说明:
    • @RabbitListener 注解的类本身没有被 AOP 代理
    • 只是 Spring 内部记录下
    • 然后收到消息通过反射调用被注解的方法
    • 类似 SpringMVC 对 @RequestMapping 映射的处理
最终调用
  • SimpleMessageListenerContainer.AsyncMessageProcessingConsumer 循环监听
    • receiveAndExecute(this.consumer) 类似 socket 阻塞式监听
    • BlockingQueueConsumer
      • 内部再是通过阻塞队列,实现生产者、消费者模式
      • 默认 1 秒试拉 1
  • MessagingMessageListenerAdapter 具体调用

测试 AOP 导出

    static void setProxySavePath() throws Exception {
        System.setProperty( "jdk.proxy.ProxyGenerator.saveGeneratedFiles", "true" );
        
        Path path = Paths.get( Consumer1MainApplication.class.getResource( "/" ).toURI() );
        Path savePath = path.resolve( "../export/spring-aop-proxy" )
                .normalize()
                .toAbsolutePath();
        Files.createDirectories( savePath );

        System.out.println( "class 存放路径:" );
        System.out.println( savePath );
        System.out.println( "----------------------" );

        // 设置将 cglib 生成的代理类字节码生成到指定位置
        System.setProperty( DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, savePath.toString() );
    }
  • 运行时并没有输出对应的代理类

最后

看源码的一些忠告
  • IDEA 看源码,查看被调用的地方比较方便
  • Eclipse 看被调用的点时,有时很坑
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章