[Java][Spring] Ejecutar un método antes que cualquier otra cosa

Kaledros

Buenas.

Tengo una clase BindingCreator que me crea los bindings de Rabbit (exchanges, colas, topics, etc). Luego tengo varios beans anotados con @Configuration que necesitan que esas colas estén creadas o petan porque no las encuentran. Esa lógica de creación de colas estaba antes dentro de esos beans, pero se sacó fuera. Es una iteración más en un proceso, no se va a quedar así, pero de momento necesito que se haga así.

Mi problema es que Spring, al arrancar, escanea el código, encuentra las @Configuration e intenta crearlas. Al no encontrar las colas, el primer bean ya falla y la aplicación no arranca. ¿Alguna forma de hacer que BindingCreator sea el primer bean de la aplicación en ser escaneado? Tengo la lógica de creación en el constructor, así que se ejecutaría solo.

Grasiah.

Ranthas

Puedes configurar el orden en el que cargan los beans con la anotación @DependsOn:

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/DependsOn.html

También tienes la anotación @AutoConfigureOrder, pero creo que con la primera sería suficiente

1
JuAn4k4

¿Porqué necesitas que las colas estén creadas para configurar la app? ¿ No pueden hacerlo en modo lazy? Es más, ¿ si la cola peta, la app no arranca?

2 respuestas
Kaledros

#3 Porque cuando la app se levanta se configuran los listeners y las colas deben estar ya creadas o los beans no se pueden instanciar y peta el arranque.

Se hizo así como primera iteración para una demo técnica y ahora que nos han aprobado el desarrollo queremos rediseñar la capa de comunicación porque está un poco de aquella manera. La idea final es que las colas se configuren cuando se levante el contenedor de Rabbit y la app las encuentre ya creadas sin necesidad de hacerlo ella, pero la primera iteración es sacar la lógica de creación de bindings de los servicios principales y meterla en una librería.

2 respuestas
wdaoajw

#4 como te dice #3, usando RabbitMQ puedes o bien tener las colas ya instanciadas, o asegurarte que si no lo está, se instance al momento de arrancar la app. Te va a quitar dolores de cabeza hacerlo así

D

#1 Ha de estar en una configuration? te valdria con ejecutar todo esto que comentas en un context refreshed?

JuAn4k4

#4 Para mi es un error que rabbit tenga que crear las colas. Es cada app la que ha de configurar las colas/topics/etcsi no existen, tanto los que producen como los que leen. Rabbit ni pincha ni corta en como los demás usan su servicio.

Yo lo haría lazy, cuando fueses a leer o escribir, si no hay cola la creas, e ya.

1 1 respuesta
Kaledros

#7 No es rabbit en sí, es al levantar el contenedor. Cuando rabbit se acabe de levantar se lanza algo (un jar, un script, lo que sea) que configura los bindings. Forma parte del mismo proceso de levantado de la capa de comunicación pero no es el propio rabbit.

Lo de hacerlo en modo lazy rompería nuestro plan de segregar la funcionalidad de negocio de la comunicación, pero es algo que nos podemos plantear si vemos que lo otro nos da mucho problema.

Usuarios habituales