2009-06-29 7 views
10

Tengo un servidor que utiliza el marco de actores remotos para comunicarse con múltiples clientes. Como mencioné en this question, tengo problemas para saber cuándo desaparece un cliente. Por lo tanto, mi servidor todavía está intentando enviar mensajes a clientes inexistentes.¿Qué hace el marco remote-actor si intenta escribir a un cliente que ya no está?

  • ¿Esto es un problema? (No veo excepciones lanzadas - pero supongo que habrá problemas de memoria si mi servidor es de larga duración)
  • ¿Cómo puedo detectar que un mensaje está siendo enviado a un cliente que ya no está escuchando? (Si quiero poner en práctica algún tipo de conexión limpieza)
+0

¿Has echado un vistazo al miembro trapExit del atributo Actor? Está documentado aquí: http: //www.scala-lang.org/docu/files/actors-api/actors_api_guide_1.html – djondal

Respuesta

1

OK, voy a arriesgar algo aquí.

descargo de responsabilidad: a pesar de lo que leerá a continuación, es posible que desee start here.

No estoy familiarizado con Scala, pero utiliza principios similares a los de Erlang y me siento algo cómodo allí. Sin embargo, lo que me confunde con tu pregunta tiene poco que ver con esto. Pero más con la relación cliente-servidor que pareces estar estableciendo.

Por definición, un servidor no seguirá enviando mensajes al cliente a menos que reciba una solicitud. Es decir, la clase de actor de servidor debe construirse (no necesariamente siempre) alrededor de las declaraciones de casos que verifican el mensaje recibido y actúan en consecuencia. Por lo tanto, en este contexto, el cliente ya existe y el servidor no debería preocuparse por ello y, en su lugar, debe enviar su mensaje de respuesta con normalidad, ya que el cliente simplemente hizo consciente su presencia con una solicitud.

Así que si su servidor todavía está tratando de enviar mensajes a los clientes, a pesar de que se han cerrado, me parece que está tratando de enviar mensajes a pesar de no haber recibido ninguna solicitud. Esto es fundamentalmente incorrecto en el contexto de una relación cliente-servidor. El servidor solo debe reaccionar bajo petición. De lo contrario, asume el papel del cliente.

En cualquier caso, puede (y debe) definir el final de cualquier conversación cliente-servidor. Esto ayudará a liberar recursos y finalizar las conexiones establecidas. Para tal efecto:

  1. Su agente cliente debe enviar una parada mensaje al servidor y terminar su ejecución con lo Scala función de salida ha puesto en marcha para la clase de actor.

  2. Al recibir un mensaje de detención, el actor del servidor debe no responder al cliente. En su lugar, debe hacer su limpieza (si corresponde) y finalizar la ejecución de manera similar al actor del cliente.

De esta manera garantiza la terminación adecuada de todos los actores involucrados y una correcta liberación de recursos.

Espero que esto ayude de alguna manera. Lamentablemente, no estoy familiarizado con Scala. De lo contrario, podría traer algún código. Pero el enlace de arriba debería ayudar, con suerte.

+2

Me temo que este enfoque simplemente no funciona. No se puede garantizar que el método * stop * se envíe al servidor y, cuando esto sucede, el buzón del canal * del servidor * proxy * para el actor cliente se llena y, finalmente, el servidor se bloquea a medida que se agota la memoria. He descubierto que el único mecanismo es que los clientes renueven un "contrato de arrendamiento" en un temporizador: el servidor comprueba periódicamente los contratos de alquiler y los que caducan se descartan –

+0

+1. Estoy de acuerdo, oxbow. Pero todavía codificaría eso alrededor de un mensaje de detención para una terminación normal y más rápida en aquellos casos en que se recibe el mensaje. –

Cuestiones relacionadas