Saltar al contenido principal

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, ShoriClient) 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, ShoriClient.builder()
.environment(ShoriEnvironment.UAT)
.portalId("portalId")
.tenantId("tenantId")
.apiKey("apiKey")
.timeoutSeconds(60)
.downloadPath("C:\\Users\\jramiror\\sdk")
.build());
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("portabilidad", ShoriClient.builder()
.environment(ShoriEnvironment.UAT)
.portalId("portalId")
.tenantId("tenantId")
.apiKey("apiKey")
.timeoutSeconds(60)
.downloadPath("C:\\Users\\jramiror\\sdk")
.build());
}

@PreDestroy
public void destroy() {
ShoriClientRegistry.closeAll();
}
}

Campos​

CampoTipoRestriccionesDescripción
clientsMap\<String, ShoriClient>OpcionalMapa interno: nombre → instancia del cliente.

Metodos​

register(String name, ShoriClient shoriClient)​

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", ShoriClient.builder()
.environment(ShoriEnvironment.UAT)
.portalId("portalId")
.tenantId("tenantId")
.apiKey("apiKey")
.timeoutSeconds(60)
.downloadPath("C:\\Users\\jramiror\\sdk")
.build());

// Segunda llamada con el mismo nombre: devuelve el mismo cliente sin recrearlo
ShoriClientRegistry.register("portabilidad", ShoriClient.builder()
.environment(ShoriEnvironment.UAT)
.portalId("portalId")
.tenantId("tenantId")
.apiKey("apiKey")
.timeoutSeconds(60)
.downloadPath("C:\\Users\\jramiror\\sdk")
.build());

Parametros:

  • name — Nombre único que identifica esta automatización/cliente. Convención sugerida: nombre corto en minúsculas, sin espacios (ej: "portabilidad", "activaciones", "csc")
  • shoriClient — Cliente a registrar (ShoriClient

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 #register antes 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