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?
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:
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 bloquefinally
se garantiza que se ejecute incluso si hay una instrucciónreturn
obreak
dentro de los bloquestry
ocatch
, lo que lo convierte en una forma robusta de asegurar que se realice una acción final.