Servidor de
Peticiones
El comando /RUN=SERVIDOR[:instancia]
ejecuta el sistema
en modo servidor, donde distintos servicios pueden ejecutarse. Una instancia es
la ejecución del sistema en modo servidor en una máquina determinada.
Diferentes instancias pueden ejecutarse en la misma o diferente máquina, pero
una misma instancia solo puede ser ejecutada una vez. Para configurar
instancias, se ingresa en Herramientas -> Servidor -> Instancias y se
crea una o mas instancias. Si no se incluye nombre de instancia, se toma la
DEFECTO. En la instancia puede indicarse la máquina en la que se ejecuta (se
impide su ejecución en otras) y el usuario con el cual se loguea
automáticamente el sistema. Este usuario debe ser Supervisor o al menos tener
permiso sobre "Comando /RUN"
Al ejecutar el sistema con
/RUN=SERVIDOR, el sistema se minimiza a un ícono al lado de la hora. Con botón
derecho sobre ese ícono ofrece activar o cerrar. Al darle cerrar, se cierra esa
instancia del servidor de peticiones. Si se ofrece activar, se puede cerrar
manualmente con la tecla Suprimir. Puede ejecutarse el servidor de peticiones
en cualquier máquina que tenga acceso al sistema, no es necesario ni
recomendable por razones de seguridad que sea el propio servidor Web.
Se recomienda programar el servidor
de peticiones en un tarea programada de Windows que se lanze cada 5 o 10
minutos. Si la instancia está activa, la nueva instancia se cierra
automáticamente. Si la instancia está activa pero colgada, sin responder, la
cierra y activa la nueva instancia. Esto permite asegurar de que la instancia
va a correr en todas las circunstanacias, porque si se bajó la instancia a
causa de una actualización del sistema, un error, un mantenimiento de la base,
etc, en 5 o 10 minutos se recupera automáticamente.
Uno de estos servicios que atiende
el servidor es el servicio de Peticiones Web, donde atiende peticiones cargadas
a la tabla PETICIONESSERVIDOR. El objetivo de este comando es atender
requerimientos de programas externos, tales como un servidor Web, ejecutando
comandos y devolviendo datos en formato XML o Json. La elección de utilizar una
tabla SQL y el formato XML/Json fue tomada para mantener la máxima
compatibilidad y velocidad en la interfaz, ya que virtualmente todo lenguaje de
programación en cualquier S.O. (Linux, Windows) tienen mecanismos para
consultar e insertar datos en tablas SQL. Si se emplearan otros mecanismos,
tales como OLE o Servicios Web, sería incompatible con lenguajes fuera de
Windows en el primer caso o que no tengan un soporte nativo de http y sockets
en el segundo. Por otro lado, los tiempos de respuesta son mucho mas rápidos
que en cualquiera de los otros mecanismos, por cuanto un servidor SQL es el
producto de años de desarrollo buscando la máxima perfomance en las consultas y
respuestas.
La tabla PETICIONESERVIDOR tiene los
siguientes campos:
Campo |
SQL
Server |
Descripción |
PETICION |
Int |
Código de Petición. Pueden consultarse los distintos códigos en Herramientas->Servidor->Tipos de Peticiones |
INSTANCIA |
VarChar(20) |
Nombre de Instancia que se desea que procese al petición. Si se deja en blanco lo procesa cualquier instancia. Luego de procesada se graba el nombre de la instancia que la procesó. |
IDPETICIÓN |
Int identity |
Código interno. No debe insertarse en la tabla SQL. Puede utilizarse para identificar la petición si el lenguaje del cliente de la petición. tiene forma de obtener la última identidad insertada |
IDEXTERNA |
VarChar(20) |
Código externo, puede obviarse, pero normalmente se utiliza para identificar la petición |
ESTADO |
TinyInt |
Los valores posibles son 0=En espera, 1= Procesando, 2= Procesamiento completado exitosamente, 3= Procesado con error. STATUSSALIDA contiene la cadena de error |
STATUSSALIDA |
Text |
Cadena de descripción del error, si ESTADO=3. En ciertas peticiones, si está antecedido de la palabra WARNING: se indica que la petición se llevó a cabo pero hubieron problemas |
FECHA |
Datetime |
Es utilizado por el servidor para indicar la hora de comienzo del procesamiento de la petición |
PARAMETRO1 |
Text |
Parámetro de entrada en formato XML/Json. Todos los campos indicados en cada petición deben estar presentes, aunque no sean necesarios. Si el campo es numérico y de una sola cifra, en formato XML agréguese 0 delante de manera de poner dos cifras (00), porque los valores 0 y 1 son traducidos en XML como Logical y producen un error de Parámetro inválido. |
PARAMETRO2 |
Text |
Si existe, es un parámetro de salida en formato XML/Json. El formato de salida se corresponde al usado en PARAMETRO1. Si se pasa XML, se retorna XML. Si se pasa Json, se retorna Json |
PARAMETRO3 |
Text |
Si existe, es un parámetro de salida en formato XML. En caso de que se haya usado Json en PARAMETRO1, PARAMETRO3 se agrega como un objeto con ese nombre al Json de PARAMETRO2 |
El proceso cliente que desee efectuar una petición debe insertar un registro en esta tabla, cargando los campos PETICION, ESTADO=0, IDEXTERNA y PARAMETRO1 e ingresar entonces en un loop de espera testeando el estado de la petición hasta que se haga 2 o 3. Ejemplo
INSERT
INTO PETICIONESSERVIDOR(PETICION, ESTADO, IDEXTERNA, PARAMETRO1) VALUES (300,0,”test”,"<?xml version =
"1.0" encoding="Windows-1252"
standalone="yes"?> <VFPData> <_parametro1> <legajo>48544</legajo>
<dni>25459658</dni> <password>1526</password>
<tipologueo>02</tipologueo> </_parametro1></VFPData>")
_tiempo=seconds()+10 /* <------ Tomando un timeout razonable
do while seconds()<_tiempo
SELECT * FROM PETICIONESSERVIDOR WHERE IDEXTERNA=”test”
IF ESTADO>1
…. Procesando la petición
EXIT
END
WAIT(0.2)
/* <----- Esperando un tiempo
razonable para no sobrecargar el servidor
END
....
procesando el timeout
Una vez procesada la petición puede optarse por borrarla o dejarla en la tabla como una auditoria de todas las peticiones procesadas.
Ejemplos XML de
parámetros para distintas peticiones:
Los siguientes ejemplos muestran ejemplos de XML de parámetros. Recuérdese cargar ESTADO=0 en todas ellas y solo el PARAMETRO1. Los parámetros 2 y 3 muestran ejemplos de respuesta.
PET |
PARAMETRO1 |
PARAMETRO2 |
PARAMETRO3 |
100 |
<?xml
version = "1.0" encoding="Windows-1252"
standalone="yes"?> <VFPData><peticion> <anoacademico>2002</anoacademico> <especialidad>05</especialidad> <plan>95</plan> <materia>228</materia> <comision>08</comision> <directorio>n:\bajar</directorio> </peticion></VFPData> |
|
|
101 |
<?xml
version = "1.0" encoding="Windows-1252"
standalone="yes"?> <VFPData><peticion> <archivo>n:\subir\Notas comision 2002-5-95-228-8.xls</archivo> </peticion></VFPData> |
|
|
200 |
<?xml
version = "1.0" encoding="Windows-1252"
standalone="yes"?> <VFPData> <_parametro1> <legajo>42152</legajo> <especialidad>24</especialidad> <plan>95</plan> <materia>309</materia> <mesaespecial>00</mesaespecial> <tribunal>00</tribunal> <horario>01</horario> <fecha>0000-00-00</fecha> <turno>10</turno> </_parametro1></VFPData> |
<?xml
version = "1.0" encoding="Windows-1252"
standalone="yes"?> <VFPData><_parametro2> <checksum>16MWIF</checksum> <fecha>2002-12-05</fecha> <horarioteorico>0:00</horarioteorico> <horariopractico>0:00</horariopractico> <aula>301</aula> <inscripto>jueves 5 de diciembre - Mañana</inscripto> </_parametro2></VFPData> |
|
202 |
<?xml
version = "1.0" encoding="Windows-1252"
standalone="yes"?> <VFPData><peticion> <legajo>42152</legajo> <mesaespecial>00</mesaespecial> </peticion></VFPData> |
|
|
203 |
<?xml
version = "1.0" encoding="Windows-1252"
standalone="yes"?> <VFPData><_parametro1> <legajo>42152</legajo> <especialidad>24</especialidad> <plan>95</plan> <materia>343</materia> <mesaespecial>00</mesaespecial> <fecha>0000-00-00</fecha> </_parametro1></VFPData> |
<?xml
version = "1.0" encoding="Windows-1252"
standalone="yes"?> <VFPData><_parametro2> <fecha>2002-12-06</fecha> <tribunal>0</tribunal> <nombre/> <mañana>1</mañana> <tarde/> <noche/> <turno>10</turno> </_parametro2></VFPData> |
<?xml
version = "1.0" encoding="Windows-1252"
standalone="yes"?> <VFPData><_parametro3> <condicion>No aprobó Física II</condicion> </_parametro3></VFPData> |
300 |
<?xml
version = "1.0" encoding="Windows-1252"
standalone="yes"?> <VFPData><_parametro1> <legajo>42152</legajo> <dni>24510422</dni> <tipologueo>02</tipologueo> <password>pepe<password/> </_parametro1></VFPData> |
<?xml version
= "1.0" encoding="Windows-1252"
standalone="yes"?> <VFPData><_parametro2> <nuevo/> <nombre>Oviedo, Pablo Sebastian</nombre> <especialidad>Ingeniería Industrial</especialidad> <plan>95</plan> </_parametro2></VFPData> |
|
Desde el sistema SYSACAD en Herramientas->Servidor->Tipo de peticiones se pueden obtener todas las peticiones soportadas. Hay un vínculo Ayuda en esa vista que muestra los parametros de entrada y salida de cada petición