开发者社区> 问答> 正文

在 Spring 生态中玩转 RocketMQ中罗美琪将代码进行了模块化后,被发现问题后的修改过程是

在 Spring 生态中玩转 RocketMQ中罗美琪将代码进行了模块化后,被发现问题后的修改过程是什么?

展开
收起
vncamyi27xznk 2021-11-11 10:20:20 633 0
1 条回答
写回答
取消 提交回答
  • " @Configuration @EnableConfigurationProperties(RocketMQProperties.class) @ConditionalOnClass(MQClientAPIImpl.class) @Order ~~春波特: 这个类里使用 Order 很不合理呵,不建议使用,完全可以通过其他方式控制 runtime 是 Bean 的构建顺序 @Slf4j public class RocketMQAutoConfiguration { @Bean @ConditionalOnClass(DefaultMQProducer.class) ~~春波特: 属性直接使用类是不科学的,需要用(name=""类全名"") 方式,这样在类不在 classpath 时,不会抛出 CNFE @ConditionalOnMissingBean(DefaultMQProducer.class) @ConditionalOnProperty(prefix = ""spring.rocketmq"", value = {""nameServer"", ""producer.g roup""}) ~~春波特: nameServer 属性名要写成 name-server [1] @Order(1) ~~春波特: 删掉呵 public DefaultMQProducer mqProducer(RocketMQPropert ies rocketMQProperties) { ... } @Bean @ConditionalOnClass(ObjectMapper.class) @ConditionalOnMissingBean(name = ""rocketMQMessageObjectMapper"") ~~春波特: 不建 议与具体的实例名绑定,设计的意图是使用系统中已经存在的 ObjectMapper, 如果没有,则在这里实例化一个,需要改成 @ConditionalOnMissingBean(ObjectMapper.class) public ObjectMapper rocketMQMessageObjectMapper() { return new ObjectMapper(); } @Bean(destroyMethod = ""destroy"") @ConditionalOnBean(DefaultMQProducer.class) @ConditionalOnMissingBean(name = ""rocketMQTemplate"") ~~春波特: 与上面一样 @Order(2) ~~春波特: 删掉呵 public RocketMQTemplate rocketMQTemplate(DefaultMQProducer mqProducer, @Autowired(required = false) ~~春波特: 删掉 @Qualifier(""rocketMQMessageObjectMapper"") ~~春波特: 删掉,不要与具体实例绑定 ObjectMapper objectMapper) { RocketMQTemplate rocketMQTemplate = new RocketMQTemplate(); rocketMQTemplate.setProducer(mqProducer); if (Objects.nonNull(objectMapper)) { rocketMQTemplate.setObjectMapper(objectMapper); } return rocketMQTemplate; } @Bean(name = RocketMQConfigUtils.ROCKETMQ_TRANSACTION_ANNOTATION_PROCESS OR_BEAN_NAME) @ConditionalOnBean(TransactionHandlerRegistry.class) @Role(BeanDefinition.ROLE_INFRASTRUCTURE) ~~春波特: 这个 bean(RocketMQTransacti onAnnotationProcessor)建议声明成 static 的,因为这个 RocketMQTransactionAnnotationProcess or 实现了 BeanPostProcessor 接口,接口里方法在调用的时候(创建 Transaction 相关的 Bean 的时候可以直接使用这个 static 实例,而不要等到这个 Configuration 类的其他的 Bean 都构建好 [2] public RocketMQTransactionAnnotationProcessor transactionAnnotationProcessor( TransactionHandlerRegistry transactionHandlerRegistry) { return new RocketMQTransactionAnnotationProcessor(transactionHandlerRegistry); } @Configuration ~~春波特: 这个内嵌的 Configuration 类比较复杂,建议独立成一个顶级类 并且使用 @Import 在主 Configuration 类中引入 @ConditionalOnClass(DefaultMQPushConsumer.class) @EnableConfigurationProperties(RocketMQProperties.class) @ConditionalOnProperty(prefix = ""spring.rocketmq"", value = ""nameServer"") ~~春波特: ame-server public static class ListenerContainerConfiguration implements ApplicationContextAware, InitializingBean { ... @Resource ~~春波特: 删掉这个 annotation, 这个 field injection 的方式不推荐,建议使用 setter 或者构造参数的方式初始化成员变量 private StandardEnvironment environment; @Autowired(required = false) ~~春波特: 这个注解是不需要的 public ListenerContainerConfiguration( @Qualifier(""rocketMQMessageObjectMapper"") ObjectMapper objectMapper) { 春波特: @Qualifier 不需要 this.objectMapper = objectMapper; }

    这本电子书收录开发者藏经阁,下载连接:https://developer.aliyun.com/topic/download?id=1216"

    2021-11-11 18:47:55
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
RocketMQ Client-GO 介绍 立即下载
RocketMQ Prometheus Exporter 打造定制化 DevOps 平台 立即下载
基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台 立即下载