Java 春季卡夫卡:按顺序阅读两个不同的主题
Spring Kafka有可能以保证的顺序阅读不同消费者的两个不同主题吗?例如,主题A存储与确定如何处理存储在主题B中的数据相关的信息。主题A被读入内存并被引用,但在从主题B读入数据之前需要完全填充。下面是我当前设置的示例Java 春季卡夫卡:按顺序阅读两个不同的主题,java,apache-kafka,spring-kafka,Java,Apache Kafka,Spring Kafka,Spring Kafka有可能以保证的顺序阅读不同消费者的两个不同主题吗?例如,主题A存储与确定如何处理存储在主题B中的数据相关的信息。主题A被读入内存并被引用,但在从主题B读入数据之前需要完全填充。下面是我当前设置的示例 @Service public class TopicA { @KafkaListener(topics = "topicA") public void consume(ConsumerRecord<String, byte[]> record) {
@Service
public class TopicA {
@KafkaListener(topics = "topicA")
public void consume(ConsumerRecord<String, byte[]> record) {
// ... some code here to populate an in-memory data structure
}
}
@服务
公共类话题{
@卡夫卡列斯汀(topics=“topicA”)
公共无效消费(消费者记录记录){
//…此处的一些代码用于填充内存中的数据结构
}
}
@服务
公共类主题{
@卡夫卡列斯汀(topics=“topicB”)
公共无效消费(消费者记录记录){
//…此处的一些代码取决于主题A,它们填充了内存中的数据结构
}
}
到目前为止,我一直倾向于创建一个Spring启动过程(使用@PostConstruct),该过程通过首先阅读主题a来初始化数据结构,但一直未能实现。有人有什么建议吗?提前谢谢
@KafkaListener(id = "bConsumer" topics = "topicB", autoStartup = "false")
然后自动连接
KafkaListenerEndpointRegistry
bean和registry.getListenerContainer(“bConsumer”).start()代码>当您准备好时。听起来您应该将主题A设置为一个KTable,并且您希望将数据连接到该KTable上,并且BSoKafkaListenerEndpointRegistry
将自动连接到topicA
类中,并且只有在完全填充数据结构后才会启动主题B使用者?你有什么建议让我知道卡夫卡的主题已经被完全阅读了吗?我总是从一开始就使用ConsumerSekCallback.seekToBegining()
进行读取。您可以设置容器的idleEventInterval
,并在间隔过去而未收到任何新记录时使用ListenerContainerIdleEvent
。您可以通过实现ApplicationListener
或添加@EventListener
方法来使用事件。见和。
@KafkaListener(id = "bConsumer" topics = "topicB", autoStartup = "false")