es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Ejecutar métodos programados con expresiones Cron desde la base de datos.

Estoy intentando cambiar la expresión cron de un método específico con el valor definido en una base de datos. Normalmente uso las anotaciones de Spring para esto.

Por ejemplo:

@Scheduled(cron = "expresión cron desde la base de datos")
public void typeAJob(){
...
}

Estaría bien si después del inicio de mi programa estas expresiones cron no pudieran ser cambiadas más. Pero al inicio, debería leer el valor desde la base de datos y usarlo como expresión cron para este método.

El objetivo final sería que tengo X números de trabajos en la base de datos, cada uno teniendo su propia expresión cron. Los trabajos tendrán un tipo específico (typeAJob, typeBJob, etc.). Cada tipo tendrá su propio método programado.

Quizás alguien tenga una idea, ¡gracias! 🙂

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para cambiar la expresión cron de un método específico con un valor definido en una base de datos utilizando anotaciones de Spring, puede seguir estos pasos:

    1. Cree una tabla de base de datos (por ejemplo, jobs) con columnas para el tipo de trabajo (por ejemplo, type), la expresión cron (por ejemplo, cron_expression) y cualquier otra información relevante.
    2. Use el JdbcTemplate de Spring u otra biblioteca de acceso a bases de datos para consultar la base de datos y recuperar la expresión cron para el tipo de trabajo específico.

    3. Cree una clase de configuración con un método que devuelva un bean TaskScheduler configurado con la expresión cron dinámica. Por ejemplo:

      @Configuration
      public class JobSchedulerConfig {
         @Autowired
         private DataSource dataSource;
      
         @Bean
         public TaskScheduler taskScheduler() {
             ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
             scheduler.setThreadNamePrefix("JobScheduler-");
             scheduler.initialize();
             return scheduler;
         }
      
         @Bean
         public Runnable typeAJob() {
             String cronExpression = jdbcTemplate.queryForObject(
                     "SELECT cron_expression FROM jobs WHERE type = 'typeAJob'",
                     String.class);
             return () -> {
                 // Código para ejecutar en el cronograma de typeAJob
             };
         }
      
         @Bean
         public ScheduledTaskRegistrar scheduledTasks() {
             ScheduledTaskRegistrar registrar = new ScheduledTaskRegistrar();
             registrar.setScheduler(taskScheduler());
             registrar.addCronTask(new CronTask(typeAJob(), cronExpression));
             return registrar;
         }
      }
      

      Esta clase de configuración recupera la expresión cron para typeAJob de la base de datos, crea un bean Runnable para typeAJob y lo programa usando el ScheduledTaskRegistrar con la expresión cron dinámica.

    4. Repita el paso 3 para cada tipo de trabajo, utilizando la expresión cron adecuada de la base de datos.

    Este enfoque le permite programar trabajos dinámicamente con diferentes expresiones cron basadas en valores en una base de datos. Tenga en cuenta que cambiar la expresión cron de un trabajo en ejecución puede causar un comportamiento inesperado, por lo que generalmente es una buena idea cambiar las expresiones cron entre las ejecuciones de su programa.

Comments are closed.