Incluir un módulo de plataforma en el sistema de Plug Ins

Incluir un módulo de plataforma en el sistema de Plug Ins

Para poder incluir un módulo de plataforma en el sistema de Plug Ins hay que realizar lo siguiente:

 

Añadir nombre del módulo a la enumeración

En la interfaz com.minsait.onesait.platform.plugin.Module del proyecto onesaitplatform-plugin-interfaces añadir el nuevo módulo al Enum:

package com.minsait.onesait.platform.plugin; public enum Module { ALL, BPM_ENGINE, CONTROLPANEL, API_MANAGER, DASHBOARD_ENGINE }

POM XML

Tener la dependencia onesaitplatform-commons

<dependency> <groupId>com.minsait.onesait.platform</groupId> <artifactId>onesaitplatform-commons</artifactId> <version>${project.version}</version> </dependency>

Añadir la siguiente configuración del plugin de maven de Spring Boot

<plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <mainClass>com.minsait.onesait.platform.DashboardEngineBootstrapApplication</mainClass> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> <configuration> <classifier>exec</classifier> <layout>JAR</layout> </configuration> </execution> </executions> </plugin> </plugins>

 

La propiedad <mainClass> es el nombre completo de la clase principal de la aplicación que comentaremos en la siguiente sección.

 

Crear clase principal para Bootstrap

Para que funcione la carga de plugins dinámica, es necesario crear una clase principal nueva para la aplicación.

Por ejemplo, para el dashboard engine, tenemos la aplicación principal

package com.minsait.onesait.platform; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication(scanBasePackages = "com.minsait.onesait") public class DashboardEngineApplication { public static void main(String[] args) { SpringApplication.run(DashboardEngineApplication.class, args); } }

Crearemos en el mismo paquete la clase “DashboardEngineBootstrapApplication“, esta nueva clase principal es la que se encargará de cargar los plugins y de iniciar la aplicación Spring Boot mediante el loader PropertiesLauncher de Spring Boot:

package com.minsait.onesait.platform; import org.springframework.boot.loader.PropertiesLauncher; import com.minsait.onesait.platform.commons.plugins.PluginsManager; import com.minsait.onesait.platform.plugin.Module; public class DashboardEngineBootstrapApplication { public static void main(String[] args) throws Exception { PluginsManager.loadPlugins(Module.DASHBOARD_ENGINE); PropertiesLauncher.main(args); } }

El nombre de esta clase es el que se pondrá en el pom.xml tal y como se indica en la sección anterior

 

Fichero loader.properties

El siguiente paso será crear un fichero llamado “loader.properties” en src/main/resources, con el siguiente contenido:

loader.path=file:/application/plugins/ loader.main=com.minsait.onesait.platform.DashboardEngineApplication

Aquí si pondremos el nombre completo de la clase principal que contiene la anotación @SpringBootApplication

 

Dockerfile y docker-entrypoint.sh

Por último, tendremos que tener lo siguiente en el Dockerfile:

# logs folder RUN mkdir -p /var/log/platform-logs && \ mkdir /application && \ mkdir /application/plugins

 

Y eliminar si existen estas líneas:

RUN unzip /app.jar &&\ rm /app.jar

 

En el docker-entrypoint deberemos tener lo siguiente:

#!/bin/bash echo "Finding Plugins" if [ -z "$PLUGIN_URI" ] then echo "No plugins specified" else echo "Downloading Plugins..." IFS=';' read -ra plugins <<< "$PLUGIN_URI" for plugin in "${plugins[@]}" do echo "Plugin found on '$plugin'" wget -P /application/plugins/ $plugin done fi java $JAVA_OPTS -Dspring.application.json=$ONESAIT_PROPERTIES -Djava.security.egd=file:/dev/./urandom -Dspring.profiles.active=docker -jar /app.jar exit 0

 

A destacar el directorio de plugins /application/plugins/ que se deja para retrocompatibilidad (sistema de carga de plugins antiguo); por otro lado la aplicación se ejecuta con un -jar /app.jar