那时的我
真的存在这样的需求么?
真的存在这样的需求么?
真的存在这样的需求么?
Unbelievable!难以置信.jpg
在我还没有遇到这个需求之前我可能会说,怎么可能会有这样的需求嘛?
以至于我能够列出许多原因:
- 技术选型肯定要先做好啊,
Kafka
和RabbitMQ
一起用算怎么回事呢 - 这俩都有
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