Pregunta
· 28 mayo, 2025

Cómo usar EnsLib.SQL.InboundAdapter en tablas de IRIS

Hola comunidad,

Me preguntaba si sería posible usar algo como EnsLib.SQL.InboundAdapter con tablas en IRIS.

Esta biblioteca monitoriza cuándo se inserta un registro en una tabla de una base de datos externa, por lo que requiere un DSN para conectarse a dicha base de datos.

Mi objetivo es realizar una llamada a una API externa que tarda mucho tiempo, podría tardar casi una hora (o más) en completar sus procesos, pero no quiero bloquear el proceso principal.

Por eso estaba considerando que la producción original almacene los indicadores que necesita procesar en una tabla y, desde otra producción, monitorice cuándo se inserta un registro e invoque la API (con un tiempo de espera bastante largo) para procesarlo.

En resumen, quiero usar IRIS como un gestor de colas (similar a MSMQ) y que esté atento a los cambios para ejecutar un proceso.

¿Es posible acceder a las tablas de IRIS usando un InBoundAdapter?

¿Alguna sugerencia para lograr el mismo resultado? Es decir, tener un gestor de colas y procesar los datos a medida que entran en la cola.

Saludos cordiales
Kurro Lopez

Product version: IRIS 2021.1
$ZV: IRIS for Windows (x86-64) 2021.1.3 (Build 389U) Wed Feb 15 2023 14:50:06 EST
Comentarios (3)2
Inicie sesión o regístrese para continuar

Hola Laura,

Esa idea me la han sugerido también, y no es del todo descabellada. Pero me gustaría evitar levantar una conexión ODBC o JDBC contra si misma, por lo que estoy buscando alguna alternativa.... Igual miro como funciona internamente el componente e intento sobreescribir algunos método para que la query la realice contra una tabla interna.

Muchas gracias por tu aportación.

Buenas @Kurro Lopez.

Para una demo que tuve que hace utilicé un simple Ens.InboundAdapter en el que configuré una simple consulta SQL a la tabla que quería controlar:

Class Local.BS.GetAppointmentBS Extends Ens.BusinessService
{

Property Target As Ens.DataType.ConfigName;

Parameter SETTINGS = "Target:Basic";

Parameter ADAPTER = "Ens.InboundAdapter";

Method OnProcessInput(pRequest As %RegisteredObject, pResponse As %RegisteredObject) As %Status
{
    set tSC = $$$OK

    set selectAppointments = "SELECT PatientId, Facility, AppointmentId FROM Local_Object.Appointment WHERE AppointmentDate = ?"
    set statementAppointments = ##class(%SQL.Statement).%New()
    set statusAppointments = statementAppointments.%Prepare(selectAppointments)
    if ($$$ISOK(statusAppointments)) {
        set resultSetAppointments = statementAppointments.%Execute($H+1)
        if (resultSetAppointments.%SQLCODE = 0) {
            $$$TRACE($ZDT($H+1,4))
            while resultSetAppointments.%Next() {
                $$$TRACE("Consulta con resultados")
                set appointmentRequest = ##class(Local.Message.PatientInfoRequest).%New()
                set appointmentRequest.PatientId = resultSetAppointments.%GetData("PatientId")
                set appointmentRequest.Facility = resultSetAppointments.%GetData("Facility")
                set appointmentRequest.AppointmentId = resultSetAppointments.%GetData("AppointmentId")
                set tSC=..SendRequestAsync(..Target, appointmentRequest)            
            }
        }
    }

    Quit tSC
}

}

Le configuré un bonito intervalo de llamada:

Y con esto para mi demo fue suficiente.

Para tu caso necesitarías además controlar un campo que te permita identificar los registros nuevos o modificados (que es lo que hace en EnsLib.SQL.InboundAdapter por debajo), si tu tabla dispone de un campo de tipo fecha que refleje la última actualización/creación te bastará con almacenar en un global cuando fue la última vez que lanzaste una consulta para buscar todos los nuevos registros entre la ejecución actual y la anterior.

Si no dispones de un campo de última actualización puedes usar siempre la clave primaria en el caso de que sea un tipo numérico autoincremental, en ese caso sólo podrías controlar los nuevos registros insertados. La implementación sería igual al punto anterior, grabas el último identificador en un global y a la siguiente ejecución buscas todos los registros mayores al identificador del global.