Explicación
Daniel Garcia Costa edited this page 8 months ago

Este es el repositorio utilizado para la sesión 14 de la asignatura Desarrollo Basado en Componentes Distribuidos y Servicios.

El objetivo es probar diferentes funcionalidades de Spring Boot que no se han visto en las sesiones anteriores.

La aplicación que compone el proyecto tiene un único endpoint, en raíz, que responde con diferentes parámetros definidos en el fichero properties.

Perfiles de ejecución

Spring Boot permite tener diferentes perfiles de ejecución, de modo que se carguen diferentes propiedades o funcionalidades en base al perfil seleccionado.

Se puede configurar el perfil mediante la propiedad spring.profiles.active en el properties, por vía programática, directamente en STS [Run -> Run configurations -> Profile] o mediante inyección de variables de entorno

Para crear diferentes ficheros properties es necesarios añadir un sufijo con el nombre del perfil. application.local.properties, application.prod.properties, etc.

Se puede utilizar la anotación @Profile en cualquier @Component para especificar en que perfil se utiliza ese componente.

Ejecución vía terminal

Además de ejecutar directamente la aplicación desde el STS, también puede ser ejecutada por terminal mediante el Maven Plugin de Spring Boot o directamente compilando y ejecutando el fichero jar de la aplicación.

Ejecución con maven

mvn spring-boot:run -Dactive.profile=local

Compilar con perfil específico

mvn clean package spring-boot:repackage -Dactive.profile=local

Compilar sin especificar perfil

mvn -Dmaven.test.skip=true clean install 

Ejecutar jar con perfil

java -jar ./target/DBCDS_S14_1-0.0.1-SNAPSHOT.jar --spring.profiles.active=local  

Tareas programadas

Spring Boot dispone de un componente para ejecutar tareas programadas llamado scheduling.

Habilita las tareas programadas en la clase principal

@EnableScheduling

Añade una variable al properties para controlar la activación de las tareas programadas. Esto es opcional, pero ayudará a controlar la activación de las tareas programadas en diferentes entornos de ejecución.

app.scheduling.enabled=true

Crea una clase que implemente de SchedulingConfigurer y configura el pool de hilos para la ejecución de las tareas.

@Configuration
public class SchedulerConfig implements SchedulingConfigurer {
    private final int POOL_SIZE = 10;

    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();

        threadPoolTaskScheduler.setPoolSize(this.POOL_SIZE);
        threadPoolTaskScheduler.setThreadNamePrefix("my-scheduler");
        threadPoolTaskScheduler.initialize();

        scheduledTaskRegistrar.setTaskScheduler(threadPoolTaskScheduler);
    }
}

Crea un componente añade los métodos que se ejecutarán.

@Component
@SuppressWarnings("unused")
public class ScheduledTasks {
	
	@Value("${app.scheduler.enabled}")
	private String schedulerEnabled;

	@Scheduled(fixedDelay = 300000)
	public void runPeriodicTask() {
		if(Boolean.parseBoolean(this.schedulerEnabled)) {
			System.out.println("running task");
		}
	}
	
	@Scheduled(cron="0 0 1 * * *")
	public void runCronTask() {
		if(Boolean.parseBoolean(this.schedulerEnabled)) {
			System.out.println("running task");
		}
	}
	
}