2017-07-14 1 views
0

Je travaille sur une application OSGi (avec les annotations scr de felix) qui expose un service. Le service s'enregistre avec des API externes en transmettant des valeurs de chaîne.Transmettre les paramètres d'exécution au service dans les annotations OSGi felix scr

listener.addSchemaChangeListener(new ChangeListener() 
      { 
       @Override 
       public void schemaChange(ChangeEvent changeEvent) 
       { 
        String schemaName = changeEvent.getSchemaName(); 

        if (null != myBuilder && schemaList.contains(schemaName)) 
        { 
         initVariables(); 
        } 
       } 
      }, "SCHEMA1"); 

service utilise la pièce au-dessus du code pour enregistrer les auditeurs pour les valeurs mulitple « de Schema1 », « Schema1 », « schéma3 » ... Je prévois de réutiliser ce service dans différents faisceaux. Mais je veux écouter seulement les changements SCHEMA1 au lieu de tous.

@reference (name = "ServiceListener" », politique = ReferencePolicy.DYNAMIC, cardinalité = ReferenceCardinality.MANDATORY_UNARY, bind = "bind", unbind = "unbind", ReferenceInterface = ServiceListener.class) AtomicReference privé myServiceListener = new AtomicReference <>();

Si je tente de l'utiliser dans un autre service avec @reference alors il n'y a aucune disposition pour transmettre des valeurs au service pour écouter uniquement les changements de schéma particulier afin que la le service peut être r J'ai traversé mon paquet en passant seulement la liste des schémas pour écouter au lieu de tout. Parce que la méthode activate sera appelée une fois que le service est correctement lié dans la classe d'utilisation (composant). Y at-il une disposition dans OSGi pour réaliser cette fonctionnalité?

Répondre

0

Une façon consiste à créer un service pour chaque schéma. Vous pouvez le faire en fournissant le nom du schéma en tant que valeur de configuration et en utilisant plusieurs configurations. Chaque service aura alors également ce paramètre de configuration en tant que propriété de service. Les clients peuvent alors filtrer pour la propriété de schéma. Si vous ne voulez pas utiliser ces configurations, vous pouvez créer un service qui offre une usine. Chaque client lierait alors l'usine et créerait une instance en fournissant le nom du schéma dans la méthode create de l'usine.

3

Vous avez inclus très peu de description du fonctionnement de votre application, ce qui rend cette question difficile à répondre. À partir du code que vous avez partagé, il semble que vous suiviez un mauvais modèle. Le modèle d'écouteur est une source de nombreux problèmes de synchronisation et de fuites de mémoire, et le modèle de tableau blanc devrait être préféré lorsque vous êtes dans OSGi.

Le motif de tableau blanc est assez simple. Plutôt que de demander à chaque auditeur de rechercher un service et de s'enregistrer auprès de lui, vous inversez le modèle. La source des événements (dans ce cas, les modifications de schéma) recherche les services d'écoute enregistrés dans le registre du service OSGi. De cette façon, les écouteurs sont simples à écrire et à filtrer, et il n'y a pas de logique d'ajout/suppression d'ajout ou de suppression au code.

Un meilleur modèle utiliserait les propriétés de service pour sélectionner des schémas particuliers et ressemblerait à ceci (en utilisant les annotations OSGi standard).

Listener 1 (écoute des changements pour SCHEMA1)

@Component(
    property="schemaName=SCHEMA1") 
public class MyListener implements ChangeListener { 
    // Your implementation in here 
} 

Listener 2 (Ecoutes aux changements pour SCHEMA1, SCHEMA2 et schéma3)

@Component(
    property={"schemaName=SCHEMA1", 
       "schemaName=SCHEMA2", 
       "schemaName=SCHEMA3"}) 
public class MyListener implements ChangeListener { 
    // Your implementation in here 
} 

Exemple Source d'événements pour Schema1:

@Component 
public class MyListener implements ChangeListener { 

    @Reference(policy=DYNAMIC, target="(schemaName=SCHEMA1)") 
    private final List<ChangeListener> listeners = new CopyOnWriteArrayList<>(); 

    private void onSchemaChange(ChangeEvent event) { 
     listeners.forEach(l -> l.schemaChange(event); 
    } 

    // Rest of your implementation in here 
}