Estoy desarrollando una aplicación con Spring boot e implementando múltiples WAR en un tomcat externo. Quiero registrar un bean compartible con estos WAR cuando se inicie Tomcat.
Yo uso: Java8, Spring boot (2.5.5) y Tomcat9
Bean quiero ser compartido por aplicaciones:
public class TestData { private String username; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } }SampleApp (hay varias aplicaciones que conectan automáticamente una instancia de TestData de la misma manera):
@SpringBootApplication @RestController public class App extends SpringBootServletInitializer { @Autowired TestData testData; public static void main(String[] args) { SpringApplication.run(App.class, args); } @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(App.class); } @RequestMapping(value = "SampleApp1", method = RequestMethod.GET) public String getUsername() { return testData.getUsername(); } }Creo que su pregunta es sobre compartir los datos de un Bean único entre diferentes contenedores de aplicaciones implementados en el mismo servidor web.
Esto no es posible por razones de seguridad. Cada aplicación implementada tiene su propio cargador de clases y, por lo tanto, no puede acceder fácilmente a los beans que residen en la memoria de los otros contenedores.
Le sugiero que agregue un microservicio al que acceden las diferentes aplicaciones implementadas y lo use en su lugar. Se puede acceder fácilmente a través de, por ejemplo, OpenFeign como cliente y casi parece un frijol con getters y setters si se hace correctamente.
Hay varios enfoques para su problema, resolviéndolo en diferentes niveles.
Cree una biblioteca compartida con las cosas necesarias e instálela en el servidor Tomcat. "Instalar" normalmente significa poner los archivos jar ensamblados en el directorio $CATALINA_HOME/lib o similar. Class Loader HOW-TO puede brindarle más detalles. No estoy seguro de cómo funciona con instancias compartidas de clases, pero definitivamente es posible compartir clases (fábricas, por ejemplo) y configuraciones a través de una biblioteca compartida. Con la configuración compartida y las fábricas, al menos puede producir beans idénticos (no necesariamente iguales , pero parece suficiente para su caso).
Defina un recurso JNDI compartido entre todas las aplicaciones. Por supuesto, esto requiere que Tomcat pueda acceder a su clase, por lo que primero debe pasar por la opción 1. De esta manera, puede tener una instancia "publicada" de una clase compartida entre todas las aplicaciones. Los detalles se pueden encontrar en JNDI Resources HOW-TO . Con este enfoque, puede inyectar un recurso publicado con la anotación @Resource .
Cree un microservicio (como sugiere una de las otras respuestas) que pueda proporcionarle datos y funciones y acceder a ellos desde su aplicación. Esto le brinda la máxima flexibilidad, pero también aporta complejidad que requiere una comunicación real con el microservicio.
Obviamente, las opciones 1 y 2 requieren acceso directo a la configuración del servidor.