Modèle de localisateur de services


Le modèle de localisation de services est utilisé lorsque nous souhaitons utiliser une requête JNDI pour localiser divers services. Étant donné que la recherche d'un service dans JNDI coûte cher, le modèle de localisateur de services tire parti de la technologie de mise en cache. La première fois qu'un service est demandé, le localisateur de service recherche le service dans JNDI et met en cache l'objet de service. Lorsque le même service est à nouveau demandé, le localisateur de services recherche dans son cache, ce qui peut améliorer considérablement les performances de l'application. Voici les entités de ce modèle de conception.

  • Service - Le service qui gère réellement la demande. Une référence à ce service peut être trouvée sur le serveur JNDI.

  • Contexte / Contexte initial - Contexte JNDI avec une référence au service à trouver.

  • Localisateur de services - Le localisateur de services est un point de contact unique pour obtenir des services via les services de recherche et de mise en cache JNDI.

  • Cache - Le cache stocke les références aux services afin qu'elles puissent être réutilisées.

  • Client - Le client est l'objet qui appelle le service via ServiceLocator.

En implémentant

nous allons créer ServiceLocator, InitialContext, Cache, Service comme divers objets représentant des entités. Service1 et Service2 représentent les services d'entité.

ServiceLocatorPatternDemo, notre classe de démonstration est ici en tant que client et utilisera ServiceLocator pour démontrer le modèle de conception du localisateur de services.

servicelocator_pattern_uml_diagram.jpg

Étape 1

Créer l'interface de service Service.

Service.java

public interface Service {
   public String getName();
   public void execute();
}

Étape 2

Créez le service d'entité.

Service1.java

public class Service1 implements Service {
   public void execute(){
      System.out.println("Executing Service1");
   }

   @Override
   public String getName() {
      return "Service1";
   }
}

Service2.java

public class Service2 implements Service {
   public void execute(){
      System.out.println("Executing Service2");
   }

   @Override
   public String getName() {
      return "Service2";
   }
}

Étape 3

Créer pour une requête JNDI Contexte initial.

InitialContext.java

public class InitialContext {
   public Object lookup(String jndiName){
      if(jndiName.equalsIgnoreCase("SERVICE1")){
         System.out.println("Looking up and creating a new Service1 object");
         return new Service1();
      }else if (jndiName.equalsIgnoreCase("SERVICE2")){
         System.out.println("Looking up and creating a new Service2 object");
         return new Service2();
      }
      return null;		
   }
}

Étape 4

Créer un cache.

Cache.java

import java.util.ArrayList;
import java.util.List;

public class Cache {

   private List<Service> services;

   public Cache(){
      services = new ArrayList<Service>();
   }

   public Service getService(String serviceName){
      for (Service service : services) {
         if(service.getName().equalsIgnoreCase(serviceName)){
            System.out.println("Returning cached  "+serviceName+" object");
            return service;
         }
      }
      return null;
   }

   public void addService(Service newService){
      boolean exists = false;
      for (Service service : services) {
         if(service.getName().equalsIgnoreCase(newService.getName())){
            exists = true;
         }
      }
      if(!exists){
         services.add(newService);
      }
   }
}

Étape 5

Créez un localisateur de services.

ServiceLocator.java

public class ServiceLocator {
   private static Cache cache;

   static {
      cache = new Cache();		
   }

   public static Service getService(String jndiName){

      Service service = cache.getService(jndiName);

      if(service != null){
         return service;
      }

      InitialContext context = new InitialContext();
      Service service1 = (Service)context.lookup(jndiName);
      cache.addService(service1);
      return service1;
   }
}

Étape 6

Utilisez ServiceLocator pour démontrer le modèle de conception de Service Locator.

ServiceLocatorPatternDemo.java

public class ServiceLocatorPatternDemo {
   public static void main(String[] args) {
      Service service = ServiceLocator.getService("Service1");
      service.execute();
      service = ServiceLocator.getService("Service2");
      service.execute();
      service = ServiceLocator.getService("Service1");
      service.execute();
      service = ServiceLocator.getService("Service2");
      service.execute();		
   }
}

Étape 7

Vérifiez la sortie.

Looking up and creating a new Service1 object
Executing Service1
Looking up and creating a new Service2 object
Executing Service2
Returning cached  Service1 object
Executing Service1
Returning cached  Service2 object
Executing Service2