|
1 | 1 | /*
|
2 |
| - * Copyright 2014-2020 the original author or authors. |
| 2 | + * Copyright 2014-2021 the original author or authors. |
3 | 3 | *
|
4 | 4 | * Licensed under the Apache License, Version 2.0 (the "License");
|
5 | 5 | * you may not use this file except in compliance with the License.
|
@@ -449,31 +449,75 @@ protected void processListener(MethodKafkaListenerEndpoint<?, ?> endpoint, Kafka
|
449 | 449 | resolveKafkaProperties(endpoint, kafkaListener.properties());
|
450 | 450 | endpoint.setSplitIterables(kafkaListener.splitIterables());
|
451 | 451 |
|
452 |
| - KafkaListenerContainerFactory<?> factory = null; |
453 |
| - String containerFactoryBeanName = resolve(kafkaListener.containerFactory()); |
454 |
| - if (StringUtils.hasText(containerFactoryBeanName)) { |
455 |
| - Assert.state(this.beanFactory != null, "BeanFactory must be set to obtain container factory by bean name"); |
456 |
| - try { |
457 |
| - factory = this.beanFactory.getBean(containerFactoryBeanName, KafkaListenerContainerFactory.class); |
458 |
| - } |
459 |
| - catch (NoSuchBeanDefinitionException ex) { |
460 |
| - throw new BeanInitializationException("Could not register Kafka listener endpoint on [" + adminTarget |
461 |
| - + "] for bean " + beanName + ", no " + KafkaListenerContainerFactory.class.getSimpleName() |
462 |
| - + " with id '" + containerFactoryBeanName + "' was found in the application context", ex); |
463 |
| - } |
| 452 | + String containerFactory = resolve(kafkaListener.containerFactory()); |
| 453 | + if (StringUtils.hasText(containerFactory)) { |
| 454 | + this.registrar.registerEndpoint(endpoint, resolveContainerFactory(kafkaListener, containerFactory, beanName)); |
| 455 | + } |
| 456 | + else { |
| 457 | + this.registrar.registerEndpoint(endpoint); |
464 | 458 | }
|
465 | 459 |
|
466 | 460 | endpoint.setBeanFactory(this.beanFactory);
|
467 | 461 | String errorHandlerBeanName = resolveExpressionAsString(kafkaListener.errorHandler(), "errorHandler");
|
468 | 462 | if (StringUtils.hasText(errorHandlerBeanName)) {
|
469 |
| - endpoint.setErrorHandler(this.beanFactory.getBean(errorHandlerBeanName, KafkaListenerErrorHandler.class)); |
| 463 | + resolveErrorHandler(endpoint, kafkaListener); |
470 | 464 | }
|
471 |
| - this.registrar.registerEndpoint(endpoint, factory); |
472 | 465 | if (StringUtils.hasText(beanRef)) {
|
473 | 466 | this.listenerScope.removeListener(beanRef);
|
474 | 467 | }
|
475 | 468 | }
|
476 | 469 |
|
| 470 | + private void resolveErrorHandler(MethodKafkaListenerEndpoint<?, ?> endpoint, KafkaListener KafkaListener) { |
| 471 | + Object errorHandler = resolveExpression(KafkaListener.errorHandler()); |
| 472 | + if (errorHandler instanceof KafkaListenerErrorHandler) { |
| 473 | + endpoint.setErrorHandler((KafkaListenerErrorHandler) errorHandler); |
| 474 | + } |
| 475 | + else { |
| 476 | + String errorHandlerBeanName = resolveExpressionAsString(KafkaListener.errorHandler(), "errorHandler"); |
| 477 | + if (StringUtils.hasText(errorHandlerBeanName)) { |
| 478 | + endpoint.setErrorHandler( |
| 479 | + this.beanFactory.getBean(errorHandlerBeanName, KafkaListenerErrorHandler.class)); |
| 480 | + } |
| 481 | + } |
| 482 | + } |
| 483 | + |
| 484 | + @Nullable |
| 485 | + private KafkaListenerContainerFactory<?> resolveContainerFactory(KafkaListener KafkaListener, |
| 486 | + Object factoryTarget, String beanName) { |
| 487 | + |
| 488 | + KafkaListenerContainerFactory<?> factory = null; |
| 489 | + Object resolved = resolveExpression(KafkaListener.containerFactory()); |
| 490 | + if (resolved instanceof KafkaListenerContainerFactory) { |
| 491 | + return (KafkaListenerContainerFactory<?>) resolved; |
| 492 | + } |
| 493 | + String containerFactoryBeanName = resolveExpressionAsString(KafkaListener.containerFactory(), |
| 494 | + "containerFactory"); |
| 495 | + if (StringUtils.hasText(containerFactoryBeanName)) { |
| 496 | + assertBeanFactory(); |
| 497 | + try { |
| 498 | + factory = this.beanFactory.getBean(containerFactoryBeanName, KafkaListenerContainerFactory.class); |
| 499 | + } |
| 500 | + catch (NoSuchBeanDefinitionException ex) { |
| 501 | + throw new BeanInitializationException( |
| 502 | + noBeanFoundMessage(factoryTarget, beanName, containerFactoryBeanName, |
| 503 | + KafkaListenerContainerFactory.class), ex); |
| 504 | + } |
| 505 | + } |
| 506 | + return factory; |
| 507 | + } |
| 508 | + |
| 509 | + protected void assertBeanFactory() { |
| 510 | + Assert.state(this.beanFactory != null, "BeanFactory must be set to obtain container factory by bean name"); |
| 511 | + } |
| 512 | + |
| 513 | + protected String noBeanFoundMessage(Object target, String listenerBeanName, String requestedBeanName, |
| 514 | + Class<?> expectedClass) { |
| 515 | + |
| 516 | + return "Could not register Kafka listener endpoint on [" |
| 517 | + + target + "] for bean " + listenerBeanName + ", no '" + expectedClass.getSimpleName() + "' with id '" |
| 518 | + + requestedBeanName + "' was found in the application context"; |
| 519 | + } |
| 520 | + |
477 | 521 | private void resolveKafkaProperties(MethodKafkaListenerEndpoint<?, ?> endpoint, String[] propertyStrings) {
|
478 | 522 | if (propertyStrings.length > 0) {
|
479 | 523 | Properties properties = new Properties();
|
|
0 commit comments