2010-06-08 7 views
5

La classe SimpleThreadPool livrée avec Quartz Scheduler n'a pas de comportement FIFO. Je veux m'assurer que si je continue à ajouter des tâches à l'ordonnanceur, elles sont traitées selon le principe Premier entré, premier sorti. Y a-t-il un ThreadPool disponible pour cela? Ou y a-t-il un autre moyen d'y parvenir?Quartz scheduler theadpool

Répondre

5

Vous pouvez y parvenir en déléguant à un ThreadPoolExecutor avec une file d'attente FIFO, comme suit:

public class DelegatingThreadPool implements ThreadPool { 

private int size = 5; //Fix this up if you like 
private final ThreadPoolExecutor executor = new ThreadPoolExecutor(size, size, 
            0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); 

public boolean runInThread(Runnable runnable) { 
    synchronized (executor) { 
     if (executor.getActiveCount() == size) { 
      return false; 
     } 
     executor.submit(runnable); 
     return true; 
    } 
} 

public int blockForAvailableThreads() { 
    synchronized (executor) { 
     return executor.getActiveCount(); 
    } 
} 

public void initialize() throws SchedulerConfigException { 
    //noop 
} 

public void shutdown(boolean waitForJobsToComplete) { 
    //No impl provided for wait, write one if you like 
    executor.shutdownNow(); 
} 

public int getPoolSize() { 
    return size; 
} 

public void setInstanceId(String schedInstId) { 
    //Do what you like here 
} 

public void setInstanceName(String schedName) { 
    //Do what you like here 
} 

Il est possible que le nombre actif de executables ne correspond pas exactement le nombre exact de tâches qui exécutent. Vous devez ajouter un verrou et utiliser le paramètre beforeExecute pour vous assurer que la tâche a démarré si cela est nécessaire.

+0

Ceci est un bon exemple, je vais essayer cela. – Shamik