Avatar billede theboy Nybegynder
09. december 2002 - 13:28 Der er 5 kommentarer og
2 løsninger

Funktion der køre en gang i døgnet

Hvordan får man en funktion til at køre en gang i døgnet, således at man på en server har en funktion der kl. 00:00:00 udføre en funktion?
Avatar billede arne_v Ekspert
09. december 2002 - 13:36 #1
Flere muligheder.

Du kan selv i din server starte en thread som har
har en uendelig løkker, og som udfører din kode
på det rigtigt tidspunkt.

for(;;) {
  if(isRigthTime()) {
      // do it
  }
  Thread.sleep(5000);
}

eller

for(;;) {
  Thread.sleep(5000);
  // start ny thread til at udføre do it
}

(den sidste kan godt drifte lidt)

Men hvis det er til seriøs brug skal du ud
og finde en færdig scheduler.
Avatar billede arne_v Ekspert
09. december 2002 - 13:42 #2
Den sidste er forkert, det skulel være:

for(;;) {
  Thread.sleep(24*60*60*1000);
  // start ny thread til at udføre do it
}
Avatar billede arne_v Ekspert
09. december 2002 - 13:42 #3
For en gratis scheduler se f.eks.:

http://www.part.net/quartz.html
Avatar billede carstenknudsen Nybegynder
09. december 2002 - 13:56 #4
Brug java.util.Timer klassen, den
er lavet til det samme.
Avatar billede aslan Nybegynder
09. december 2002 - 14:26 #5
Timer t = new javax.swing.Timer(1000*60*60*24, new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                                                     
                //gør noget....
            }
           
        });
        t.start();
Avatar billede dsj Nybegynder
09. december 2002 - 15:33 #6
Dette er den rigtige måde at gøre det på, jf. Sun. Der tages højde for hvor lang tid selve jobbet tager, så det altid bliver udført på præcis samme tidspunkt:

public class MyTimer {
  // klokkeslettet for hvornår opgaven skal udføres:
  private static final int hour = 2;
  private static final int minute = 0;
  private Timer timer;

  public MyTimer(DataAdministrator dataAdm) {
    // Første tidspunkt for hvor cleanere skal køre findes
    Calendar c = Calendar.getInstance();
    c.setTimeInMillis(System.currentTimeMillis());
    // arbejdet bliver udført på klokkeslettet, gældende fra næste døgn
    c.set(c.get(c.YEAR),c.get(c.MONTH),c.get(c.DATE+1),hour,minute);
    // Timeren startes som en deamon-thread, så hvis kun den er tilbage lukker serveren
    timer = new Timer(true);
    // Timeren startes og kører en gang i døgnet (hvert 86.400.000 ms)
    // Der tages højde for hvor lang tid operationen tager, så opgaven altid vil blive udført på det samme tidspunkt
    timer.scheduleAtFixedRate(new Task(), c.getTime(), 24*60*60*1000);
  }

  private class Task extends TimerTask {
    public void run() {
      // Det arbejde der skal udføres
    }
  }
}
Avatar billede cprovstgaard Nybegynder
10. december 2002 - 08:08 #7
Jeg har selv gode erfaringer med 2 strategier:

1. Den rene java løsning:
  Du laver en klasse der extender java.util.TimerTask
 
  public class MinTimerTask extends TimerTask{
    public void run(){
      kaldFunktion();
    }
  }
 
  Du kan nu få kaldt "run()" kl 00:00:00 hvert døgn ved at
  lave dig en java.util.Timer:
 
  Timer timer = new Timer();
  timer.scheduleAtFixedRate(new MinTimerTask(), beregnMillisekunderTilMidnat(), 86400000L);
 
  Hermed er der startet en ny tråd der håndterer dine funktionskald.
 
2. Den operativsystemstyrede eksekvering:
    Du lægger simpelthen din funktion ind under en main-funktion.
    Du lader så operativsystemet invokere et opstartsscript hver
    midnat. Denne løsning kan være optimal der hvor systemovervågningen
    integrerer mod dit operativsystem snarere end din applikationslog
    eller lignede.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester