es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Módulos de Java9: ¿Cómo ejecutar un Proveedor basado en alguna prioridad de ejecución?

Estoy utilizando módulos de Java 9 para implementar un proveedor, tengo múltiples proveedores para la interfaz de servicio. Quiero establecer alguna prioridad para los proveedores en lugar de utilizar findFirst();

Optional<serviceinterface> loader = ServiceLoader.load(ServiceInterface.class).findFirst();

Tengo el módulo service-interface de la siguiente manera:

ServiceInterface.Java

public interface ServiceInterface {
    int theAnswer();
}

module-info.java

module ServiceInterface {
    exports com.si.serviceinterface;
}

Tengo el módulo provider-module que tiene dos implementaciones para la interfaz de servicio:

Provider1.java

public class Provider1 implements ServiceInterface {
    @Override
    public int theAnswer() {
        return 42;
    }
}

Provider2.java

public class Provider2 implements ServiceInterface {
    @Override
    public int theAnswer() {
        return 52;
    }
}

module-info.java

module Provider {
  requires ServiceInterface;
  provides ServiceInterface with Provider1, Provider2;
}

Ahora, tengo el consumer-module que utilizará ServiceLoader para cargar el proveedor en lugar de utilizar findFirst() para cargar el proveedor de servicios. Quiero cargarlos en base a alguna prioridad, por ejemplo, quiero cargar Provider2 en lugar de Provider1.

Consumer.java

public class Consumer {
  public static void main(String[] args) {
    ServiceLoader<serviceinterface> loader = ServiceLoader.load(ServiceInterface.class);
    for (final ServiceInterface service : loader) {
      System.out.println("El servicio " + service.getClass().getSimpleName() + " responde " + service.theAnswer());
    }
  }
}

¿Alguna sugerencia para implementar prioridad en la carga de proveedores en lugar de utilizar findFirst()?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para implementar la prioridad para los proveedores en los módulos de Java 9, puedes utilizar el método ServiceLoader.loadInstalled() en lugar de ServiceLoader.load(). Esto cargará solo los proveedores de servicios que estén declarados en el directorio META-INF/services de la instalación de JDK, y los ejecutará en el orden especificado en los archivos dentro de ese directorio.

    Para hacer esto, debes crear un archivo llamado ServiceInterface dentro del directorio META-INF/services con el nombre completamente calificado de la interfaz de servicio, y enumerar los proveedores en el orden de prioridad. Por ejemplo, si quieres cargar Provider2 antes que Provider1, crea un archivo llamado com.si.serviceinterface.ServiceInterface con las siguientes líneas:

    com.example.Provider2
    com.example.Provider1
    

    De esta manera, cuando llames a ServiceLoader.loadInstalled(ServiceInterface.class), se cargarán los proveedores en el orden especificado en ese archivo, y podrás iterar sobre ellos en ese orden utilizando un bucle “for-each”:

    ServiceLoader<serviceinterface> loader = ServiceLoader.loadInstalled(ServiceInterface.class);
    for (final ServiceInterface service : loader) {
        System.out.println("El servicio " + service.getClass().getSimpleName() + " responde " + service.theAnswer());
    }
    

    En este caso, Provider2 se cargará y ejecutará antes que Provider1.

    Nota: El método loadInstalled() se introdujo en Java 9, por lo que es posible que no sea compatible con versiones anteriores de JDK.

Comments are closed.