Lanzar una acción cuando hay un cambio de campo producido desde el servidor


([N1] Mario) #1

Buenas,

A ver si a alguien se le ocurre alguna forma de hacerlo…
Quisiera que cuando realizo un cambio en un registro (por ejemplo un boleano por cada vClient conectado) en la base de datos, en el vClient correspondiente se lanzase una acción, pero no se me ocurre el como…
Inicialmente pensé en usar la nueva conexión de evento on_change, pero no se dispara en ese caso.
¿Alguna idea?

Saludos y gracias

Mario Valdés
Axos Soluciones


([N1] wikan) #2

Buenas, así a bote pronto,
crea una uid por cada vClient que se conecta, cada x tiempo compruebas esa tabla de uids si ha cambiado el campo que quieras y haz la acción que necesites.

  1. On load del vClient crea una uid y se guarda en una tabla de “sesiones”
  2. Mediante un timer compruebas con la frecuencia que necesites ese valor
  3. Actuas

Otra opción, quizás mas complicada
1- Abre un conexión tcp contra el servidor y la mantienes abierta
2- Al cambiar el valor le mandas el cambio al cliente que actua.


([N1] Mario) #3

Buenas Manuel, pero un timer es inaceptable. La verdad que queda horrorosamente mal el relojito pululando por ahí de continuo, a parte de recargar continuamente el cliente haciendo peticiones constantes.
La idea del TCP es buena, pero el problema que tienes es que no puedes ejecutar una acción desde un servicio TCp que afecte a la parte de la caja de la aplicación sin el uso de un timer o similar, y estamos con el primer caso.

Saludos y gracias

Mario Valdés
Axos Soluciones


([N1] wikan) #4

Y con el comando RunAction de vJavascript?
No lo he probado pero mediante js puedes ejecutar cualquier acción de cualquier proyecto.

A lo que me refiero con tcp sin cerrar conexión, nunca lo he echo, es poner un bucle for en la parte del servidor, quién comprobará el cambio del campo y cuando cambie mandará la respuesta al vClient. Es montarte long pull.
Por lo que no sobrecargas el vClient, pero si tendrás al servidor constantemente comprobando el campo.
Es decir, alguno de los dos tiene que hacer el trabajo sucio.

Ahora pensando, si te creas un pequeño script, en php, python, lo que sea, y conectas el vClient a el. El servidor solo tiene que conectarse a el y decirle, tal vClient ha cambiado. Es decir, te creas un programa conector, el vClient se conecta y mantiente la conexión abierta y el servidor se conecta a esa misma aplicación para comunicarle que vClient tiene que hacer la acción


([N1] Synetic) #5

a ver que te parece esto:
Abres un servicio tcp en la parte del cliente. Cuando te conectes al vServer registras en la tabla “conexiones” la ip y puerto del cliente. El servidor al registrar un cambio se conecta a esa ip y puerto y notifica el cambio. Ya el cliente hace lo que necesites.

Como si fuera un servicio push.


([N1] Mario) #6

Fernando, la idea es buena, el problema es que desde la caja de aplicación no puedo detectar lo que me envían por TCp a no ser que utilice un timer y eso no es nada saludable para nuestras aplicaciones.
Si el nuevo value_change se disparase cuando realmente cambia el valor del campo aun siendo por refresco terciario, lo tendríamos solventado sin problema alguno.

Saludos y gracias

Mario Valdés
Axos Soluciones


([N1] wikan) #7

Mario, no entiendo eso de que no puedes detectar por tcp. Tienes el puerto abierto y al recibir actuas en consecuencia, es más un disparador avisando que ese campo ha cambiado que una conexión. Lo que no me gusta de la idea de Fernando es que tendrías que abrir el puerto en los routers clientes para poder conectar.
Por eso era mi idea de que sean los clientes clientes conectan al servidor, así solo tendrías que abrirlo en un sitio.
Supongo por lo que dices, que necesitas casi de inmediato saber el estado de dicho campo, ya que un timer no lo quieres por la poca frecuencia.

Por eso, y de acuerdo que lo mejor sería un servicio tipo push, es mantener una conexión abierta contra los vClient y el servidor avise a dichos clientes del cambio. De echo una vez propuse unos cambios en el tcp, que fuera por eventos y dejara la conexión abierto, onConnect, onDisconnect, Send.

Supongo incluso, que usando node.js como intermediario te podría servir.
1- Los clientes al iniciar conectan con node.js usando una uid única
2- node notifica al servidor que se ha conectado un cliente con x uid
3- el servidor al modificar el cambio, mediante el trigger de la tabla notifica al node
4- node se lo notifica al cliente con x uid

Puede ser node, un script php, python, .net. Con eso consigues no sobrecargar a nadie, simplemente creas servicios tcp en cliente y servidor para tener comunicación.