Compartir a través de


Concesiones del período de duración

Los objetos MBR (Marshal-By-Reference, cálculo por referencia) no residen en la memoria eternamente, tanto si son objetos Singleton activados en el servidor como si son objetos activados en el cliente. En cambio, a no ser que el tipo reemplace a MarshalByRefObject.InitializeLifetimeService para controlar sus propias directivas referentes a la duración, cada objeto MBR tiene una duración controlada por una combinación de concesiones, un administrador de concesiones y una serie de patrocinadores. (En este caso, la duración de un objeto MBR equivale al tiempo total que el objeto permanece activo en la memoria.) Una concesión es el período de tiempo que un determinado objeto estará activo en la memoria antes de que el sistema .NET remoting comience el proceso para eliminarlo y reclamar la memoria. El administrador de concesiones del dominio de aplicación de servidor es el objeto que determina cuándo el objeto remoto debe ser reclamado por el recolector de elementos no utilizados. Un patrocinador es un objeto que solicita una nueva concesión para un determinado objeto, para lo que se registra él mismo en el administrador de concesiones.

Siempre que se utiliza de forma remota un objeto MBR fuera de su dominio de aplicación, se crea una concesión de período de duración para ese objeto. Cada dominio de aplicación contiene un administrador de concesiones que es el responsable de administrar las concesiones en su dominio. El administrador de concesiones examina periódicamente todas las concesiones para comprobar cuáles han vencido. Si una concesión ha vencido, el administrador de concesiones revisa su lista de patrocinadores para ese objeto y pregunta si alguno de ellos desea renovar la concesión. Si ninguno de los patrocinadores renueva la concesión, el administrador de concesiones quita la concesión, el objeto se elimina y la memoria que estaba ocupando es reclamada por el recolector de elementos no utilizados. Por lo tanto, la duración de un objeto puede ser mucho más larga que la de su concesión si un patrocinador la renueva más de una vez o si hay clientes que lo llaman continuamente.

Puesto que la vida útil de un objeto remoto es independiente de la de sus clientes, la concesión para un objeto sencillo o pequeño puede ser muy larga, la pueden utilizar varios clientes y la puede renovar periódicamente un administrador o un cliente. Este enfoque utiliza las concesiones de manera eficaz, porque se necesita muy poco tráfico en la red para la recolección distribuida de elementos no utilizados. Sin embargo, los objetos remotos que utilizan pocos recursos pueden tener una concesión para un período de duración breve, que el cliente renueva frecuentemente a intervalos cortos. Cuando todos los clientes han terminado con el objeto remoto, el sistema .NET remoting elimina rápidamente el objeto. Con esta táctica, en lugar de aumentar el tráfico en la red, se utilizan de una manera más eficaz los recursos del servidor.

El uso de concesiones para administrar el período de duración de los objetos remotos es un enfoque alternativo al recuento de referencias, que puede resultar complejo e ineficaz si las conexiones de red no son de confianza. Aunque se pueden configurar las concesiones para extender el período de duración de un objeto remoto más de lo estrictamente necesario, la reducción del tráfico de la red dedicado al recuento de referencias y a hacer ping a los clientes hace que las concesiones sean una solución excelente cuando están configuradas correctamente para cada escenario en particular.

En la tabla siguiente se describen las cinco principales propiedades de las concesiones.

Propiedad Descripción
InitialLeaseTime Especifica el intervalo de tiempo inicial durante el que un objeto permanecerá en la memoria antes de que el administrador de concesiones inicie el proceso para eliminarlo. En el archivo de configuración, se trata del atributo leaseTime del elemento de configuración <lifetime>. El valor predeterminado es 5 minutos. El valor cero configura la concesión con un período de duración infinito.
CurrentLeaseTime Especifica el intervalo de tiempo que queda para que la concesión venza. Cuando se renueva una concesión, su propiedad CurrentLeaseTime se configura con el valor máximo correspondiente a CurrentLeaseTime o a RenewOnCallTime.
RenewOnCallTime Especifica el intervalo de tiempo máximo en el que se establece la propiedad CurrentLeaseTime después de cada llamada remota al objeto. El valor predeterminado es 2 minutos.
SponsorshipTimeout Especifica el tiempo que aguarda el administrador de concesiones la respuesta del patrocinador cuando se ha notificado el vencimiento de una concesión. Si el patrocinador no responde en el tiempo especificado, se quita y se llama a otro. Si no hay más patrocinadores, la concesión vence y el recolector de elementos no utilizados elimina el objeto remoto. Si el valor es "0" (TimeSpan.Zero), la concesión no tendrá registrado ningún patrocinador. El valor predeterminado es 2 minutos.
LeaseManagerPollTime Especifica el tiempo durante el cual permanece inactivado el administrador de concesiones tras comprobar la presencia de concesiones vencidas. El valor predeterminado es 10 segundos.

Las concesiones se crean cuando se activa un objeto MBR en otro dominio de aplicación. En ese momento, cuando la propiedad ILease.CurrentState es LeaseState.Initial, se pueden configurar las propiedades de la concesión. Una vez configuradas, no se pueden cambiar directamente. Sólo se puede cambiar la propiedad CurrentLeaseTime, ya sea desde una llamada a ILease.Renew o cuando el administrador de concesiones llama a ISponsor.Renewal en un patrocinador y éste responde con un objeto TimeSpan. MarshalByRefObject tiene la implementación predeterminada de una concesión de período de duración y, si no se modifica en el momento de crearla, las propiedades de la concesión son siempre las mismas.

Modificar las propiedades de una concesión

Las propiedades de una concesión de período de duración se pueden modificar de dos formas:

  • Mediante la declaración de las propiedades personalizadas de la concesión de período de duración reemplazando MarshalByRefObject.InitializeLifetimeService en el objeto MBR, para establecer personalmente las propiedades de la concesión o para que se devuelva una referencia nula (Nothing en Visual Basic). La segunda opción indica al sistema .NET remoting que las instancias de este tipo deben tener un período de duración infinito.
  • El usuario o un administrador también pueden especificar las propiedades de la duración de todos los objetos de una aplicación concreta en el elemento <lifetime> del archivo de configuración de la aplicación o del equipo. Para obtener más información, vea Inicializar concesiones.

Una vez creada, una concesión se puede renovar de tres formas:

  • Un cliente llama al método ILease.Renew directamente.
  • Si la propiedad ILease.RenewOnCallTime se configura, cada llamada al objeto remoto renueva la concesión por el tiempo especificado.
  • La concesión llama a un método ISponsor.Renewal para solicitar su renovación y el patrocinador responde con un TimeSpan.

Para obtener más información, vea Renovar concesiones.

Administradores de concesiones

Los administradores de concesiones deben examinar periódicamente las concesiones para comprobar si han vencido. Cuando una concesión ha vencido, se le informa y ella misma llama a sus patrocinadores para intentar renovarse.

El administrador de concesiones también mantiene una lista de los patrocinadores cuya respuesta están esperando las concesiones vencidas. Si un patrocinador no responde en el intervalo especificado en la propiedad SponsorshipTimeOut, se quita de la lista de patrocinadores.

Cuando se permite que venza una concesión, no se aceptan más mensajes referentes a la concesión ni respuestas de los patrocinadores. La referencia de la concesión se quita de la lista de concesiones y el sistema .NET remoting quita la referencia al objeto que tiene en su tabla interna. A continuación, el sistema de recolección de elementos no utilizados quita la concesión y el objeto.

Vea también

Periodos de duración y activación de los objetos | Ejemplo de interacción remota: Períodos de duración | Esquema de la configuración de la interacción remota | ILease | RemotingServices.GetLifetimeService | MarshalByRefObject.InitializeLifetimeService Inicializar concesiones | Renovar concesiones