Avatar billede dsj Nybegynder
19. december 2002 - 13:23 Der er 10 kommentarer og
1 løsning

Problem med tråd

Jeg har lavet en server-app, som har cleaner-tråd, som én gang i døgnet vågner op, rydder op i databasen og udskriver statistikker til en log-fil. Når serveren startes, sættes cleaner-tråden til at køre første gang kl 2:00 næste dag om morgenen, problemet er, at den aldrig vågner >:(

Jeg anvender java.util.Timer, hvortil en TimerTask parses, tidspunktet på første den skal køre, samt et interval (24 timer). Timer'en startes sm daemon-tråd og selve server-app'en kører i et Redhat Linux-miljø med j2sdk 1.4-0_01

Udsnit af koden ser således ud:

  // Konstruktøren af cleaneren, hvor Timer'en initeres
  public Cleaner(DataAdministrator dataAdm) {
    formater = new SimpleDateFormat("d/MM-yyyy HH:mm");
    this.dataAdm = dataAdm;
    // Første tidspunkt for hvor cleanere skal køre findes
    Calendar c = Calendar.getInstance();
    c.setTimeInMillis(System.currentTimeMillis());
    c.set(c.get(c.YEAR),c.get(c.MONTH),c.get(c.DATE),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 præcis samme tidspunkt
    timer.scheduleAtFixedRate(new Task(), c.getTime(), 86400000);
    Logger.log(this, "3. Cleaner scheduled (as Daemon-thread) - first time running is "+formater.format(new Date(c.getTimeInMillis())));
  }

  private class Task extends TimerTask {
    public void run() {
      Logger.log(this, "Cleaning started...");
      // en hel masse
      Logger.log(this, "Cleaning stopped.");
    }

Nogen der ved hvad fejlen kan være??
Avatar billede carstenknudsen Nybegynder
19. december 2002 - 13:36 #1
Hvad er hour og minute sat til?
Har du prøvet at sætte den til at
køre første gang om et par minutter,
og så køre hver 5. minut så du kan
checke det let om det overhovedet virker.
Jeg kunne forestille mig, at du kommer
til at sætte den til at køre første gang
for "syv timer siden" og derfor aldrig
kører
Avatar billede arne_v Ekspert
19. december 2002 - 13:40 #2
Den sættes ikke til at køre kl. 2 næste dag.

Den sættes til at køre kl. hours:minutes samme dag.

Prøv med:
    Calendar c = Calendar.getInstance();
    c.setTimeInMillis(System.currentTimeMillis());
    c.roll(c.DATE, true); // <----
    c.set(c.get(c.YEAR),c.get(c.MONTH),c.get(c.DATE),hour,minute);
Avatar billede arne_v Ekspert
19. december 2002 - 13:46 #3
Faktisk kan man nøjes med:
    Calendar c = Calendar.getInstance();
    c.roll(c.DATE, true); // <----
    c.set(c.get(c.YEAR),c.get(c.MONTH),c.get(c.DATE),hour,minute);
da Calendar.getInstance tager current tid.
Avatar billede dsj Nybegynder
19. december 2002 - 14:00 #4
Hvis jeg sætter den til at køre kl 2:00 samme dag kommer der en null-pointer exception pga. de ting cleaner'en foretager, og sætter jeg den til at køre f.eks. om et kvarter, gør den som den skal!!
Avatar billede dsj Nybegynder
19. december 2002 - 14:00 #5
hour er sat til 2, minut til 0 og faktisk skriver jeg:

c.set(c.get(c.YEAR),c.get(c.MONTH),c.get(c.DATE+1),hour,minute);
Avatar billede arne_v Ekspert
19. december 2002 - 14:03 #6
OK.

Det fremgik ikke klart.

PS: Jeg antager du har c.get(c.DATE)+1 og ikke c.get(c.DATE+1) !!
Avatar billede arne_v Ekspert
19. december 2002 - 14:06 #7
Fordi ellers så bruger du timer som dato.
Avatar billede janus_007 Nybegynder
19. december 2002 - 14:11 #8
Måske du skulle prøve java.swing.Timer ??

Læs mere her : http://java.sun.com/docs/books/tutorial/uiswing/misc/timer.html
Avatar billede dsj Nybegynder
19. december 2002 - 14:12 #9
nej, glemte at skrive det ...

Men faktisk er jeg vidst kommet til at skrive c.get(c.DATE+1), prøver lige med det andet og med mindre der kommer andrer foreslag, vender jeg tilbage i morgen, skal jo lige se om det virker kl 2:00 i nat :)
Avatar billede arne_v Ekspert
19. december 2002 - 14:17 #10
OK.
Avatar billede dsj Nybegynder
22. december 2002 - 08:37 #11
Jamen det virker jo...
Det var c.get(c.DATE+1) der var problemet
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