簡體   English   中英

Kafka 和 ActiveMQ 的通用消息代理接口

[英]Common message broker interface for Kafka and ActiveMQ

我想設計一個接口,用於在 spring 啟動微服務之間簡單地發送和接收消息。 任何服務都應該能夠自動連接接口並使用發送/接收方法。 這些方法的實現應該取決於 application.props 文件是要使用 kafka 還是 activemq。 我無法想出一個干凈的設計。 我在想是否可以為它創建一個自定義注釋。 無論 spring 啟動體驗如何,我都無法想象這樣的設計。 骨架看起來像下面的東西,但我無法看到如何將其實現為正確的代碼:bean,在 kafka/activemq 特定注釋和方法之間切換,等等。

服務:

@Autowired MessageProducer messageProducer

@Autowired MessageReceiver messageReceiver

MessageProducer [接口] public void sendMessage(destination, payload)

MessageReceiver [接口] public void receiveMessage(source, payload)

你可以有兩個實現類,比如KafkaMessageProducerActvieMQMessageProducer application.properties中,你可以有像 messinging.type messaging.type=kafka或 messinging.type messaging.type=activemq這樣的配置,它將指定應該應用 select 的消息通信。

配置 class:

@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();
    }
}

如果您想在同一個應用程序中使用這兩種消息類型(例如,一個服務 class 將使用 Kafka,而另一個 class 將使用 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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM