Правильный способ создания KafkaTemplate в весенней загрузке - PullRequest
2 голосов
/ 21 марта 2019

Я пытаюсь настроить apache kafka в весенней загрузке приложения.Я читаю эту документацию и выполняю шаги:

1) Я добавляю эти строки в aplication.yaml:

spring:
  kafka:
    bootstrap-servers: kafka_host:9092
    producer:
      key-serializer: org.apache.kafka.common.serialization.StringDeserializer
      value-serializer: org.apache.kafka.common.serialization.ByteArraySerializer

2) Я создаю новую тему:

    @Bean
    public NewTopic responseTopic() {
        return new NewTopic("new-topic", 5, (short) 1);
    }

А теперь я хочу использовать KafkaTemplate:

private final KafkaTemplate<String, byte[]> kafkaTemplate;

public KafkaEventBus(KafkaTemplate<String, byte[]> kafkaTemplate) {
    this.kafkaTemplate = kafkaTemplate;
}

Но Intellij IDE выделяет:

enter image description here

Чтобы это исправить, мне нужно создать bean:

@Bean
public KafkaTemplate<String, byte[]> myMessageKafkaTemplate() {
    return new KafkaTemplate<>(greetingProducerFactory());
}

и передать свойства конструктора greetingProducerFactory():

@Bean
public ProducerFactory<String, byte[]> greetingProducerFactory() {
    Map<String, Object> configProps = new HashMap<>();
    configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "kafka_hist4:9092");
    configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
    configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, ByteArraySerializer.class);
    return new DefaultKafkaProducerFactory<>(configProps);
}

Но тогда какой смысл устанавливать в application.yam l, если мне нужно создать руководство ProducerFactory?

Ответы [ 2 ]

2 голосов
/ 21 марта 2019

Я думаю, вы можете спокойно игнорировать предупреждение IDEA;У меня нет проблем с подключением в шаблоне Boot различных универсальных типов ...

@SpringBootApplication
public class So55280173Application {

    public static void main(String[] args) {
        SpringApplication.run(So55280173Application.class, args);
    }

    @Bean
    public ApplicationRunner runner(KafkaTemplate<String, String> template, Foo foo) {
        return args -> {
            template.send("so55280173", "foo");
            if (foo.template == template) {
                System.out.println("they are the same");
            }
        };
    }

    @Bean
    public NewTopic topic() {
        return new NewTopic("so55280173", 1, (short) 1);
    }

}

@Component
class Foo {

    final KafkaTemplate<String, String> template;

    @Autowired
    Foo(KafkaTemplate<String, String> template) {
        this.template = template;
    }

}

и

they are the same
0 голосов
/ 21 марта 2019

По умолчанию KafkaTemplate<Object, Object> создается Spring Boot в KafkaAutoConfiguration класс .Поскольку Spring учитывает информацию общего типа во время внедрения зависимости, bean-компонент по умолчанию не может быть автоматически подключен к KafkaTemplate<String, byte[]>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...