Ecco il mio caso d'uso.Utilizzo di Spring @Scheduled e @Async insieme
Un sistema legacy aggiorna una tabella code del database QUEUE.
voglio un processo ricorrente pianificato che - controlla il contenuto della CODA - se non ci sono righe della tabella non si blocca la riga e fa un certo lavoro - elimina la riga nella coda
Se il lavoro precedente è ancora in esecuzione, quindi verrà creata una nuova discussione per eseguire il lavoro. Voglio configurare il numero massimo di thread simultanei.
Sto usando Spring 3 e la mia soluzione attuale è quella di eseguire le seguenti operazioni (con un tasso fisso di 1 millisecondo per ottenere i thread per eseguire in pratica in modo continuo)
@Scheduled(fixedRate = 1)
@Async
public void doSchedule() throws InterruptedException {
log.debug("Start schedule");
publishWorker.start();
log.debug("End schedule");
}
<task:executor id="workerExecutor" pool-size="4" />
Questo ha creato 4 thread di getto ed i fili condiviso correttamente il carico di lavoro dalla coda. Tuttavia, sembra che si stia verificando una perdita di memoria quando i thread impiegano molto tempo per essere completati.
java.util.concurrent.ThreadPoolExecutor @ 0xe097b8f0 | 80 | 373,410,496 | 89.74%
|- java.util.concurrent.LinkedBlockingQueue @ 0xe097b940 | 48 | 373,410,136 | 89.74%
| |- java.util.concurrent.LinkedBlockingQueue$Node @ 0xe25c9d68
Così
1: Dovrei usare @Async e @Scheduled insieme?
2: In caso contrario, in quale altro modo posso utilizzare la molla per raggiungere i miei requisiti?
3: Come posso creare i nuovi thread solo quando gli altri thread sono occupati?
Grazie a tutti!
EDIT: Penso che la coda di posti di lavoro stava diventando infinitamente lungo ... Ora utilizzando
<task:executor id="workerExecutor"
pool-size="1-4"
queue-capacity="10" rejection-policy="DISCARD" />
Riferirà con risultati
lo fa non funziona correttamente senza il '@ Async'? Un metodo annotato con '@ Scheduled' dovrebbe essere eseguito in modo asincrono comunque. – ach
Se si desidera che "i thread vengano eseguiti continuamente", in primo luogo non si dovrebbe utilizzare @Scheduled. Il suo utilizzo sarebbe per attività "programmate", non continue ... – JoeG
potresti prendere in considerazione la possibilità di pubblicare publishWorker.start(); metodo Async. –