View Full Version : [JAVA] Sincronizzare un processo con l'orario attuale + intervallo
JohnMarston
29-07-2015, 14:33
Ciao! Posto il codice per rendere l'idea di quello che voglio fare.
final ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
service.scheduleWithFixedDelay(new Runnable(){
@Override
public void run(){
esegui();
}
}, 0, 1, TimeUnit.MINUTES);
Il metodo esegui(), ad ogni minuto viene processato partendo dall'orario in cui è lanciato il programma.
E questo non va bene, perché lo devo sincronizzare con un altra applicazione esterna (indipendente). :mc:
Quindi ho bisogno di fissare un orario e da lì partire con un intervallo di 60 secondi...
Come impostereste la cosa?
Grazie!
tomminno
29-07-2015, 15:10
Se devi sincronizzare con un'applicazione esterna, fissare un orario di avvio è concettualmente sbagliato. Chi ti garantisce che l'altra applicazione partirà a quell'ora?
Devi trovare un modo per far comunicare i 2 processi. Di metodi ce ne sono tanti dal più barbino tipo file watcher sul secondo processo e scrittura file sul primo, ad uno qualunque dei vari metodi IPC: Pipe, RMI, JMS, Socket, Webservice SOAP/REST,...
Il secondo argomento di scheduleWithFixedDelay rappresenta un delay iniziale. Calcola quante unità di tempo devi aspettare, nel tuo caso minuti, e passalo come valore.
Come ha detto tomminno se puoi trova un'altro modo per far comunicare i due programmi. Può sembrare semplice ma avere a che fare con il "tempo" è incredibilmente complicato.
JohnMarston
29-07-2015, 16:19
no... nonononono no... no... :D
ehmmm.... non ho modo di far comunicare le due applicazioni... voglio dire...
no nonononono no... Mi rifiuto!!!
Credetemi è un lavoraccio e ho già pochi capelli... Volete che li perda completamente??
Ma scusate non esiste, che ne so, un timer che all'x secondo, preciso e spaccato fa quello che deve fare indipendentemente da quando avvio il programma??
JohnMarston
29-07-2015, 16:25
Il secondo argomento di scheduleWithFixedDelay rappresenta un delay iniziale. Calcola quante unità di tempo devi aspettare, nel tuo caso minuti, e passalo come valore.
Scusa eh, ma il codice sopra non fa già quello che hai detto?
Ho un intervallo, 1 minuto per l'esattezza. Ma questo intervallo è calcolato da quando parte il programma. Quindi posso essere in anticipo o in ritardo a seconda dell'orario in cui avvio.
Don[ITA]
29-07-2015, 16:46
Il secondo argomento che passi tu è 0, non 1 :cool:
tomminno
29-07-2015, 17:45
Scusa eh, ma il codice sopra non fa già quello che hai detto?
Ho un intervallo, 1 minuto per l'esattezza. Ma questo intervallo è calcolato da quando parte il programma. Quindi posso essere in anticipo o in ritardo a seconda dell'orario in cui avvio.
Scusa ma non ho capito il tuo problema. Te vuoi ad esempio avviare la tua applicazione alle 11:00? Usa lo scheduler del sistema operativo per farlo.
Se poi hai il problema di non sapere quale sia l'orario giusto in cui far partire la tua applicazione rientriamo nel discorso di IPC.
JohnMarston
29-07-2015, 18:48
;42713928']Il secondo argomento che passi tu è 0, non 1 :cool:
certo perché al primo avvio mi aspetto che processi, poi passa il minuto e processa nuovamente.. Da quel momento in poi lavora ad ogni intervallo impostato...
JohnMarston
29-07-2015, 18:53
Scusa ma non ho capito il tuo problema. Te vuoi ad esempio avviare la tua applicazione alle 11:00?
Facciamo che ad un X secondo preciso processa. Per esempio, tengo conto 30:
18:50:30 -> processa
18:51:30 -> processa
18:52:30 -> processa
18:53:30 -> processa
18:54:30 -> processa
...-> processa
L'intervallo è sempre 1 minuto..
Ah quindi il problema era mantenere costante l'intervallo tra i vari eventi. In questo caso devi usare scheduleAtFixedRate al posto di scheduleWithFixedDelay.
JohnMarston
30-07-2015, 09:18
Ah quindi il problema era mantenere costante l'intervallo tra i vari eventi. In questo caso devi usare scheduleAtFixedRate al posto di scheduleWithFixedDelay.
Quindi a tuo dire, con scheduleAtFixedRate, indipendentemente dall'orario in cui lancio il programma, il processo viene eseguito a preciso X secondo con intervallo di 1 minuto?
Se non ti scoccia, puoi postarmi un esempio, per farmi capire meglio?
public class Test {
private static void doStuff() {
try {
Thread.sleep(new Random().nextInt(3000));
} catch (InterruptedException ignored) {
}
}
public static void main(String... args) {
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
executor.scheduleAtFixedRate(() -> {
System.out.println(LocalTime.now());
doStuff();
}, 0, 5, TimeUnit.SECONDS);
}
}
JohnMarston
31-07-2015, 08:46
public class Test {
private static void doStuff() {
try {
Thread.sleep(new Random().nextInt(3000));
} catch (InterruptedException ignored) {
}
}
public static void main(String... args) {
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
executor.scheduleAtFixedRate(() -> {
System.out.println(LocalTime.now());
doStuff();
}, 0, 5, TimeUnit.SECONDS);
}
}
Quindi scheduleWithFixedDelay avvia il processo con il delay da quando termina il precedente, mentre scheduleAtFixedRate ogni X secondi tra un'esecuzione e l'altra non tenendo conto del tempo impiegato nel processare quello precedente.
Direi che ci siamo, ma se io volessi far partire il delay ad un preciso secondo? Questo è quello che sto in realtà, cercando di fare.
Tra l'altro ho notato una cosa strana, per niente familiare nel tuo codice...
Cosa sta ad indicare questo segno ->?? Mai visto! :fiufiu:
Grazie!
Direi che ci siamo, ma se io volessi far partire il delay ad un preciso secondo? Questo è quello che sto in realtà, cercando di fare.
Devi usare il secondo parametro come ti ho detto nel primo messaggio per ritardare la prima esecuzione del numero di secondi necessari.
Tra l'altro ho notato una cosa strana, per niente familiare nel tuo codice...
Cosa sta ad indicare questo segno ->?? Mai visto! :fiufiu:
Lambda expression. È una roba che hanno introdotto in java 8.
JohnMarston
31-07-2015, 11:56
Devi usare il secondo parametro come ti ho detto nel primo messaggio per ritardare la prima esecuzione del numero di secondi necessari.
Ma scusa eh, ma io non devo attendere X secondi, ma far partire il processo a X secondo preciso e spaccato.
Stabilisco, per esempio, che a, XX:XX:30, esegue... Quindi mi aspetto che al secondo minuto sempre a 30 secondi processi. Intendo orario preciso.
Ho provato ad inserire il secondo parametro, ma il problema è che attende tanto quanto il secondo parametro è impostato, ma non tiene conto dell'orario che deve processare. Poi magari ho sbagliato io ma credo che manchi qualcosa.
Ma scusa eh, ma io non devo attendere X secondi, ma far partire il processo a X secondo preciso e spaccato.
Se sono le XX:XX:12 e gli dici di aspettare 18 secondi prima di far partire il tutto poi parte alle XX:XX:30.
JohnMarston
31-07-2015, 15:50
Se sono le XX:XX:12 e gli dici di aspettare 18 secondi prima di far partire il tutto poi parte alle XX:XX:30.
Ok, ma perdona se insisto, io non so a che secondo il programma viene attivato. Quindi dovrei fare in modo che se mancano X secondi al secondo stabilito inizia a conteggiare l'intervallo di 1 minuto in modo tale che al minuto successivo al secondo spaccato processa. Questo è il mio problema, non è tanto l intervallo di tempo, ma far partire e sincronizzare il processo.
Don[ITA]
31-07-2015, 16:54
Ok, ma perdona se insisto, io non so a che secondo il programma viene attivato. Quindi dovrei fare in modo che se mancano X secondi al secondo stabilito inizia a conteggiare l'intervallo di 1 minuto in modo tale che al minuto successivo al secondo spaccato processa. Questo è il mio problema, non è tanto l intervallo di tempo, ma far partire e sincronizzare il processo.
Per saperlo basta semplicemente allocare un oggetto di tipoDate (http://docs.oracle.com/javase/7/docs/api/java/util/Date.html#Date()) utilizzando il costruttore base. :read:
Cya!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.