【发布时间】:2020-10-08 12:44:15
【问题描述】:
我有一个小问题,那就是我必须使用 kafka 作为通知系统来启动我的应用程序的流程,一切都很好,但我想知道是否可以在有未读消息时更改顺序在队列中。
让我解释一下:当主题中有两条或更多条消息,并且消费者阅读它们时,首先阅读,最后一个进入,我希望它首先阅读,第一个进入。
所以我想知道这是否可行,如果可行,我们必须为此做出改变。
我正在使用最新版本的 Spring Apache 和 Kafka 2.5.0
消费者配置:
@EnableKafka
@Configuration
public class KafkaConsumerConfig {
private static final String BOOTSTRAP_ADDRESS = "";
@Bean
public ConsumerFactory<String, String> consumerFactory() {
Map<String, Object> props = new HashMap<>();
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, BOOTSTRAP_ADDRESS);
props.put(ConsumerConfig.GROUP_ID_CONFIG, "id");
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
return new DefaultKafkaConsumerFactory<>(props);
}
@Bean
public ConcurrentKafkaListenerContainerFactory<String, String> kafkaListenerContainerFactory() {
ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
factory.setConsumerFactory(consumerFactory());
return factory;
}
}
Kafka消费者:
@Component
public class KafkaConsumer {
@KafkaListener(topics = "Great_Topic")
private void listen(String msg) {
System.out.println("I've received: " + msg);
}
}
例子:
在我的生产者中,我按此顺序发送了以下消息:
- Hello World 1
- 你好世界 2
消费者的输出:
- 你好世界 2
- Hello World 1
我希望输出与输入具有相同的顺序。
【问题讨论】:
-
这是不可能的。
-
哇,我希望它可以,我觉得很奇怪,看起来如此简单的事情在 kafka 中却无法完成。 @sonus21
-
有些系统是针对特定用例设计的,队列是为了使用堆栈。
-
在您引用的示例中,您是观察到行为,还是期望行为?
-
示例是观察到的行为@RobinMoffatt
标签: java spring apache-kafka