Spring Boot не может найти компонент EmbeddedKafkaBroker (без использования SpringbootTest) - PullRequest
0 голосов
/ 16 января 2020

Я хотел использовать встроенный Kafka для загрузочного приложения Spring. Я могу использовать встроенный Kafka для тестирования Junit, но при попытке использовать его в основном приложении встроенный объект Kafka не идентифицируется.

При попытке загрузить загрузочное приложение Spring встроенный объект kafka не подключается автоматически. Это не для потока тестирования.

@SpringBootApplication
@DirtiesContext
@EmbeddedKafka(topics = "TEST_TOPIC.P2.R2", partitions = 1, controlledShutdown = false, brokerProperties = {
        "listeners=PLAINTEXT://localhost:9092", "port=9092" })
public class MockKafkaProducerApplication {

    public static void main(String[] args) throws Exception {
        System.out.println("Starting Spring boot Application");
        SpringApplication.run(MockKafkaProducerApplication.class, args);

    }

}


@ActiveProfiles("kafka_test")
@Configuration
public class KafkaConsumerTestBase {
    private Logger LOGGER = LoggerFactory.getLogger(KafkaConsumerTestBase.class);

    @Autowired
    protected EmbeddedKafkaBroker embeddedKafka;


    @Value("${spring.embedded.kafka.brokers}")
    private String brokerAddress;

    @Autowired
    protected KafkaListenerEndpointRegistry kafkaListenerEndpointRegistry;

    @Autowired
    protected KafkaTemplate<String, String> senderTemplate;

....... ........}

Поле embeddedKafka в com.dell.pde. kafka.KafkaConsumerTestBase требуется компонент типа 'org.springframework.kafka.test.EmbeddedKafkaBroker', который не может быть найден.

Точка внедрения имеет следующие аннотации: - @ org.springframework.beans.factory.annotation .Autowired (обязательно = true)

Ответы [ 2 ]

2 голосов
/ 16 января 2020

Встроенный Kafka предназначен для тестирования, а не для реальных приложений.

Аннотация, которая может быть указана в классе тестирования, который запускает тесты на основе Spring Kafka. Предоставляет следующие функции сверх обычной Spring TestContext Framework:

...

Библиотека, которая предоставляет экземпляр Kafka в памяти для выполнения ваших тестов.

Если вы хотите создать настоящее приложение-макет, вам также придется запустить настоящий экземпляр Kafka.

1 голос
/ 16 января 2020

@ interface EmbeddedKafka для тестирования. Если вы проверите public class EmbeddedKafkaCondition, вы увидите, как его запускает весенний тест:

public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext context) {
    Optional<AnnotatedElement> element = context.getElement();
    if (element.isPresent() && !this.springTestContext((AnnotatedElement)element.get())) {
        EmbeddedKafka embedded = (EmbeddedKafka)AnnotatedElementUtils.findMergedAnnotation((AnnotatedElement)element.get(), EmbeddedKafka.class);
        if (embedded != null) {
            EmbeddedKafkaBroker broker = this.getBrokerFromStore(context);
            if (broker == null) {
                broker = this.createBroker(embedded);
                BROKERS.set(broker);
                this.getStore(context).put("embedded-kafka", broker);
            }
        }
    }

    return ConditionEvaluationResult.enabled("");
}

private boolean springTestContext(AnnotatedElement annotatedElement) {
    return AnnotatedElementUtils.findAllMergedAnnotations(annotatedElement, ExtendWith.class).stream().filter((extended) -> {
        return Arrays.asList(extended.value()).contains(SpringExtension.class);
    }).findFirst().isPresent();
}

Попробуйте перезаписать этот класс, чтобы запустить его в вашем приложении.

Я предлагаю вам использовать docker чтобы поднять изображение кафки напрямую .

...