Se solicita información sobre el paradero del estudiante Arshak Karhanyan

Clase 9

Viernes (Noche, 2025)

Resumen

En esta clase repasamos la noción de eventos para comunicar cosas que ocurren en nuestro sistema a otros objetos, sin acoplarnos a lo que hacen, pero ganando en flexibilidad de que se puedan suscribir otros interesados.

Además, introducimos el concepto de patrones de comunicación entre componentes, entre los que aparecerán viejos conocidos junto a nuestro nuevo concepto de eventos.

Finalmente, trabajaremos sobre tareas programadas.

Tareas programadas

Las tareas programadas (o tareas calendarizadas) son operaciones de nuestro sistema que en lugar ejecutarlas de forma interactiva, como parte de nuestros casos de uso, se ejecutan de forma automática, con cierta frecuencia.

Puntos de entrada

Vamos a necesitar definir un archivo que oficie de punto de entrada, o como se suele llamar en inglés, main. Este archivo será responsable de cargar nuestro código y ejecutar la tarea calendarizada.

public class Main {
   public static void main(string[] args) {
      // ...
   }
}

Empaquetado

Para poder ejecutar nuestro main, vamos a necesitar primero crear un paquete ejecutable (en el ecosistema de Java, utilizamos el formato jar) que contenga el código de nuestro proyecto y sus dependencias.

Para ellos vamos a tener que agregar la configuración del maven-assembly-plugin a nuestro pom.xml:

<plugin>
    <!-- Este plugin permite empaquetar nuestras aplicaciones utilizando distintos formatos -->
    <artifactId>maven-assembly-plugin</artifactId>
    <executions>
        <execution>
            <phase>package</phase>
             <goals>
                 <goal>single</goal>
             </goals>
         </execution>
     </executions>
     <configuration>
         <descriptorRefs>
             <!-- Esto indica que genere un paquete que incluya las dependencias -->
             <descriptorRef>jar-with-dependencies</descriptorRef>
         </descriptorRefs>
         <archive>
             <!-- Esto indica cual será el punto de entrada de nuestro ejecutable -->
             <manifest>
                 <mainClass>archivo.con.el.Main</mainClass>
             </manifest>
         </archive>
    </configuration>
</plugin>

Luego podremos ejecutar mvn package, comando que generará el paquete en cuestión.

Crontab y expresiones cron

Finalmente, en cada nodo del sistema operativo donde se ejecutarán nuestras tareas programadas, vamos a tener que generar un crontab:

Nota: Al editar las tareas de cron, éste nos abrirá por defecto un editor de línea de comandos, como nano o vim. ¡A no temer! Es un editor, pero que se opera mediante el teclado.

# Con este comando podemos listar las tareas instaladas
crontab -l
# nos permitirá editar las tareas
crontab -e

Ahora sí, veamos las expresiones cron. Son propias de los sistemas operativos unix (como Linux) pero están ampliamente extendidas en otras tecnologías. Tienen la siguiente forma:

# m h  dom mon dow   comando

Por ejemplo:

# a cada minuto de cada día
* *  *   *   *     java -jar /home/user/nombre-del-paquete-ejecutable.jar
# cada 5 minutos
*/5 *  *   *   *     java -jar /home/user/nombre-del-paquete-ejecutable.jar
# al inicio de cada hora
0 *  *   *   *     java -jar /home/user/nombre-del-paquete-ejecutable.jar
# a las 23:59 de cada domingo
23 59  *   *   0     java -jar /home/user/nombre-del-paquete-ejecutable.jar

¡Tenemos que tener cuidado! Las rutas a los archivos deben ser absolutas.

Si todo está bien, obtendremos el siguiente mensaje al guardar:

crontab: installing new crontab

Archivos de log

Necesitamos tener registro de lo que pasó. Una forma sencilla consiste en redireccionar la salida estándar utilizando >>

* *  *   *   *     java -jar /home/user/nombre-del-paquete-ejecutable.jar >> /home/user/tarea_programada.log

Deteniendo la calendarización

crontab -e

Y eliminamos la línea o la comentamos con #. Obtendremos nuevamente éste mensaje:

crontab: installing new crontab

Material

Material complementario

Para la próxima clase