Java 如何基于启动标志启动@KafkaListener

Java 如何基于启动标志启动@KafkaListener,java,apache-kafka,Java,Apache Kafka,只有当标志设置为true时,我才尝试启动我的卡夫卡列斯汀 @Component public class KafkaTopicConsumer { //Somehow wrap the listener to only start when a property value is set to true @KafkaListener(topics = "#{@consumerTopic}", groupId = "#{@groupName}") public void consumeMess

只有当标志设置为true时,我才尝试启动我的卡夫卡列斯汀

@Component
public class KafkaTopicConsumer {

//Somehow wrap the listener to only start when a property value is set to true

@KafkaListener(topics = "#{@consumerTopic}", groupId = "#{@groupName}")
public void consumeMessage(ConsumerRecord<String, String> message) throws IOException {
    logger.info("Consumed message from topic: {} with message: {}", message.topic(), message);
}

是否有一种方法只能确保在所说的属性(如start.consumer属性)设置为true时启动侦听器?我不希望每次启动应用程序时侦听器都只在我指定要启动它时启动。有没有一个好方法来处理这个用例?

您可以将ConditionalBeans与属性一起使用

@Bean
@ConditionalOnProperty(
  value="my.custom.flag", 
  havingValue = "true")
public KafkaListener kafkaListener{
 .....
}
条件bean允许您基于属性或自定义条件启动bean。

您可以将ConditionalBeans与属性一起使用

@Bean
@ConditionalOnProperty(
  value="my.custom.flag", 
  havingValue = "true")
public KafkaListener kafkaListener{
 .....
}
条件bean允许您基于属性或自定义条件启动bean。

首先,需要将AutoStart设置为false,并为容器命名。然后需要使用@EventListener根据标志手动启动它

@组成部分 公共类卡夫卡通片{ @自动连线 私有KafkaListenerEndpointRegistry KafkaListenerEndpointRegistry; @值${start.consumer} 私有布尔应该启动; @KafkaListenerid=myListener,AutoStart=false,topics={@consumerTopic},groupId={@groupName} public void consumermessageconsumerrecord消息引发IOException{ logger.infoconsumered message from topic:{},message:{},message.topic,message; } @事件监听器 启动应用程序启动事件时公共无效{ 如果应该开始{ MessageListenerContainer listenerContainer=kafkaListenerEndpointRegistry.getListenerContainermyListener; listenerContainer.start; } } } 注意:@EventListener将确保容器已正确加载,如果使用@PostConstruct,它可能无法工作

编辑:

使用@Value注释添加了属性的实际读数

注意:这种方法增加了灵活性,允许使用JMX动态调用start和stop方法,例如只做一些更改。这有助于我们在不重新启动应用程序的情况下禁用使用者并在以后启用它

另一个很好的方法,如中正确说明的,是使用@ConditionalOnProperty。请注意,在您的示例中,您可以将它与@Component一起使用,而不是手动定义@Bean

@组成部分 @条件不动产 value=start.consumer, havingValue=true 公共类KafkaTopicConsumer{/。。。 这一切都取决于您需要的灵活性。

首先,您需要将AutoStart设置为false,并为您的容器指定一个名称。然后您需要使用@EventListener根据标记手动启动它

@组成部分 公共类卡夫卡通片{ @自动连线 私有KafkaListenerEndpointRegistry KafkaListenerEndpointRegistry; @值${start.consumer} 私有布尔应该启动; @KafkaListenerid=myListener,AutoStart=false,topics={@consumerTopic},groupId={@groupName} public void consumermessageconsumerrecord消息引发IOException{ logger.infoconsumered message from topic:{},message:{},message.topic,message; } @事件监听器 启动应用程序启动事件时公共无效{ 如果应该开始{ MessageListenerContainer listenerContainer=kafkaListenerEndpointRegistry.getListenerContainermyListener; listenerContainer.start; } } } 注意:@EventListener将确保容器已正确加载,如果使用@PostConstruct,它可能无法工作

编辑:

使用@Value注释添加了属性的实际读数

注意:这种方法增加了灵活性,允许使用JMX动态调用start和stop方法,例如,只需进行一些更改。这有助于在不重新启动应用程序的情况下禁用使用者并在以后启用它

另一个很好的方法,如中所述,是使用@ConditionalOnProperty。请注意,在您的示例中,您可以将它与@Component一起使用,而不是手动定义@Bean

@组成部分 @条件不动产 value=start.consumer, havingValue=true 公共类KafkaTopicConsumer{/。。。
这一切都取决于您所需的灵活性。

太棒了,谢谢!一旦我能够运行和测试此功能,我一定会返回,看看是否需要更多信息,并将其标记为答案!我认为这是最好的方法。太棒了,谢谢!一旦我能够运行和测试此功能,我一定会返回,看看是否需要d更多信息并将其标记为答案!在我看来,这是最好的方法。太棒了,谢谢!一旦我能够运行和测试这个,我一定会回圈,看看我是否需要更多信息并将其标记为答案!太棒了,谢谢!一旦我能够运行和测试这个,我一定回圈,看看我是否需要更多信息并将其标记为answe R