背景
项目组同事写了一个关于TDMQ的组件实现了类似KAFKA的@KafkaListener的功能,我们暂时就把注解称为@TdmqHandler。目前存在的问题是我们本地开发环境和测试环境使用的同一套TDMQ导致本地会消费测试环境的TDMQ的数据,因为我们想配置一个变量,然后通过启动命令来将这个TDMQ的消费者关闭。
解决方案
1.通过Environmnet来在处理@TdmqHandler时读取变量进行处理(总觉得不是很优雅)
我们写了一个ConsumerListenerPostProcessor类来处理@TdmqHandler注解,该类实现了BeanPostProcessor接口,可以在postProcessAfterInitialization()方法中判断Bean是否注解了@TdmqHandler,如果存在,则创建TDMQ消费者。
因此我在创建TDMQ消费者之前,通过environment获取环境变量tdmq.enable属性,String tdmqEnable = environment.getProperty("tdmq.enable"),然后根据tdmqEnable的值决定是否启动TDMQ的消费者,至于如何在ConsumerListenerPostProcessor中获取到environment变量呢,需要该类实现EnvironmentAware接口实现setEnvironment(Environment environmnet)接口即可。
2.在@TdmqHandler中添加开关字段,通过启动命令来控制字段的值来达到目的
因为总感觉上述方式不太优雅,因此我想在注解@TdmqHandler中添加一个字段比如enable然后使用变量的形式来控制它的值,实现效果@TdmqHandler(enable="${tdmq.enable}")。
我们在ConsumerListenerPostProcessor中找到带有@TdmqHander注解的Bean,然后获取注解中enable的值,即字符串"${tdmq.enable}",接下来我们可以借助Spring的StringValueResolver来进行解析,ConsumerListenerPostProcessor需要使用EmbeddedValueResolverAware接口并实现setEmbeddedValueResolver(StringValueResolver resolver)方法
String enableValue = stringValueResolver.resolveStringValue("${tdmq.enable}")
获取到的enableValue的值即为在配置文件中配置的值,然后在进行自己的业务处理
网友评论