Agora que vocês já sabem o que são filas (ou queues), vou contar aqui como utilizá-las, com código. Vou seguir com um exemplo extremamente simples, presente no próprio Azure Services Training Kit. Se você não viu ainda nada de Azure Storage, recomendo dar uma olhada antes. Aqui no blog tem bastante coisa.

Queues funcionam assim: você abre um projeto qualquer, adiciona as referências do Azure, no caso a do Sample de storage do SDK que já mencionei antes, o StorageClient, e o do Astoria. Isso é tudo que precisamos. Então cria uma obtém uma fila, cria uma mensagem e a envia. Simples assim.

O código abaixo coloca um texto simples de uma fila chamada “messages”. O texto vem do textbox “txtMessage”, como pode ser visto na penúltima linha. A fila é criada antes se não existe (veja chamadas a “DoesQueueExist” e “CreateQueue”).

            StorageAccountInfo account = new StorageAccountInfo(
                baseUri,
                null,
                accountName,
                accountKey);

            QueueStorage service = QueueStorage.Create(account);

            MessageQueue queue = service.GetQueue("messages");

            if (!queue.DoesQueueExist())
            {
                queue.CreateQueue();
            }

            Message msg = new Message(txtMessage.Text);
            queue.PutMessage(msg);

Isso é tudo para colocar uma mensagem na fila. E para tirar? Simplificando um pouco, é o que está abaixo. Note que ele cria a conta também, verifica se a fila existe, e então puxa uma mensagem. Se a mensagem existe ele a escreve no log do RoleManager. Simples assim. Depois disso seria somente verificar novamente após algum intervalo, e fazer isso infinitamente. É por isso que o trabalho se encaixa bem no worker role do Azure.

            StorageAccountInfo account = new StorageAccountInfo(
                baseUri,
                null,
                accountName,
                accountKey);

            QueueStorage service = QueueStorage.Create(account);

            MessageQueue queue = service.GetQueue("messages");

            if (queue.DoesQueueExist())
            {
                Message msg = queue.GetMessage();

                if (msg != null)
                {
                    RoleManager.WriteToLog("Information",
                        string.Format("Message '{0}' processed.", msg.ContentAsString()));
                    queue.DeleteMessage(msg);
                }
            }

Mais simples impossível, certo? Lembrando que a fila fica lá na nuvem, nos servidores da Microsoft. No fim das contas as chamadas são nada mais nada menos que chamadas REST.

Agora, e se eu quiser passar uma mensagem complexa? Bom, você sempre pode serializar objetos com XML, e, como todos sabemos, objetos são mensagens, e XML é texto. A partir daí é só se divertir. Enjoy!

Giovanni Bassi

Arquiteto e desenvolvedor, agilista, escalador, provocador. É fundador e CSA da Lambda3. Programa porque gosta. Acredita que pessoas autogerenciadas funcionam melhor e por acreditar que heterarquia é mais eficiente que hierarquia. Foi reconhecido Microsoft MVP há mais de dez anos, dos mais de vinte que atua no mercado. Já palestrou sobre .NET, Rust, microsserviços, JavaScript, TypeScript, Ruby, Node.js, Frontend e Backend, Agile, etc, no Brasil, e no exterior. Liderou grupos de usuários em assuntos como arquitetura de software, Docker, e .NET.