当我得知需要在项目中同时集成多个 Kafka 和 RabbitMQ

那时的我

真的存在这样的需求么?

真的存在这样的需求么?

真的存在这样的需求么?

Unbelievable!难以置信.jpg

在我还没有遇到这个需求之前我可能会说,怎么可能会有这样的需求嘛?

以至于我能够列出许多原因:

  • 技术选型肯定要先做好啊,KafkaRabbitMQ一起用算怎么回事呢
  • 这俩都有Topic的概念,为啥要接入多个呢
  • ...

但是它出现了!它真的出现了!不管你有多无法想象为什么会有这样的需求,它终究还是被我遇到了

好嘛,既然如此,那就只能老老实实的看看怎么实现了

(不甘心的小声bb:我想知道真的有人遇到过这样的需求么?)

简单粗暴法

于是乎我点开了搜索引擎,作为一个能够熟练借助搜索引擎进行代码搬运。。。咳咳

在输入spring boot 多个 kafka这个几个关键字后,果不其然,第一篇就是相关的内容

我不禁赞叹了一番自己极高的搜索天赋,接着就点进去想看看能不能直接复制,啊不,是看看能不能让我在经过无与伦比的(这是什么鬼形容词)思考之后借鉴借鉴

文中的思路是这样的:

  • 首先是配置文件
spring:
  kafka:
    one:
      bootstrap-servers: IP:PORT
      consumer:
        group-id: YOUR_GROUP_ID
    two:
      bootstrap-servers: IP:PORT
      consumer:
        group-id: YOUR_GROUP_ID
复制代码
  • 然后是第一个Kafka配置类
@Configuration
public class KafkaOneConfig {

    @Value("${spring.kafka.one.bootstrap-servers}")
    private String bootstrapServers;
    @Value("${spring.kafka.one.consumer.group-id}")
    private String groupId;

    @Bean
    public KafkaTemplate<String, String> kafkaOneTemplate() {
        return new KafkaTemplate<>(producerOneFactory());
    }

    @Bean
    public KafkaListenerContainerFactory<? extends MessageListenerContainer> kafkaOneContainerFactory() {
        ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
        factory.setConsumerFactory(consumerOneFactory());
        return factory;
    }

    @Bean
    public ProducerFactory<String, String> producerOneFactory() {
        return new DefaultKafkaProducerFactory<>(producerConfigs());
    }

    @Bean
    public ConsumerFactory<String, String> consumerOneFactory() {
        return new DefaultKafkaConsumerFactory<>(consumerConfigs());
    }

    private Map<String, Object> producerConfigs() {
        Map<String, Object> props = new HashMap<>();
        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
        return props;
    }

    private Map<String, Object> consumerConfigs() {
        Map<String, Object> props = new HashMap<>();
        props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
        props.put(ConsumerConfig.GROUP_ID_CONFIG, groupId);
        return props;
    }
}
复制代码
  • 接着是第二个Kafka配置类
@Configuration
public class KafkaTwoConfig {

    @Value("${spring.kafka.two.bootstrap-servers}")
    private String bootstrapServers;
    @Value("${spring.kafka.two.consumer.group-id}")
    private String groupId;

    @Bean
    public KafkaTemplate<String, String> kafkaTwoTemplate() {
        return new KafkaTemplate<>(producerTwoFactory());
    }

    @Bean
    public KafkaListenerContainerFactory<? extends MessageListenerContainer> kafkaTwoContainerFactory() {
        ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
        factory.setConsumerFactory(consumerTwoFactory());
        return factory;
    }

    @Bean
    public ProducerFactory<String, String> producerTwoFactory() {
        return new DefaultKafkaProducerFactory<>(producerConfigs());
    }

    @Bean
    public ConsumerFactory<String, String> consumerTwoFactory() {
        return new DefaultKafkaConsumerFactory<>(consumerConfigs());
    }

    private Map<String, Object> producerConfigs() {
        Map<String, Object> props = new HashMap<>();
        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
        return props;
    }

    private Map<String, Object> consumerConfigs() {
        Map<String, Object> props = new HashMap<>();
        props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
        props.put(ConsumerConfig.GROUP_ID_CONFIG, groupId);
        return props;
    }
}
复制代码
  • 最后是收发消息
@Slf4j
@Component
public class Kafka {

    @Autowired
    @Qualifier("kafkaOneTemplate")
    private KafkaTemplate kafkaOneTemplate;
    
    @Autowired
    @Qualifier("kafkaTwoTemplate")
    p
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值