Utilize o SDK para C# a fim de criar uma fila, enviar e receber mensagens, além de excluir filas e mensagens no Simple Message Queue (anteriormente MNS).
Antes de começar
Antes de iniciar, verifique se você possui:
Uma conta Alibaba Cloud ou um usuário RAM com as permissões necessárias
Um par de AccessKey (AccessKey ID e AccessKey secret). Para criar um, acesse a página AccessKey Management ou o RAM console
O endpoint regional do SMQ para sua fila. Os endpoints variam conforme a região. Para localizar o seu, acesse o console do Simple Message Queue (anteriormente MNS) e clique em Visualize os endpoints de uma fila. Para mais detalhes, consulte Visualizar os endpoints de uma fila
Configure o SDK
Baixe a versão mais recente do SDK para C# e descompacte o pacote.
Adicione a pasta descompactada ao Visual Studio como uma solução. A solução contém quatro projetos.
-
Clique com o botão direito no projeto AliyunSDK_MNS e selecione Rebuild. Essa ação gera o arquivo Aliyun.MNS.dll no diretório bin.
NotaAdicione uma referência ao Aliyun.MNS.dll em qualquer projeto que invoque o SDK do SMQ.
Abra o arquivo SyncTopicSample.cs no projeto AliyunSDK_MNS_Sample.
-
Defina as seguintes propriedades no Visual Studio:
Configure AliyunSDK_MNS_Sample como o projeto de inicialização.
Defina SyncTopicSample como o objeto de inicialização.
No início do arquivo SyncTopicSample.cs, especifique seu AccessKey ID, AccessKey secret e endpoint.
Crie uma fila
Crie uma fila com parâmetros personalizados. O nome padrão da fila no código de exemplo é myqueue.
// Configure queue parameters. For a full list, see Queue in the API reference.
var createQueueRequest = new CreateQueueRequest
{
QueueName = _queueName,
Attributes =
{
VisibilityTimeout = 30, // Seconds a received message stays invisible. Default: 30.
MaximumMessageSize = 40960, // Maximum message size in bytes.
MessageRetentionPeriod = 345600, // Seconds a message is retained. Default: 345600 (4 days).
PollingWaitSeconds = 30 // Long polling timeout in seconds. Maximum: 30.
}
};
try
{
var queue = client.CreateQueue(createQueueRequest);
Console.WriteLine("Create queue successfully, queue name: {0}", queue.QueueName);
}
catch (MNSException me)
{
// Common causes: network error, queue name already exists.
Console.WriteLine("CreateQueue Failed! ErrorCode: " + me.ErrorCode);
}
catch (Exception ex)
{
Console.WriteLine("Create queue failed, exception info: " + ex.Message);
}
Para criar uma fila com parâmetros padrão, chame diretamente client.CreateQueue(_queueName).
Envie uma mensagem
Após criar a fila, envie uma mensagem para ela:
try
{
// Get a reference to the queue.
var nativeQueue = client.GetNativeQueue(_queueName);
// Build a send request with a message body.
var sendMessageRequest = new SendMessageRequest("Alibaba<MessageBody>Cloud");
// Send the message.
var sendMessageResponse = nativeQueue.SendMessage(sendMessageRequest);
Console.WriteLine("Send message succeed");
}
catch (MNSException me)
{
Console.WriteLine("SendMessage Failed! ErrorCode: " + me.ErrorCode);
}
catch (Exception ex)
{
Console.WriteLine("Send message failed, exception info: " + ex.Message);
}
Para enviar uma mensagem em texto simples sem parâmetros adicionais, utilize nativeQueue.SendMessage("MessageBody").
Receba e exclua uma mensagem
Receba uma mensagem
Invoque ReceiveMessage para obter uma mensagem da fila. Passe um valor para WaitSeconds a fim de ativar o long polling. A solicitação permanece pendente até que uma mensagem chegue ou o tempo limite expire. É obrigatório especificar o parâmetro NextVisibleTime no SMQ. Para mais informações sobre NextVisibleTime e outros atributos de mensagem, consulte QueueMessage.
try
{
// Long poll for up to 30 seconds.
var receiveMessageResponse = nativeQueue.ReceiveMessage(30);
// Save the receipt handle for later deletion.
// The receipt handle is valid for the duration of VisibilityTimeout.
_receiptHandle = message.ReceiptHandle;
}
catch (MNSException me)
{
Console.WriteLine("ReceiveMessage Failed! ErrorCode: " + me.ErrorCode);
}
catch (Exception ex)
{
Console.WriteLine("ReceiveMessage failed, exception info: " + ex.Message);
}
Long polling: Quando WaitSeconds possui um valor diferente de zero (máximo de 30), a requisição aguarda até que uma mensagem esteja disponível ou o tempo limite seja atingido. Isso reduz as consultas com respostas vazias e diminui os custos.
Visibility timeout: Depois que um cliente recebe uma mensagem, ela entra no estado Inativo durante o período definido por VisibilityTimeout. Nesse intervalo, nenhum outro cliente consegue receber a mesma mensagem. Ao expirar o tempo limite, a mensagem retorna ao estado Ativo e fica disponível para outros consumidores. Esse mecanismo evita a perda de mensagens caso um consumidor encerre inesperadamente.
Exclua uma mensagem
Após processar uma mensagem, remova-a da fila utilizando o receipt handle. Exclua a mensagem antes que o receipt handle expire; caso contrário, ele se tornará inválido.
try
{
var deleteMessageResponse = nativeQueue.DeleteMessage(_receiptHandle);
}
catch (MNSException me)
{
// A MessageNotExist error means the receipt handle has expired.
// To avoid this, set VisibilityTimeout to a value that gives your
// application enough time to process the message, or call
// changeMessageVisibility() to extend it.
Console.WriteLine("DeleteMessage Failed! ErrorCode: " + me.ErrorCode);
}
catch (Exception ex)
{
Console.WriteLine("Delete message failed, exception info: " + ex.Message);
}
Dica: Se o processamento da mensagem demorar mais que o tempo limite de visibilidade padrão, chame changeMessageVisibility() para estender o tempo limite antes que o receipt handle expire.
Exclua uma fila
Quando uma fila não for mais necessária, exclua-a para liberar recursos:
try
{
var deleteQueueResponse = client.DeleteQueue(deleteQueueRequest);
}
catch (MNSException me)
{
Console.WriteLine("DeleteQueue Failed! ErrorCode: " + me.ErrorCode);
}
catch (Exception ex)
{
Console.WriteLine("Delete queue failed, exception info: " + ex.Message);
}