1.设置监听器禁止自启动
KafkaListenerContainerFactory<ConcurrentMessageListenerContainer<String, String>> kafkaListenerContainerFactory(
ConsumerFactory<String, String> consumerFactory, KafkaInstanceProperties instanceProperties) {
ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
factory.setConsumerFactory(consumerFactory);
factory.setBatchListener(true);
factory.setAutoStartup(false);
...
return factory;
}
2.设置消费者的factory
@KafkaListener(id = KafkaListenerUtil.LISTENERTONGYONG,
topics = {"${kafka.topic}",containerFactory = "kafkaListenerContainerFactory")
public void processMessage(List<ConsumerRecord<?, ?> > consumerRecords) {
for (ConsumerRecord<?, ?> consumerRecord : consumerRecords) {
log.info("consumerRecord .value());
}
}
3.在Application启动后根据配置启动消费者
@Component
public class ApplicationRunner implements org.springframework.boot.ApplicationRunner {
Logger logger = LoggerFactory.getLogger(ApplicationRunner.class);
@Autowired
KafkaListenerUtil kafkaListenerUtil;
@Override
public void run(ApplicationArguments args) {
try {
logger.info("项目启动,开始动态启动kafka消费者");
kafkaListenerUtil.startUp();
}catch (Exception e){
logger.error("启动kafka消费者失败,异常信息:{}",e);
}
}
4.KafkaListenerUtil
@Component
public class KafkaListenerUtil {
public static final Logger log = LoggerFactory.getLogger(KafkaListenerUtil.class);
@Value("${kafka.method:all}")
private String kafkaMethod;
@Autowired
private KafkaListenerEndpointRegistry registry;
public static final String LISTENERTONGYONG = "tongyong";
public static final String LISTENEREVENT = "event";
public static final String LISTENERALL = "all";
public void startUp() {
log.info("KafkaMethod:{}"+kafkaMethod);
switch (kafkaMethod){
case LISTENERTONGYONG:
startUpListener(LISTENERTONGYONG);
break;
case LISTENEREVENT:
startUpListener(LISTENEREVENT);
break;
case LISTENERALL:
startUpListener(LISTENERTONGYONG);
startUpListener(LISTENEREVENT);
break;
}
}
public void startUpListener(String listenerId){
log.info("kafkalistener-{} start...",listenerId);
if (!registry.getListenerContainer(listenerId).isRunning()){
registry.getListenerContainer(listenerId).start();
}
}
}