Aumentar el tiempo de invisibilidad o el contenido de un mensaje en Windows Azure Storage Queues

Una de las últimas funcionalidades añadidas al sistema de queues de Windows Azure Storage es la posibilidad de actualizar un mensaje añadido con anterioridad, lo cual facilita aún más el manejo de este sistema. Los dos valores que se pueden modificar son el tiempo de invisibilidad y el contenido del mensaje. En este post vamos a ver cómo modificar ambos 🙂

En el caso de la invisibilidad lo normal es que utilicemos un mecanismo de aviso antes de que el tiempo se agote. De esta forma sabremos que nos estamos demorando en el proceso que lleva a cabo nuestro proceso, un worker role por ejemplo, y que necesitamos ampliar el tiempo que ese mensaje va a estar oculto para que ningún otro hilo o worker role lo pueda recuperar y procesar de nuevo. Un buen candidato para gestionar el tiempo que nos queda sería el objeto de tipo Timer 😀 Para usarlo podríamos utilizar el siguiente ejemplo:

var timer = new Timer();
timer.Elapsed += IncreaseInvisibility;
timer.Interval = 3540000; timer.Enabled = true;

timer.Start();

Con las líneas anteriores lo que estamos estableciendo es el tiempo que debe pasar para que, a través del método IncreaseInvisibility, aumentemos el timeout de visibilidad, o lo que es lo mismo el tiempo de más que nuestro mensaje permanecerá invisible. El intervalo debe estar especificado en milisegundos. Para este ejemplo, cuando hayan transcurrido 3540000 milisegundos (59 minutos) se ejecutará el método IcreaseInvisibility para modificar el mensaje que está en curso. Una vez que tenemos establecido “cada cuánto” vamos a especificar “el qué”.

private void IncreaseInvisibility(object sender, ElapsedEventArgs e)
{
   _operationsQueue.UpdateMessage(_message, TimeSpan.FromMinutes(60), MessageUpdateFields.Visibility);
}

Para poder modificar la invisibilidad, necesitamos hacer uso del objeto de tipo CloudQueue (en este caso, almacenado en la variable _operationsQueue), del cual hemos recuperado anteriormente el mensaje a través de GetMessage. Utilizamos el nuevo método UpdateMessage donde debemos pasarle:

  1. El objeto de tipo CloudQueueMessage, del mensaje que queremos modificar.
  2. Un TimeSpan con el tiempo que queremos ampliar la invisibilidad
  3. El campo que queremos actualizar: MessageUpdateFields.Visibility.

Nota: El tiempo máximo de invisibilidad es de 7 días.

En el caso del contenido, se me ocurre que podría ser necesario modificarlo para un par supuestos:

  1. Reutilización de mensajes dentro de un mismo contexto.
  2. Corrección de un mensaje con parámetros inválidos (De esta forma podríamos modificar el contenido para que nuestra lógica sea capaz de detectar un mensaje erróneo y eliminarlo).

Para modificar pues el contenido de un mensaje podríamos hacerlo del siguiente modo:

private void UpdateContent(CloudQueue queue, CloudQueueMessage message)
{
   message.SetMessageContent("Delete");
   queue.UpdateMessage(message, TimeSpan.FromSeconds(1), MessageUpdateFields.Content);
}

En primer lugar modificamos el contenido del mensaje a través del método SetMessageContent. Por último, utilizamos el mismo método que en el apartado anterior, UpdateMessage, pero esta vez indicando en el último parámetro que vamos a modificar el contenido en vez de la invisibilidad.

Espero que sea de utilidad 😀

¡Saludos!