Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Spring Kafka中销毁消息侦听器的对象?_Java_Spring_Spring Boot_Apache Kafka_Spring Kafka - Fatal编程技术网

Java 如何在Spring Kafka中销毁消息侦听器的对象?

Java 如何在Spring Kafka中销毁消息侦听器的对象?,java,spring,spring-boot,apache-kafka,spring-kafka,Java,Spring,Spring Boot,Apache Kafka,Spring Kafka,我一直在关注这个 我有一个API,因此每当调用API时,都会使用新的消息侦听器创建一个新的容器。侦听器将获取某些偏移量的消息,然后将暂停。在那之后,我就不需要了。但是当API被多次点击时,会创建很多对象。我想销毁无用的东西 我在想,当一个听众空闲了一段时间,我就可以毁掉它 我该怎么做 提前谢谢 代码 公共类侦听器扩展AbstractConsumerSekAware实现ConsumerAwareMessageListener{ @凌驾 消息上的公共无效(ConsumerRecord Consum

我一直在关注这个

我有一个API,因此每当调用API时,都会使用新的消息侦听器创建一个新的容器。侦听器将获取某些偏移量的消息,然后将暂停。在那之后,我就不需要了。但是当API被多次点击时,会创建很多对象。我想销毁无用的东西

我在想,当一个听众空闲了一段时间,我就可以毁掉它

我该怎么做

提前谢谢

代码

公共类侦听器扩展AbstractConsumerSekAware实现ConsumerAwareMessageListener{
@凌驾
消息上的公共无效(ConsumerRecord ConsumerRecord,Consumer Consumer){
//如果收到某个偏移量,则暂停
}
}
这是集装箱

public KafkaMessageListenerContainer<String, String> getContainer(String topic, int partition, long offset) {
        ContainerProperties containerProperties = new ContainerProperties(new TopicPartitionOffset(topic, partition, offset));
        ConsumerFactory<String, String> consumerFactory = new DefaultKafkaConsumerFactory<>(consumerProperties());
        KafkaMessageListenerContainer<String, String> kafkaMessageListenerContainer = new KafkaMessageListenerContainer<>(consumerFactory, containerProperties);
        kafkaMessageListenerContainer.getContainerProperties().setGroupId(UUID.randomUUID().toString());
        kafkaMessageListenerContainer.setAutoStartup(false);
        kafkaMessageListenerContainer.getContainerProperties().setMessageListener(new Listener());
        return kafkaMessageListenerContainer;
}

private Map<String, Object> consumerProperties(){
        Map<String, Object> props = new HashMap<>();
        props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"));
        props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        return props;
    }

公共KafkaMessageListenerContainer getContainer(字符串主题、int分区、长偏移量){
ContainerProperties ContainerProperties=新的ContainerProperty(新的TopicPartitionOffset(主题、分区、偏移));
ConsumerFactory ConsumerFactory=新的默认KafkanConsumerFactory(consumerProperties());

KafkaMessageListenerContainer KafkaMessageListenerContainer=新的KafkaMessageListenerContainer(消费者工厂、集装箱房地产); kafkaMessageListenerContainer.getContainerProperties().setGroupId(UUID.randomUUID().toString()); kafkaMessageListenerContainer.setAutoStartup(false); KafkCamessageListenerContainer.getContainerProperties().setMessageListener(新侦听器()); 返回KafkamessageliesStenerContainer; } 私有映射consumerProperties(){ Map props=newhashmap(); put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,“localhost:9092”); put(ConsumerConfig.KEY\u反序列化程序\u类\u配置,StringDeserializer.CLASS); put(ConsumerConfig.VALUE\u反序列化程序\u类\u配置,StringDeserializer.CLASS); 返回道具; }
创建这样的容器将禁用许多功能(例如事件发布)

最好使用Boot的自动配置
ConcurrentKafkAlisterContainerFactory
来创建容器

/**
*创建和配置没有侦听器的容器;用于创建
*不用于KafkaListener注释。使用此方法创建的容器
*未添加到侦听器端点注册表。
*@param topicPartitions要分配的topicPartitions。
*@归还容器。
*@自2.3
*/
C createContainer(TopicPartitionOffset…topicPartitions);

当您不再需要容器时,只需调用
container.stop()

KafCamessageListenerContainer即可实现。我不建议像这样手动创建容器-请参见我的答案。@ChinHuang,这也会破坏容器对象。您好,Gary,我应该如何将“KafCamessageListenerContainer”替换为“ConcurrentKafkaListenerContainerFactory“,你能给我一个示例代码吗?请看我对的回答。我已将我的代码更改为你在链接中提到的任何代码。很好用。我不确定@EventListener。我怎么知道它在工作呢?如果你有其他停止容器的标准,你不需要它;这个问题是关于如何动态创建一个容器,并在没有更多记录可读取时停止它。要使其工作,您需要配置
idleEventInterval
,如答案所示。
public KafkaMessageListenerContainer<String, String> getContainer(String topic, int partition, long offset) {
        ContainerProperties containerProperties = new ContainerProperties(new TopicPartitionOffset(topic, partition, offset));
        ConsumerFactory<String, String> consumerFactory = new DefaultKafkaConsumerFactory<>(consumerProperties());
        KafkaMessageListenerContainer<String, String> kafkaMessageListenerContainer = new KafkaMessageListenerContainer<>(consumerFactory, containerProperties);
        kafkaMessageListenerContainer.getContainerProperties().setGroupId(UUID.randomUUID().toString());
        kafkaMessageListenerContainer.setAutoStartup(false);
        kafkaMessageListenerContainer.getContainerProperties().setMessageListener(new Listener());
        return kafkaMessageListenerContainer;
}

private Map<String, Object> consumerProperties(){
        Map<String, Object> props = new HashMap<>();
        props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"));
        props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        return props;
    }