Java 如何在Spring Kafka中销毁消息侦听器的对象?
我一直在关注这个 我有一个API,因此每当调用API时,都会使用新的消息侦听器创建一个新的容器。侦听器将获取某些偏移量的消息,然后将暂停。在那之后,我就不需要了。但是当API被多次点击时,会创建很多对象。我想销毁无用的东西 我在想,当一个听众空闲了一段时间,我就可以毁掉它 我该怎么做 提前谢谢 代码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
公共类侦听器扩展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;
}