Questo è il problema strettamente correlato al lavoro scheduling . Ma ci sono due problemi da considerare:
1) I tuoi clienti sono liberi di scegliere il lavoro che desiderano. Sanno quando arrivano nuovi posti di lavoro e possono scegliere quello che vogliono. Se vuoi davvero controllare ciò che fanno, dovresti davvero limitare ciò che sanno e riservare per l'elaborazione.
2) Prima di approfondire approfonditamente i dettagli e le implementazioni di come dovrebbero funzionare tutte le operazioni di pianificazione e di query, è necessario prima rispondere alle seguenti domande:
- Che cosa desidero dalla pianificazione del mio sistema: determinismo, correttezza o efficienza di utilizzo?
- Voglio che i miei lavori vengano gestiti prima possibile?
- O voglio gestire nuovi lavori prima del vecchio?
- O vecchio prima del nuovo?
- O ci sono altre proprietà dei lavori (durata stimata,
tag) che dovrebbe determinare la loro programmazione?
- Posso interrompere preventivamente (mettere in pausa, interrompere) il lavoro per gestirne una nuova
uno (non il tuo caso, ma comunque)?
- E altre domande simili ...
Come ho capito per ora vuoi:
Gestire i nuovi lavori il prima possibile, ma non permettere mai che i vecchi lavori siano non elaborati.
La soluzione più semplice è l'elaborazione simile a FIFO con un produttore di lavoro, ma più gestori di lavoro.
Posso suggerirti qualcosa del tipo:
// Job - the data needed to process the job
public interface IJob {...}
// Client - client that handles the jobs - IJobScheduler can suggest JobClient to
// requery for a new job if needed.
public interface IJobClient
{
void SuggestQueryForNextJob();
}
// Each JobClient has its own JobQuery(IJobScheduler knows what to show to each of it).
// JobClient can query the next job or notify about the current one.
public interface IJobQueue
{
bool TryQueryNextJob(ref IJob nextJob);
void NotifyAboutJob(JobCompletionState jobCompState)
}
// Your main server, that allows JobConsumers to register themselves for job handling
public interface IJobScheduler
{
IJobQueue RegisterConsumer(IJobConsumer consumer);
}
Questo schema concentrerà tutta la pianificazione sul tuo JobProducer
, in realtà consentendo praticamente qualsiasi modalità di programmazione possibile.
Richiederà la sua giusta quota di proxy e altre cose, ma semplificherà notevolmente il tuo JobClients
.