Come scegliere in fase di esecuzione tra diversi servizi OSGi in modo intelligente?
-
24-10-2019 - |
Domanda
Ho in mente un sistema intelligente in grado di scegliere tra servizi OSGi disponibili in modo dinamico. Cioè, scegliere un'implementazione o l'altro a seconda di alcuni parametri di esecuzione. Ad esempio, comunicare ad un algoritmo di esecuzione che il cambiamento un operatore dopo diverse iterazioni, oppure a seconda di bilanciamento del carico in un sistema o qualsiasi altra cosa.
while(stopCriterion){
operator.doSomething(); //There exist many operator implementations
}
Il mio primo approccio è quello di utilizzare DS per esporre i servizi e si legano con servizi 0..n e dinamica Politica. Poi, da un intelligente componente esterno, notificare l'algoritmo che uso di servizio in ogni iterazione (con EventAdmin , forse?).
operator[selected].doSomething();
Questo potrebbe aiutarmi per ridurre la complessità in cui devono essere eseguiti molti esperimenti con un sacco di diverse implementazioni del servizio. Inoltre, sto progettando di utilizzare le specifiche servizi remoti con Eclipse Communication Framework per rendere la ricerca in algoritmi distribuiti e quella roba, che appare in modo dinamico di nuove implementazioni in tempo di esecuzione potrebbe anche essere possibile
Tuttavia, non so se questa è una buona idea o esiste un'altra migliore meccanismo per selezionare in modo dinamico, che l'uso di attuazione. Credo che l'utilizzo di ServiceTracker invece DS non è una buona opzione, ma sono aperto a suggerimenti:)
Grazie in anticipo.
Soluzione
Questo mi sembra un modello di strategia, che può benissimo essere implementato utilizzando i servizi. Supponendo di avere un tipo di servizio chiamato Operator
(e hanno un'interfaccia con lo stesso nome), questo dovrebbe funzionare più o meno in questo modo:
- Creare un servizio
OperatorProvider
, che contiene le funzionalità necessarie, e alcune informazioni aggiuntive (ad esempio, quando è questa implementazione adatto), e di creare un certo numero di istanze di quella, una per ciascuna delle vostre strategie. - Creare un servizio di selezione, che implementa l'interfaccia
Operator
, e canali di tutte le chiamate al servizio per ilOperatorProvider
più adatto. Il modo in cui questo servizio seleziona il fornitore più adatto, è probabilmente parte della intelligenza. - L'utente effettivo del servizio ora ha solamente una dipendenza da un servizio
Operator
, e non deve preoccuparsi della selezione del provider.
presumo si può mettere la strategia di selezione nel servizio di selezione, ma se è davvero un componente esterno, è possibile utilizzare qualsiasi meccanismo che ti piace per gestire la comunicazione tra il componente intelligente e il selettore: un'interfaccia di servizio, eventi, ecc.
Altri suggerimenti
Credo che, una sorta di strategia dinamica modello o anche iniezione di dipendenza potrebbe soddisfare le vostre esigenze. Alcuni classe utilizza una strategia (chiamato lo operatore ) che può cambiare in fase di esecuzione. Credo che, si dispone di un altro servizio che può dire la quale strategia per l'uso (basata su parametri di esecuzione).
Un'implementazione di massima potrebbe apparire così:
public Worker {
private Operator operator; // your actual operator strategy
public void setOperator(Operator actualOperator) {
this.operator = operator;
}
public doSomething() {
while(stopCriterion) {
Operator operatorForThisIteration = operator; // pick the injected service
operatorForThisIteration.doSomething;
}
}
}
E un altro servizio, quello che può iniettare le dipendenze alle istanze dei lavoratori, sarebbe mantenere un elenco di tutte le istanze dei lavoratori, attuare una logica per scegliere un nuovo servizio e iniettare in in tutte (o alcune) i lavoratori.