Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [JAVA][date e millisecondi] imprecisione di un timer

    ciao a tutti.

    la mia applicazione deve eseguire su un database una stored procedure ad un determinato orario

    la funzione per ottenere i millisecondi da aspettare (comprensivo del conto delle 24 ore)

    e' la seguente:

    codice:
    long timeout;
    Calendar now = new GregorianCalendar();
    
    Calendar startsAt = new GregorianCalendar(now.get(Calendar.YEAR),now.get(Calendar.MONTH),now.get(Calendar.DATE),time,0,0);
    								
    if (now.before(startsAt)){
    		timeout = (startsAt.getTimeInMillis() - now.getTimeInMillis());
    } else {
                    long day = 86400000L;
    		timeout =  ( day - (now.getTimeInMillis() - startsAt.getTimeInMillis()));
    		}		
    return timeout;
    time e' un intero che va da 0 a 23.

    questa funzione viene richiamata ogni volta che la stored procedure termina, cosi' da risettare il timer considerando anche il tempo di esecuzione della procedura. il problema e' che dopo 4 giorni ha anticipato di 30 minuti e rotti l'ora di esecuzione... aiuto?

  2. #2
    nessun javista in giro?

  3. #3
    bhò, a me pare corretto
    al massimo, se la stored procedure deve essere eseguita sempre alla stessa ora, ti potrei consigliare di usare un timer e di implementare la tua chiamata di stored procedure in un timer task
    23-08-2005: Udinese in cémpions lìg
    Questa estate l'ho passata a Tallin

  4. #4
    Dio, grazie! una risposta

    penso di aver trovato il problema. la funzione che ho postato e' dentro un thread che gestisce altri timer. per far si che il timer con meno millisecondi sia il primo a partire il thread rimane in wait i millisecondi del timer minore. quando si risveglia sottrae a tutti i timer i secondi passati da quando e' partito (evitando errori causa notify() da parte di altri thread). i timer minori o uguali a zero vengono lanciati e resettati. l'idea non sarebbe nemmeno male, ma per qualche strano motivo questo sottrarre ai timer fa si che la chiamata avvenga minuti prima del dovuto. eppure a livello di minuti funziona come un orologio. sembra perdere precisione con timer di ore e giorni.

  5. #5
    sì, probabilmente è tutto il fatto di sottrazioni che si incasina un po'
    Anche io avevo fatto una cosa simile, e avevo notato che ogni tanto sballava un po', però non in maniera costante: alle volte andava in anticipo, altre in ritardo
    23-08-2005: Udinese in cémpions lìg
    Questa estate l'ho passata a Tallin

  6. #6
    Originariamente inviato da pippo75
    sì, probabilmente è tutto il fatto di sottrazioni che si incasina un po'
    Anche io avevo fatto una cosa simile, e avevo notato che ogni tanto sballava un po', però non in maniera costante: alle volte andava in anticipo, altre in ritardo
    lo sapevooooo

    grazie del confronto, pippo... mi metto a debuggare. un ultima domanda, hai un qualche consiglio su come effettuare il debug in un caso come questo? non posso fare step con eclipse per 24 ore

  7. #7
    io avevo utilizzato uno strumento per fare i log: mi scrivevo le variabili e i valori che servivano e poi cercavo di ricostruire come funzionava la cosa
    è stato utile soprattutto perchè la mia procedura andava di notte e decisamente non avevo voglia di andare a fare il debug a quelle ore assurde
    23-08-2005: Udinese in cémpions lìg
    Questa estate l'ho passata a Tallin

  8. #8
    Originariamente inviato da pippo75
    io avevo utilizzato uno strumento per fare i log: mi scrivevo le variabili e i valori che servivano e poi cercavo di ricostruire come funzionava la cosa
    è stato utile soprattutto perchè la mia procedura andava di notte e decisamente non avevo voglia di andare a fare il debug a quelle ore assurde
    purtroppo non ho tutta questa liberta'. l'applicazione non crea log ( VVoVe: ) e non posso lasciare il pc acceso durante la notte

  9. #9
    provare a farla girare di giorno su un ambiente di test?
    e magari con un intervallo di tempo minore, così controlli che effettivamente il ricalcolo dell'intervallo sia corretto (non che serva a molto, dato che per me il calcolo è ok)
    è il fatto che a lungo andare si verifica il problema: nel medio termine va tutto a posto (almeno a me andava così)
    23-08-2005: Udinese in cémpions lìg
    Questa estate l'ho passata a Tallin

  10. #10
    Originariamente inviato da pippo75
    provare a farla girare di giorno su un ambiente di test?
    e magari con un intervallo di tempo minore, così controlli che effettivamente il ricalcolo dell'intervallo sia corretto (non che serva a molto, dato che per me il calcolo è ok)
    è il fatto che a lungo andare si verifica il problema: nel medio termine va tutto a posto (almeno a me andava così)
    esatto. il problema e' uno scarto di 40 minuti in 5 giorni. difficilmente riscontrabile in 8 ore di test.

    provo a reimplementare una mia idea, mi ci vorra' almeno una giornata ma magari funziona. se ci riesco ti faccio sapere.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.