2015-04-16 8 views
5

Ho esaminato la documentazione e ho fatto numerosi tentativi di Google per imparare, ma finora sono arrivato a mani vuote:Come si imposta per eseguire processi batch in base alla priorità?

1) Esiste un parametro impostabile che mi consenta di ottenere quanto segue? Se c'è, come lo configuro?

Vorrei impostare i processi batch in modo che, oltre alla priorità "normale", possa avere l'opzione di eseguire processi con priorità "alta" che potrebbero mettere in coda gli altri. Tra i lavori prioritari "normali", FIFO va bene. Mi piacerebbe avere record persistenti di lavori che sono stati presentati e il loro stato, preferibilmente con tentativi automatici di guasti.

Sto lavorando con Spring-Batch 3.0.3 in particolare e Spring 4.0.6 in generale. Sto inoltrando lavori da un webservice su un server JBoss AS 7.1.1.

2) Se non esiste un'implementazione immediata, potrei scrivere qualcosa (un taskExecutor?) Per raggiungere questo obiettivo? E come potrei farlo?

Ho ottenuto che il ThreadPoolExecutor suggerito funzioni, ma la classe Job è ancora intrattabile perché non riesco a trovare dove specificare la classe di un lavoro. (Per una serie di motivi, sto facendo le configurazioni in jXML, piuttosto che a livello di codice con annotazioni.) Indipendentemente da ciò che faccio, la distribuzione procede sempre con org.springframework.batch.core.job.flow.FlowJob e quindi può convertire in una diversa classe di lavoro.

risposta

0

È possibile utilizzare un ExecutorService con un PriorityBlockingQueue per gestire questo, qualcosa di simile a:

int maxThreads = 4; 
ExecutorService pool = new ThreadPoolExecutor(1, maxThreads, 1, TimeUnit.SECONDS, new PriorityBlockingQueue<Runnable>()); 

Poi, per il maggior numero di posti di lavoro come si deve:

Job job = new Job(desiredPriority); 
pool.execute(job); 

Questi avranno ordinato dal PriorityBlockingQueue in base alla priorità che hai passato a loro.

La classe di lavoro sarà implementare Runnable e comparabili:

public class Job implements Runnable, Comparable<Job> { 
    private final int priority; 

    public Job(int priority) { 
     this.priority = priority; 
    } 

    @Override 
    public int compareTo(Job o) { 
     // enforces descending order (but this is up to you) 
     if (this.priority > o.priority) { 
      return -1; 
     } else if (this.priority < o.priority) { 
      return 1; 
     } else { 
      return 0; 
     } 
    } 

    @Override 
    public void run() { 
     // do whatever needs to happen on a thread 
    } 
} 
+0

Grazie, che era più o meno quello che stavo pensando di, ma non mi ero reso conto che avrei potuto costruire l'PriorityBlockingQueue nel l'esecutore. Finora sto utilizzando org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor, principalmente perché è stato menzionato nella documentazione di Spring Batch. – lepome

+0

Credo che la mia unica preoccupazione a questo punto sia se java.util.concurrent.ThreadPoolExecutor "giocherà bene con gli altri". Sto aggiungendo un'applicazione piuttosto consistente, e sono scettico sull'integrazione. Il mio altro problema, ho capito, è che stavo cercando di rendere la classe sbagliata comparabile. (Ora, se solo riuscissi a capire l'editor dei commenti, sarei d'oro.) – lepome

+0

ThreadPoolExecutor è piuttosto comunemente usato. Tieni presente che PriorityBlockingQueue è illimitato, quindi se Runnable è di lunga durata con oggetti estremamente grandi, potresti volere un semaforo per controllare quanti ne fai la coda. – spudone

Problemi correlati