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()
?
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 deServiceLoader.load()
. Esto cargará solo los proveedores de servicios que estén declarados en el directorioMETA-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 directorioMETA-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 cargarProvider2
antes queProvider1
, crea un archivo llamadocom.si.serviceinterface.ServiceInterface
con las siguientes líneas: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”:En este caso,
Provider2
se cargará y ejecutará antes queProvider1
.Nota: El método
loadInstalled()
se introdujo en Java 9, por lo que es posible que no sea compatible con versiones anteriores de JDK.