簡體   English   中英

如何處理kafka生產者異常

[英]How to handle kafka producer exceptions

我試圖了解 spring 引導 KafkaTemplate 如何與異步生產者一起工作並處理異常。 我想處理各種錯誤,包括網絡錯誤。 嘗試重試配置,但重試次數超過我提供給的次數

@Service
public class UserInfoService {
     private static final Logger LOGGER = LoggerFactory.getLogger(UserInfoService.class);

     @Autowired
     private KafkaTemplate kafkaTemplate;

     public void sendUserInfo(UserInfo data) {
         final ProducerRecord<String, UserInfo> record = new ProducerRecord<>("usr-test-data", "test-app", data);
         
         try {
             ListenableFuture<SendResult<String, UserInfo>> future = kafkaTemplate.send(record);
             future.addCallback(new ListenableFutureCallback<SendResult<String, UserInfo>>() {
                 @Override
                 public void onFailure(Throwable ex) {
                     handleFailure(ex);
                 }

                 @Override
                 public void onSuccess(SendResult<String, UserInfo> result) {
                     handleSuccess(result);
                 }
             });
         } catch (Exception e) {
             throw new RuntimeException(e);
         }
         
     }

     private void handleSuccess(SendResult<String, UserInfo> result) {
         LOGGER.info("Message sent successfully with offset: {}", result.getRecordMetadata().offset());
     }
     private void handleFailure(Throwable ex) {
         LOGGER.info("Unable to send message- Error: {}",  ex.getMessage());
     }
 }

嘗試使用configProps.put(ProducerConfig.RETRIES_CONFIG, "3"); 希望這最終會拋出異常並且我可以捕捉到。 但它仍然嘗試了 3 次以上,但似乎沒有用。 這是我的完整配置 class:

@Configuration
public class KafkaProducerConfig {
     @Value(value = "${spring.kafka.bootstrap-servers}")
     private String bootstrapAddress;

     @Bean
     public ProducerFactory<String, String> producerFactory() {
         Map<String, Object> configProps = new HashMap<>();
         configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapAddress);
         configProps.put(ProducerConfig.ENABLE_IDEMPOTENCE_DOC, "true");
         configProps.put(ProducerConfig.INTERCEPTOR_CLASSES_CONFIG, CountingProducerInterceptor.class.getName());
         configProps.put(ProducerConfig.ACKS_CONFIG, "all");
         configProps.put(ProducerConfig.RETRIES_CONFIG, "3");
         configProps.put(ProducerConfig.RETRY_BACKOFF_MS_CONFIG, 10000);
         configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
         configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class);
         return new DefaultKafkaProducerFactory<>(configProps);
     }

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

想知道我可以在 future.OnFailure 和父 try catch 塊中捕獲什么。

Future 沒有在 try-catch 的生命周期內完成。您需要在 onFailure 的主體內拋出異常。

根據我的經驗,Kafka.network 錯誤不容易被捕獲

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM