ShoriClientRegistry
Registro centralizado de instancias de ShoriClient.
Permite gestionar múltiples clientes identificados por un nombre, garantizando que cada combinación de credenciales se inicialice una sola vez y se reutilice durante toda la vida de la aplicación (patrón singleton por nombre).
Es especialmente útil en aplicaciones que manejan múltiples automatizaciones, portales o clientes de Shori distintos, como aplicaciones de escritorio (JavaFX), RDA/RPA o sistemas batch.
Ciclo de vida recomendado
Al iniciar la aplicación: llamar #register(String, String, String, String, ShoriEnvironment)
por cada automatización.
- En cualquier lugar del código: llamar
#get(String)para obtener el cliente. - Al cerrar la aplicación: llamar
#closeAll()para liberar recursos.
Ejemplo — Aplicación JavaFX con múltiples automatizaciones
Cada controller registra su propio cliente al inicializarse. Si el cliente ya fue registrado (por ejemplo, al abrir la misma ventana por segunda vez), se reutiliza sin crear una nueva conexión.
Controller JavaFX:
public class PortabilityDownloadController {
private static final String CLIENT_NAME = "portabilidad";
private PortabilitySearchService searchService;
@FXML
public void initialize() {
// Registra el cliente solo la primera vez. Si ya existe, no lo recrea.
ShoriClientRegistry.register(
CLIENT_NAME,
"portal-portabilidad-documentId",
"tenant-portabilidad-documentId",
"api-key-portabilidad",
ShoriEnvironment.PROD
);
searchService = new PortabilitySearchService();
}
}
Modelo JavaFX (extends Service):
public class PortabilitySearchService extends Service> {
private static final String CLIENT_NAME = "portabilidad";
@Override
protected Task> createTask() {
return new Task<>() {
@Override
protected List call() {
// Obtiene el cliente sin necesidad de pasar credenciales.
ShoriClient client = ShoriClientRegistry.get(CLIENT_NAME);
return client.caso().searchAll(
CaseFilter.builder()
.casoTypeId(FilterOperator.EQ, "producto-documentId")
.build()
);
}
};
}
}
Application JavaFX — cierre limpio:
public class RdaHubApp extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
// Mostrar UI principal
}
@Override
public void stop() throws Exception {
// Cierra todos los clientes registrados al cerrar la app
ShoriClientRegistry.closeAll();
}
}
Ejemplo — Spring Boot (alternativa al @Bean)
@Configuration
public class ShoriConfiguration {
@PostConstruct
public void init() {
ShoriClientRegistry.register("main",
portalId, tenantId, apiKey, ShoriEnvironment.PROD);
}
@PreDestroy
public void destroy() {
ShoriClientRegistry.closeAll();
}
}
Campos
| Campo | Tipo | Restricciones | Descripción |
|---|---|---|---|
clients | Map\<String, ShoriClient> | Opcional | Mapa interno: nombre → instancia del cliente. |
Metodos
register(String name, String portalId, String tenantId, String apiKey, ShoriEnvironment environment)
Registra un nuevo cliente identificado por name.
Si ya existe un cliente registrado con ese nombre, no lo recrea — devuelve el existente. Esto garantiza que el pool de conexiones y el token de autenticación se inicialicen una sola vez, aunque el mismo controller se abra múltiples veces.
// Primera llamada: crea el cliente y lo registra
ShoriClientRegistry.register("portabilidad", portal, tenant, key, ShoriEnvironment.PROD);
// Segunda llamada con el mismo nombre: devuelve el mismo cliente sin recrearlo
ShoriClientRegistry.register("portabilidad", portal, tenant, key, ShoriEnvironment.PROD);
Parametros:
name— Nombre único que identifica esta automatización/cliente. Convención sugerida: nombre corto en minúsculas, sin espacios (ej:"portabilidad","activaciones","csc")portalId— UUID del portal de ShoritenantId— UUID del tenant de ShoriapiKey— Clave de API para autenticaciónenvironment— Ambiente de Shori (ShoriEnvironment#DEV,ShoriEnvironment#UAToShoriEnvironment#PROD)
Retorna: El cliente registrado (existente o recién creado)
register(String name, String portalId, String tenantId, String apiKey, ShoriEnvironment environment, boolean allowInsecureSsl)
Registra un cliente especificando solo si debe aceptar SSL auto-firmado.
Útil para ambientes UAT/DEV donde los servidores tienen certificados auto-firmados, sin necesidad de configurar timeout ni conexiones.
// UAT con certificado auto-firmado
ShoriClientRegistry.register("portabilidad",
portalId, tenantId, apiKey, ShoriEnvironment.UAT, true);
// PROD con SSL verificado
ShoriClientRegistry.register("portabilidad",
portalId, tenantId, apiKey, ShoriEnvironment.PROD, false);
Parametros:
name— Nombre único del clienteportalId— UUID del portaltenantId— UUID del tenantapiKey— Clave de APIenvironment— Ambiente de ShoriallowInsecureSsl—truepara aceptar SSL auto-firmado (solo UAT/DEV)
Retorna: El cliente registrado (existente o recién creado)
register(String name, String portalId, String tenantId, String apiKey, ShoriEnvironment environment, boolean allowInsecureSsl, int timeoutSeconds, int maxConnections)
Registra un cliente con configuración avanzada (timeout, SSL, conexiones).
ShoriClientRegistry.register("portabilidad",
portalId, tenantId, apiKey, ShoriEnvironment.UAT,
true, // allowInsecureSsl — para UAT con certificados auto-firmados
60, // timeoutSeconds
10 // maxConnections por módulo
);
Parametros:
name— Nombre único del clienteportalId— UUID del portaltenantId— UUID del tenantapiKey— Clave de APIenvironment— Ambiente de ShoriallowInsecureSsl—truepara aceptar SSL auto-firmado (solo UAT/DEV)timeoutSeconds— Timeout por request en segundosmaxConnections— Número máximo de conexiones simultáneas por módulo. El total del pool serámaxConnections × 3(hay 3 módulos: caso, repo, identify).
Retorna: El cliente registrado (existente o recién creado)
get(String name)
Obtiene el cliente registrado bajo el nombre dado.
// En cualquier modelo, service o clase que necesite el cliente:
ShoriClient client = ShoriClientRegistry.get("portabilidad");
List casos = client.caso().searchAll(...);
Parametros:
name— Nombre del cliente previamente registrado con#register
Retorna: Instancia de ShoriClient lista para usar
Lanza:
IllegalStateException— si no existe un cliente con ese nombre. Asegúrate de llamar#registerantes de#get.
isRegistered(String name)
Verifica si ya existe un cliente registrado con el nombre dado.
if (!ShoriClientRegistry.isRegistered("portabilidad")) {
ShoriClientRegistry.register("portabilidad", ...);
}
Parametros:
name— Nombre a verificar
closeAll()
Cierra todos los clientes registrados y limpia el registro.
Libera el pool de conexiones HTTP de cada cliente de forma ordenada. Debe llamarse al cerrar la aplicación.
En JavaFX, llámalo en Application.stop():
@Override
public void stop() throws Exception {
ShoriClientRegistry.closeAll();
}
En Spring Boot, si usas el registry en lugar de @Bean, llámalo en @PreDestroy
Ejemplo:
@PreDestroy
public void destroy() {
ShoriClientRegistry.closeAll();
}
close(String name)
Cierra y elimina un cliente específico del registro.
Útil cuando una automatización termina y quieres liberar sus recursos sin cerrar los demás clientes activos.
// Al cerrar una ventana específica de automatización
ShoriClientRegistry.close("portabilidad");
Parametros:
name— Nombre del cliente a cerrar