2012-02-21 16 views
26

Quiero ejecutar un trabajo todos los días de las 2:00 p.m. ¿Qué método de java.util.Timer puedo usar para programar mi trabajo?Cómo puedo ejecutar mi TimerTask todos los días 2 PM

Después de 2 horas Ejecutar se detendrá el trabajo y reprogramar para el día siguiente a las 2:00 p.m.

+4

Recuerde sobre [el horario de verano] (http://en.wikipedia.org/wiki/Daylight_saving_time) –

+0

Recibí una de mis respuestas, pero cómo detener la tarea después de 2 horas y reprogramarla para el día siguiente – BOSS

Respuesta

13
import java.util.Calendar; 
import java.util.Date; 
import java.util.GregorianCalendar; 
import java.util.Timer; 
import java.util.TimerTask; 


public class MyTimerTask extends TimerTask { 
    private final static long ONCE_PER_DAY = 1000*60*60*24; 

    //private final static int ONE_DAY = 1; 
    private final static int TWO_AM = 2; 
    private final static int ZERO_MINUTES = 0; 


    @Override 
    public void run() { 
     long currennTime = System.currentTimeMillis(); 
     long stopTime = currennTime + 2000;//provide the 2hrs time it should execute 1000*60*60*2 
      while(stopTime != System.currentTimeMillis()){ 
       // Do your Job Here 
      System.out.println("Start Job"+stopTime); 
      System.out.println("End Job"+System.currentTimeMillis()); 
      } 
    } 
    private static Date getTomorrowMorning2AM(){ 

     Date date2am = new java.util.Date(); 
      date2am.setHours(TWO_AM); 
      date2am.setMinutes(ZERO_MINUTES); 

      return date2am; 
     } 
    //call this method from your servlet init method 
    public static void startTask(){ 
     MyTimerTask task = new MyTimerTask(); 
     Timer timer = new Timer(); 
     timer.schedule(task,getTomorrowMorning2AM(),1000*10);// for your case u need to give 1000*60*60*24 
    } 
    public static void main(String args[]){ 
     startTask(); 

    } 

} 
3

La manera más fácil que he encontrado de hacer esto siempre ha sido a través del Programador de tareas en Windows y cron en Linux.

Sin embargo para Java, echar un vistazo a Quartz Scheduler

Desde su página web:

cuarzo es un código abierto de servicios de planificación de tareas con todas las funciones que puede ser integrado con, o se usa junto prácticamente cualquier aplicación Java EE o Java SE, desde la aplicación autónoma más pequeña hasta el sistema de comercio electrónico más grande . Se puede usar Quartz para crear cronogramas simples o complejos para ejecutar decenas, centenas o incluso decenas de miles de trabajos; trabajos cuyas tareas se definen como estándar Componentes de Java que pueden ejecutar prácticamente todo lo que pueda programar que hacer. Quartz Scheduler incluye muchas características de clase empresarial , tales como transacciones JTA y clustering.

+0

Puedo no use la API de terceros – BOSS

+0

Eche un vistazo a este [ejemplo de tareas periódicas de programación] (http://www.javapractices.com/topic/TopicAction.do?Id=54). Quartz es de código abierto (licencia Apache 2.0), técnicamente puedes simplemente descargar la fuente e incluirla en tu proyecto. – Ali

+1

@Ali, alguna empresa gubernamental o bancaria no permite bibliotecas de terceros no aceptadas dentro del proyecto ... – Rudy

22

Usted podría utilizar Timer.schedule(TimerTask task, Date firstTime, long period) método, el establecimiento de firstTime a 14:00 hoy y el ajuste de los period a 24 horas:

programa la tarea especificada para la ejecución de retardo fijo repetida, comenzando a la hora especificada. Las ejecuciones posteriores tienen lugar aproximadamente a intervalos regulares, separadas por el período especificado.

+0

Esto es más bien una forma muy simple –

+2

@SunilKumarBM, ¿es positivo o negativo? – hmjd

+0

obviamente positivo, es por eso que he votado esto. Incluso yo uso el mismo método :-) –

2

Debería intentar usar scheduleAtFixedRate (esto repetirá su tarea). Tendrá que crear un objeto TimerTask que especifique qué ejecutar (en run()) y cuándo ejecutar (scheduledExecutionTime). scheduleAtFixedRate también le permite especificar la primera fecha de ejecución.

1

uso horario public void (tarea TimerTask, Fecha firstTime, a largo plazo)

para que la tarea se repite de nuevo al día siguiente, acaba de establecer periodo de 86400000 milisegundos (lo que significa 1 día)

Date date2pm = new java.util.Date(); 
date2pm.setHour(14); 
date2pm.setMinutes(0); 

Timer timer = new Timer(); 

timer.sc(myOwnTimerTask,date2pm, 86400000); 
+0

@Ruby si mi trabajo se ejecuta durante 2 horas, ¿el siguiente programa se retrasará 2 horas? – BOSS

+0

Sí. de Java Docs: en la ejecución de retardo fijo, cada ejecución está programada en relación con el tiempo de ejecución real de la ejecución anterior. Si una ejecución se retrasa por algún motivo (como recolección de basura u otra actividad de fondo), las ejecuciones posteriores también se retrasarán. En el largo plazo, la frecuencia de ejecución generalmente será ligeramente menor que el recíproco del período especificado (suponiendo que el reloj del sistema subyacente Object.wait (long) es preciso). – Rudy

+0

¡3,600,000ms es una hora! –

40
Calendar today = Calendar.getInstance(); 
today.set(Calendar.HOUR_OF_DAY, 2); 
today.set(Calendar.MINUTE, 0); 
today.set(Calendar.SECOND, 0); 

// every night at 2am you run your task 
Timer timer = new Timer(); 
timer.schedule(new YourTask(), today.getTime(), TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS)); // period: 1 day 
+1

voto arriba, pero no se acepta como la respuesta más simple difícil, @Daniel Gerber? Me pregunto, – gumuruh

+0

no puede hacer nada al respecto :) –

+0

la clase del temporizador que está utilizando actualmente se importa desde java.util.Timer o javax.swing.Timer? y qué tal si queremos ejecutar el tiempo a las 2 p.m., ¿se teclearía como 14 para los valores de Calendar.HOUR_OF_DAY? @Daniel Gerber – gumuruh

1

¿por qué no usar @Scheduled de primavera (cron = "0 0 14 * * *") .. para los segundos, minutos, horas, días, meses, díadelasemana. V Cool. Incluso puede especificar 9-11 para 9:00 a 11:00, o MON-FRI en el último parámetro. También puede invocar este programa, como en el caso de la mayoría de Spring, en caso de que desee establecer la hora en el tiempo de ejecución. ver esto: - http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html

Adición de un ejemplo

@Scheduled(cron="0 0 14 * * *") 
    public void customScheduler(){ 
     try{ 
      // do what ever you want to run repeatedly 
     }catch(Exception e){ 
      e.printStackTrace(); 

     } 
    } 

también, por favor anotar la clase que contiene este con la anotación @Component y por favor proporcionar @EnableScheduling en la Solicitud.La clase java (clase contiene el método principal) hace que Spring sepa que está usando taskscheduler en su aplicación.

Cuestiones relacionadas