19. december 2002 - 13:23Der 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."); }
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
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
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.
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!!
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 :)
Jamen det virker jo... Det var c.get(c.DATE+1) der var problemet
Synes godt om
Ny brugerNybegynder
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.