Definiendo el estado del servicio [traducción]

Introducción

Esta traducción es un pequeño fragmento del libro “Professional Microsoft Robotics Developer Studio” que he leído. Corresponde al capítulo 3 de dicho libro, Decentralized Software Services. El servicio es el bloque de construcción básico de MRDS, espero que esta pequeña traducción ayude a comprender mejor esta magnifica herramienta de Microsoft.

Traducción

El concepto de estado de servicio implica que debería contener toda la información necesaria para permitir salvar el estado, reiniciar el servicio posteriormente y cargando el estado salvado, continuar con la ejecución donde el servicio se apagó. El estado del servicio está disponible vía las operaciones Get y HttpGet. La operación Get está pensada para ser usada de manera programática, mientras que HttpGet está pensada con propósitos humanos, viendo el estado observando un navegador web.

La forma más simple, es mostrar el estado como un XML. Además, se puede iniciar el servicio sin necesidad de programar un interfaz de usuario. […]

[…]los siguientes pasos sirven para definir el estado de un servicio:

  1. Abres ServiceB en Visual Studio, dentro de éste el archivo llamado ServiceBTypes.cs.
  2. Baja el puntero hasta el estado del servicio y añade dos líneas como se puede ver aquí:

/// < summary >
/// The ServiceB State
/// < /summary >
[DataContract()]
public class ServiceBState
{
	[DataMember]
	public int Interval; 	// definido como público y
	[DataMember] // decorado con el atributo DataMember
	public int SensorValue;
}

 

Estos campos son parte del contrato del servicio y pueden ser serializados (a XML)cuando el estado es salvado o enviado en un mensaje.Si se declaran como privados serán ignorados durante la serialización.

Los puristas prefieren realizar una declaración como la siguiente:

private int _interval;

[DataMember]
public int Interval
{
	get { return _interval; }
	set { _interval = value; }
}

 

Debemos tener en cuenta que el atributo [DisplayName] únicamente puede ser aplicado a una propiedad no a un campo público.

3. Ahora el estado para el ServiceB contiene algunos campos, volvemos a ServiceB y rectificamos la función MainLoop como se muestra:

// Global flag to allow terminating the Main Loop
private bool _shutdown = false;

private IEnumerator < ITask > MainLoop()
{
	Random r = new Random();
	while (!_shutdown)
	{
		// Generate a random number from 0-100 and save it in the state
		_state.SensorValue = r.Next(100);
		Console.WriteLine(“B: “ + _state.SensorValue);
		// Wait a while
		yield return Arbiter.Receive(
			false,
			TimeoutPort(_state.Interval),
			delegate(DateTime time)
			{ }
		);
	}
}

 

Los cambios son como siguen:

  • Hemos añadido una bandera llamada _shutdown.
  • El bucle while ahora usa dicha bandera y puede finalizar.
  • Los valores aleatorios pueden almacenarse la propiedad state SensorValue.
  • El el intervalo del timer es leído desde la propiedad state Interval.

[…]

Anuncios
Deja un comentario

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: