Общий интерфейс брокера сообщений для Kafka и ActiveMQ - PullRequest
1 голос
/ 11 июля 2020

Я хочу разработать интерфейс, который будет использоваться для простой отправки и получения сообщений между микросервисами весенней загрузки. Любая служба должна иметь возможность автоматически подключать интерфейс и использовать методы отправки / получения. Реализация этих методов должна зависеть, скажем, от файла application.props, хочет ли он использовать kafka или activemq. Я не могу придумать чистый дизайн. Я подумал, могу ли я создать для него специальную аннотацию. При любом опыте весенних ботинок я не могу представить себе такой дизайн. Скелет выглядит примерно так, как показано ниже, но я не могу понять, как я смогу реализовать это как правильный код: beans, переключение между аннотациями и методами kafka / activemq c и т.д. c. и т.п. , полезная нагрузка)

MessageReceiver [интерфейс] publi c void receiveMessage (источник, полезная нагрузка)

1 Ответ

3 голосов
/ 11 июля 2020

у вас может быть два класса реализации, например KafkaMessageProducer и ActvieMQMessageProducer. внутри application.properties у вас может быть конфигурация, например messaging.type=kafka или messaging.type=activemq, которая будет указывать, какое сообщение обмена сообщениями должно выбирать приложение.

Класс конфигурации:

@Configuration
public class MessagingConfiguration {

    @Bean
    @ConditionalOnProperty(name = "messaging.type", havingValue = "kafka")
    public MessageProducer messageProducer() {
        return new KafkaMessageProducer();
    }
    
    @Bean
    @ConditionalOnProperty(name = "messaging.type", havingValue = "activemq")
    public MessageProducer messageProducer() {
        return new ActvieMQMessageProducer();
    }
}

, если вы хотите использовать оба типы обмена сообщениями в одном приложении (например, один класс обслуживания будет использовать Kafka, в то время как другой класс будет использовать ActiveMQ), а затем создать два bean-компонента (как упомянуто выше, но с @Qualifier и без @ConditionalOnProperty). И для каждой службы, для которой требуется производитель сообщений, укажите с помощью @Qualifier, какая реализация вам нужна

@Configuration
public class MessagingConfiguration {

    @Bean
    @Qualifier("kafkaMessageProducer")
    public MessageProducer messageProducer() {
        return new KafkaMessageProducer();
    }
    
    @Bean
    @Qualifier("actvieMQMessageProducer")
    public MessageProducer messageProducer() {
        return new ActvieMQMessageProducer();
    }

    @Bean
    public YourService messageProducer(@Qualifier("kafkaMessageProducer") MessageProducer messageProducer) {
        return new YourServiceImpl(messageProducer);
    }
}
...