项目中使用了mq,kafka两种消息队列进行发送数据,为了避免硬编码,在项目中通过不同的配置文件自动识别具体消息队列策略。这里整理两种实施方案,仅供参考!
方案一:创建一个工具类,然后根据配置文件来返回具体的IBase实现类
1.IBaseService
/*** 发送数据接口*/
public interface IBaseService {void send();
}
2.KafkaServiceImpl
@Service
public class KafkaServiceImpl implements IBaseService {@AutowiredMyConfiguration myConfiguration;@Overridepublic void send() {System.out.println("调用Kafka接口发送数据!");myConfiguration.init("-------------Kafka-------------");}
}
3.MQServiceImpl
@Service
public class MQServiceImpl implements IBaseService {@AutowiredMyConfiguration myConfiguration;@Overridepublic void send() {System.out.println("调用MQ接口,发送数据!");myConfiguration.init("-------------MQ-----------");}
}
4.SendMessageUtil
/*** 根据不同配置文件,选择发送消息工具类*/
@Component
public class SendMessageUtil {//message.type在application.yaml,":kafka" 设置默认值为kafka@Value("${message.type:kafka}")private String type;@AutowiredKafkaServiceImpl kafkaService;@AutowiredMQServiceImpl mqService;public IBaseService get(){if (type.equals("kafka"))return kafkaService;elsereturn mqService;}
}
5.方案一单元测试及测试结果
application.yaml
message:type: kafka
@AutowiredSendMessageUtil sendMessageUtil;@Testvoid contextLoadsTwo() {IBaseService tempBaseService = sendMessageUtil.get();tempBaseService.send();}
方案二:@Conditional注解根据配置文件注入不同的bean对象
1.KafkaCondition
/*** Kafka推送方式*/
public class KafkaCondition implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {Environment environment = context.getEnvironment();String type = environment.getProperty("message.type");if (type.contains("kafka")){return true;}return false;}
}
2.KafkaServiceImpl上面加上@Conditional(KafkaCondition.class)
3.MQCondition
/*** MQ推送方式*/
public class MQCondition implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {Environment environment = context.getEnvironment();String type = environment.getProperty("message.type");if (type.contains("mq")){return true;}return false;}
}
4.MQServiceImpl上面加上@Conditional(MQCondition.class)
5.方案二单元测试及测试结果
application.yaml
message:type: kafka
// 注意:运行contextLoadsTwo测试方法时候,需要将iBaseService全部注释掉,否则会报错// 也要将KafkaServiceImpl和MQServiceImpl上面@Conditional注释掉@AutowiredSendMessageUtil sendMessageUtil;@Testvoid contextLoadsTwo() {IBaseService tempBaseService = sendMessageUtil.get();tempBaseService.send();}
6.项目结构及源码
源码奉上,欢迎star!
MyIdea