![](/img/trans.png)
[英]Unable to deque messages from Topic after the listener listens the messages in spring jms
[英]Can a single Spring's KafkaConsumer listener listens to multiple messages from same/one partition?
提供了具有n個分區的主題。 Spring的KafkaConsumer偵聽器是否可以通過一種方式一次偵聽來自相同/一個分區的多個消息?
我通過設置setBatchListener(true);
嘗試了ConcurrentKafkaListenerContainerFactory
setBatchListener(true);
但是使用者已經開始使用來自不同分區的多個消息,而不是一個。
public class BatchReceiverConfig {
@Value("${kafka.bootstrap-servers}")
private String bootstrapServers;
@Bean
public Map<String, Object> consumerConfigs() {
Map<String, Object> props = new HashMap<>();
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
props.put(ConsumerConfig.GROUP_ID_CONFIG, "batch4");
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
// maximum records per batch receive
props.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, "10");
return props;
}
@Bean
public ConsumerFactory<String, String> consumerFactory() {
return new DefaultKafkaConsumerFactory<>(consumerConfigs());
}
@Bean
public ConcurrentKafkaListenerContainerFactory<String, String> kafkaListenerContainerFactory() {
ConcurrentKafkaListenerContainerFactory<String, String> factory =
new ConcurrentKafkaListenerContainerFactory<>();
factory.setConsumerFactory(consumerFactory());
factory.setConcurrency(2);
// enable batch listeners
// factory.setBatchListener(true);
return factory;
}
@Bean
public BatchReceiver receiver() {
return new BatchReceiver();
}
}
/* Listener */
@KafkaListener(id = "batch-listener", topics = TOPIC_TEST_BATCH)
public void receive(List<String> data,
@Header(KafkaHeaders.RECEIVED_PARTITION_ID) List<Integer> partitions,
@Header(KafkaHeaders.OFFSET) List<Long> offsets) {
LOGGER.info("start of batch receive");
for (int i = 0; i < data.size(); i++) {
LOGGER.info("received message='{}' with partition-offset='{}'", data.get(i),
partitions.get(i) + "-" + offsets.get(i));
// handle message
latch.countDown();
}
LOGGER.info("end of batch receive");
}
假設組中只有一個使用者,則可以將該ConcurrentKafkaListener
concurrencyLevel
設置為n
。
如果您使用群組管理,Kafka將為您的使用者分配分區。 每個使用者(或使用並發時的線程)將獲得0、1或更多分區,具體取決於有多少使用者和分區。
如果您希望特定用戶僅從一個分區獲取消息,則必須自己分配分區,而不是讓Kafka進行分配。
如果使用並發容器; 您必須分配與並發相同數量的分區,因此每個線程僅獲得一個分區。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.