SpringBoot Kafka: Metode kacang 'kafkaTemplate' di 'KafkaAutoConfiguration' tidak dimuat

Saya menggunakan springboot dan mencoba menulis KafkaProducer untuk memasukkan pesan dalam antrian Kafka. Saya telah membuat metode ini di kelas @Configuration.

@Bean
public KafkaTemplate<String, String> kafkaTemplate(){
    return new KafkaTemplate<>(producerFactory());
}

@Bean
public ProducerFactory<String, String> producerFactory() {
    Map<String, Object> configProps = new HashMap<>();
    configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapAddress); //bootstrapAddress holds address of kafka server
    configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
    configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
    return new DefaultKafkaProducerFactory<>(configProps);
}

Dan saya telah melakukan Autowired kacang KafkaTemplate ini di kelas KafkaMessageProducer saya yang menangani penanganan fungsi kirim KafkaTemplate.

@Autowired
KafkaTemplate<String, String> kafkaTemplate;

Tapi saya menghadapi kesalahan ini ketika saya mencoba mengkompilasi kode saya

Field kafkaTemplate in <pathoffile>.KafkaMessageProducer required a bean of type 'org.springframework.kafka.core.KafkaTemplate' that could not be found.
    - Bean method 'kafkaTemplate' in 'KafkaAutoConfiguration' not loaded because @ConditionalOnMissingBean (types: org.springframework.kafka.core.KafkaTemplate; SearchStrategy: all) found bean 'avroKafkaTemplate'
Action:Consider revisiting the conditions above or defining a bean of type 'org.springframework.kafka.core.KafkaTemplate' in your configuration.

Selain itu, jika saya mencoba mengecualikan KafkaAutoConfiguration di proyek Spring saya, saya mendapatkan kesalahan seperti Bean tidak dapat dimuat karena KafkaAutoConfiguration dinonaktifkan'. Adakah yang tahu mengapa saya mendapatkan kesalahan Bean ini dan apa solusinya?

EDIT: - Saya menemukan kacang berikut dalam file jar yang digunakan oleh proyek saya

@Bean
@Conditional({EnableQueueCondition.class})
public KafkaTemplate<String, String> kafkaTemplate() {
    KafkaTemplate<String, String> kafkaTemplate = new KafkaTemplate(this.producerFactory());
    kafkaTemplate.setProducerListener(new ProducerListenerImpl());
    return kafkaTemplate;
}

Jadi, dari sinilah kesalahan itu berasal, tapi saya tidak tahu bagaimana cara memberitahu pegas untuk tidak melihat kacang ini, dan menggunakan kacang yang saya tentukan. Saya telah mencoba menggunakan anotasi Utama dan Kualifikasi pada kacang, masih memberikan kesalahan yang sama. Apakah ada kemungkinan kacang yang saya tentukan tidak dibuat atau ditemukan, dan KafkaAutoConfiguration kemudian mencari kacang default yang ditimpa oleh kacang avroKafkaTemplate? Apa solusi untuk masalah ini?


person Vishal Rastogi    schedule 09.09.2020    source sumber


Jawaban (2)


Dari stacktrace, ada KafkaTemplate bean - avroKafkaTemplate lainnya. Jadi saya kira ada konfigurasi lain, menduplikasi definisi KafkaTemplate.

person Mikalai Lushchytski    schedule 09.09.2020
comment
ya mungkin tapi saya tidak yakin. Menurut Anda bagaimana cara mengatasi masalah ini? - person Vishal Rastogi; 09.09.2020
comment
Apakah Anda memiliki konfigurasi dengan metode avroKafkaTemplate()? Ini jelas merupakan kacang yang ditentukan secara khusus. - person Mikalai Lushchytski; 09.09.2020
comment
Basis kode yang saya kerjakan cukup besar, tetapi bahkan saat mencarinya saya tidak menemukan kecocokan apa pun dengan avroKafkaTemplate - person Vishal Rastogi; 09.09.2020
comment
Apakah Anda memiliki dependensi yang menyediakan konfigurasinya sendiri? Seperti submodul lainnya, yang juga memiliki konfigurasi bean? - person Mikalai Lushchytski; 09.09.2020
comment
Ya, ada banyak sekali. - person Vishal Rastogi; 09.09.2020
comment
Jadi, mungkin salah satunya mendefinisikan avroKafkaTemplate bean - person Mikalai Lushchytski; 09.09.2020
comment
Bisakah Anda mencoba menambahkan @Primary kualifikasi ke definisi KafkaTemplate kacang Anda? - person Mikalai Lushchytski; 09.09.2020
comment
Ya saya mencobanya dan juga @Qualifier, tetapi kesalahannya masih sama. Juga, saya menemukan Bean dengan avroKafkaTemplate di file jar yang digunakan proyek saya, jadi di situlah spring mendapatkan bean ini. Namun menurut saya, avroKafkaTemplate hanya dicari ketika kacang KafkaTemplate (yang saya definisikan) tidak ditemukan, dan kacang default tidak dikembalikan karena kacang avroKafka ini. Menurut Anda apa yang dapat kita lakukan dalam skenario ini? - person Vishal Rastogi; 09.09.2020
comment
Apakah kelas @Configuration Anda didefinisikan dengan benar dan dimuat? dapatkah Anda mengonfirmasi bahwa definisi KafkaTemplate bean Anda benar-benar dimuat? Misalnya, metode print to console inside. - person Mikalai Lushchytski; 09.09.2020

Secara default, boot musim semi menyediakan kacang KafkaTemplate jika Anda menambahkan ketergantungan kafka di POM.

Anda hanya perlu mendefinisikan properti dalam contoh file application.yml Anda:

server: port: 9000
spring:
   kafka:
     consumer:
        bootstrap-servers: localhost:9092
        group-id: group_id
        auto-offset-reset: earliest
        key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
        value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
     producer:
        bootstrap-servers: localhost:9092
        key-serializer: org.apache.kafka.common.serialization.StringSerializer
        value-serializer: org.apache.kafka.common.serialization.StringSerializer

aktifkan konfigurasi otomatis

@Configuration
@EnableKafka

dan melakukan autowire pada kafkaTemplate:

 @Autowired
 private KafkaTemplate<String, String> kafkaTemplate;

Jika kasus Anda, pabrik konfigurasi otomatis mencari ProducerFactory<String, Strng>yang tidak cocok dengan konfigurasi Anda.

 @Bean
 @ConditionalOnMissingBean(ProducerFactory.class)
        public ProducerFactory<String, Strng> kafkaProducerFactory()

jadi ganti nama producerFactory() Anda menjadi kafkaProducerFactory(), ini akan menyelesaikan masalah Anda.

person Imran Ahmad    schedule 09.09.2020
comment
Imran, mengganti nama producerFactory() menjadi kafkaProducerFactory() tidak berhasil, masih menunjukkan kesalahan yang sama. Ketergantungan ditambahkan dalam file POM. - person Vishal Rastogi; 09.09.2020
comment
Dalam kode saya ini berfungsi.... Saya baru saja mendefinisikan kacang saya seperti ini: @Bean public KafkaTemplate kafkaTemplate(ProducerFactory‹String, String› pf) { return new KafkaTemplate(pf); } Pastikan juga untuk menggunakan EnableAutoConfiguration - person Imran Ahmad; 09.09.2020
comment
Ya, ini diaktifkan, saya memperbarui pertanyaan dengan beberapa detail tambahan, silakan lihat dan lihat apakah ini dapat membantu dalam menemukan solusi. - person Vishal Rastogi; 09.09.2020
comment
Jika kacang tersebut tidak diperlukan dalam proyek Anda, maka Anda dapat mengecualikan kelas tertentu agar tidak dipindai menjadi kacang dengan parameter pengecualianFilters dari anotasi @ComponentScan. Contoh: @ComponentScan(value = {'com.xyz.abc'}, kecualikanFilters = { @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, kelas = { firstClass.class, secondClass.class }) }) - person Imran Ahmad; 09.09.2020