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.

ScheduleExpression entre horas y minutos exactos

Estoy trabajando con javax.ejb.ScheduleExpression y temporizadores para crear trabajos programados diarios. Necesito especificar la hora de trabajo con horas y minutos. Por ejemplo, digamos que quiero que se ejecute “todos los días entre las 18:27 y las 19:47”. ¿Cómo puedo escribir esta expresión?

Lo he intentado de la siguiente manera:

ScheduleExpression()
.hour(“18”-“19”)
.minute(“27”-“47”)
.second(“*”)

Pero el problema es que, cuando lo ejecuto, se detiene a las 18:47 y vuelve a iniciar a las 19:27. Entonces, ¿cómo puedo hacer para que se ejecute cada segundo entre esas horas y minutos?

Además, quiero poder detener el temporizador en cualquier momento, lo cual estoy haciendo con el método “timer.cancel();” y luego volver a programarlo para las mismas horas, pero esta vez para el próximo día. ¿Es posible escribir una expresión que comience a ejecutarse al día siguiente y siga ejecutándose en las horas especificadas hasta que se cancele nuevamente?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para programar una tarea diaria entre las 18:27 y las 19:47 utilizando javax.ejb.ScheduleExpression y timers, puedes usar la siguiente expresión:

    ScheduleExpression()
               .hour("18-19")
               .minute("27-47")
               .second("*")
    

    Esta expresión se ejecutará cada segundo entre cada minuto en las horas entre las 18 y las 19.

    Para detener y reprogramar el temporizador para las mismas horas al día siguiente, puedes usar el siguiente código:

    // Cancelar el temporizador actual
    timer.cancel();
    
    // Calcular el tiempo para el próximo día
    Calendar nextRun = Calendar.getInstance();
    nextRun.add(Calendar.DAY_OF_YEAR, 1);
    nextRun.set(Calendar.HOUR_OF_DAY, 18);
    nextRun.set(Calendar.MINUTE, 27);
    nextRun.set(Calendar.SECOND, 00);
    
    // Re programar el temporizador para el próximo día
    timer = timerService.createCalendarTimer(
       new ScheduleExpression()
               .hour("18-19")
               .minute("27-47")
               .second("*")
               .startingAt(nextRun.getTime())
    );
    

    Este código cancela el temporizador actual, calcula el tiempo para el próximo día para ejecutar la tarea y reprograma el temporizador con las horas y minutos especificados a partir del tiempo calculado para el próximo día.

Comments are closed.