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.

È stato utile?

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 il OperatorProvider 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top