es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Integración de Spring finalmente manejador de tipos.

Tengo una aplicación que lee de una cola de kafka y sigue así.

validate->convert->enrich->persist->notify

En el flujo, estoy recopilando algunos puntos de datos de rendimiento y otros en un contenedor de ThreadLocal.

En el escenario ideal, estoy enviando esta información a un servicio para que se use posteriormente en informes. Pero la tubería puede detenerse en cualquier paso si uno de los pasos falla debido a un error conocido (por ejemplo, convert falló, por lo que el flujo debería detenerse allí). No me gusta que cada uno de estos procesadores tenga un código que envíe la información en ThreadLocal al servicio de informes si la ejecución resultó en un error, ya que eso acoplaría esos servicios con información no relacionada con su tarea.

Sería bueno tener una forma de ejecutar un servicio al final del flujo para enviar esta información, sin importar en qué paso se detenga el flujo hacia adelante. También podría haber casos en los que algún código haya lanzado una excepción que no se conocía u otro problema que interrumpe el flujo.

¿Existe una forma de que se ejecute una operación final sin importar el resultado de la tubería para que se pueda utilizar para enviar esta información de manera similar a un bloque finalmente en Java?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma de ejecutar una operación final en Java, independientemente del resultado de un pipeline. Puede utilizar el bloque finally para asegurarse de que se ejecute un bloque de código incluso si hay una excepción en el bloque try o si el flujo se detiene en cualquier otra etapa.

    En este caso, puede mover la lógica para enviar la información en el contenedor ThreadLocal a un bloque finally, lo que garantizará que la información se envíe sin importar qué pase. De esta manera, puede separar el servicio de informes de los procesadores reales en el pipeline y asegurarse de que la información siempre se envíe con fines de informes.

    Aquí tienes un ejemplo:

    try {
        // lógica del pipeline
        validar();
        convertir();
        enriquecer();
        persistir();
        notificar();
    } finally {
        // código para enviar información al servicio de informes
        enviarASevicioDeInformes();
    }
    

    De esta manera, enviarASevicioDeInformes() siempre se llamará, independientemente de dónde se haya detenido el flujo o si se ha lanzado una excepción en alguno de los procesadores. Ten en cuenta que el bloque finally se garantiza que se ejecute incluso si hay una instrucción return o break dentro de los bloques try o catch, lo que lo convierte en una forma robusta de asegurar que se realice una acción final.

Comments are closed.