Tinha passado por vários lugares, mas a maioria deles estão relacionados com o tratamento de mensagens ruins não sobre a manipulação de exceção durante o processamento-los.
Eu quero saber a como lidar com as mensagens que são recebidos pela aplicação riacho e há uma exceção ao processar a mensagem? A exceção pode ser devido a várias razões, como falha de rede, RuntimeException etc.,
- Alguém poderia sugerir qual é a maneira certa de fazer? Devo usar
setUncaughtExceptionHandler
? Ou há um jeito melhor? - Como lidar com tentativas?
Desde já, obrigado!!
depende do que você quer fazer com excepções previstas do lado produtor. se exceção será lançada no produtor (por exemplo, devido à rede falha ou kafka corretor morreu), fluxo vai morrer por padrão. e com kafka-córregos versão 1.1.0 você pode substituir o comportamento padrão com a implementação de ProductionExceptionHandler
como o seguinte:
public class CustomProductionExceptionHandler implements ProductionExceptionHandler {
@Override
public ProductionExceptionHandlerResponse handle(final ProducerRecord<byte[], byte[]> record,
final Exception exception) {
log.error("Kafka message marked as processed although it failed. Message: [{}], destination topic: [{}]", new String(record.value()), record.topic(), exception);
return ProductionExceptionHandlerResponse.CONTINUE;
}
@Override
public void configure(final Map<String, ?> configs) {
}
}
de método pega você poderia retornar tanto CONTINUE
se você não quer fluxos morrendo na exceção, no retorno FAIL
, caso você queira paradas Stream (FAIL é uma padrão). e você precisa especificar esta classe em config stream:
default.production.exception.handler=com.example.CustomProductionExceptionHandler
Também preste atenção que ProductionExceptionHandler
alças únicas exceções no produtor, e ele não vai lidar com exceções durante o processamento mensagem com métodos de fluxo mapValues(..)
, filter(..)
, branch(..)
etc, você precisa quebrar estes lógica método com blocos try / catch (colocar toda a sua lógica método em bloco try a garantia de que você vai lidar com todos os casos excepcionais):
.filter((key, value) -> { try {..} catch (Exception e) {..} })
Que eu saiba, não precisamos de exceções punho no lado do consumidor de forma explícita, como fluxos kafka tentará automaticamente consumindo mais tarde (como deslocamento não será alterado até que as mensagens serão consumidos e processados); por exemplo, se kafka corretor não será acessível por algum tempo, você vai tem exceções de Kafka córregos, e quando quebrado caberá, kafka fluxo vai consumir todas as mensagens. Portanto, neste caso teremos apenas atrasar e nada danificado / perdido.
com setUncaughtExceptionHandler
você não será capaz de mudar o comportamento padrão como com ProductionExceptionHandler
, com ele você só poderia log mensagem de erro ou enviar em tópico fracasso.