【问题标题】:Common message broker interface for Kafka and ActiveMQKafka 和 ActiveMQ 的通用消息代理接口
【发布时间】:2020-11-01 02:59:00
【问题描述】:

我想设计一个接口,用于在 Spring Boot 微服务之间简单地发送和接收消息。任何服务都应该能够自动连接接口并使用发送/接收方法。这些方法的实现应该取决于 application.props 文件是要使用 kafka 还是 activemq。我无法想出一个干净的设计。我在想是否可以为它创建一个自定义注释。无论我有什么春季靴子经验,我都无法想象这样的设计。骨架看起来像下面的东西,但我无法看到如何将其实现为正确的代码:bean、在 kafka/activemq 特定注释和方法之间切换等等。

服务:

@自动连线 MessageProducer 消息生产者

@自动连线 MessageReceiver 消息接收者

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

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

【问题讨论】:

    标签: java spring spring-boot apache-kafka activemq


    【解决方案1】:

    您可以有两个实现类,例如 KafkaMessageProducerActvieMQMessageProducer。在application.properties 中,您可以有messaging.type=kafkamessaging.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);
        }
    }
    

    【讨论】:

    • 能否也请您简单解释一下如何处理KafkaMessageListener的回调函数
    • 您能否更详细地解释一下您需要对回调做什么?
    • 在您的上述解决方案中,我将使用 KafkaMessageProducer 实现类中的 sendMessage() 方法。类似地,KafkaMessageReceiver 中也会有 receiveMessage() 方法,它是事件处理函数……在其中接收消息/有效负载。我需要通过调用 receiveMessage() 方法访问不同服务中的有效负载
    • 在这种情况下,您需要从 MessageReceiver 返回收到的消息:public Object receiveMessage(source)。或者您可以将消费者作为附加参数传递:public void receiveMessage(source, Consumer callback)
    • 好的,@Vasyl Sarzhynskyi 我用接口做了回调。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    相关资源
    最近更新 更多