Había pasado por varios puestos, pero la mayoría de ellos están relacionados con el manejo de mensajes incorrectos no se trata de manejo de excepciones al procesar ellos.
Quiero saber cómo manejar los mensajes que se han recibido por la aplicación A de trenes y hay una excepción al procesar el mensaje? La excepción podría ser debido a varias razones como la falta de red, etc. RuntimeException,
- Podría alguien sugerir cuál es la forma correcta de hacerlo? Debo usar
setUncaughtExceptionHandler
? ¿O hay un mejor camino? - Cómo manejar reintentos?
¡¡Gracias por adelantado!!
depende de lo que usted quiere hacer con excepciones por parte de los productores. si excepción será lanzada en productor (por ejemplo, debido a la red falla o kafka broker ha muerto), corriente morirá de forma predeterminada. y con kafka-arroyos versión 1.1.0 que podría anular el comportamiento por defecto mediante la aplicación ProductionExceptionHandler
como la siguiente:
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) {
}
}
del método de mango se podía volver ya sea CONTINUE
si no quiere morir en corrientes excepción, en el retorno FAIL
en caso de que quiera paradas de flujo (muelle es un defecto). Y se necesita especificar esta clase en config corriente:
default.production.exception.handler=com.example.CustomProductionExceptionHandler
También prestar atención de que ProductionExceptionHandler
las manijas únicas excepciones sobre el productor, y no va a manejar excepciones durante el procesamiento de mensajes con los métodos de flujo mapValues(..)
, filter(..)
, branch(..)
etc, que necesitan para envolver éstos lógica del método con los bloques try / catch (poner toda su lógica del método en bloque try para garantizar que va a manejar todos los casos excepcionales):
.filter((key, value) -> { try {..} catch (Exception e) {..} })
que yo sepa, no necesitamos a excepciones de la manija en el lado del consumidor de manera explícita, como corrientes kafka se consume intentar automáticamente después (una vez deducidas no cambiará hasta que los mensajes serán consumidos y transformados); por ejemplo, agente si Kafka no será alcanzable desde hace algún tiempo, se consiguió excepciones de kafka corrientes, y cuando se rompen será de hasta, kafka corriente va a consumir todos los mensajes. por lo que en este caso habremos simplemente retrasar y nada dañado / perdido.
con setUncaughtExceptionHandler
usted no será capaz de cambiar el comportamiento por defecto como con ProductionExceptionHandler
, la que sólo se podía registrar mensaje de error o de envío en tema fracaso.