Este artigo descreve como usar o Simple Message Queue (formerly MNS) para transferir uma mensagem com tamanho superior a 64 KB sem dividi-la.
Informações básicas
O tamanho máximo de uma mensagem em uma fila do Simple Message Queue (formerly MNS) é de 64 KB. Esse limite atende às necessidades de troca de dados na maioria dos cenários com controle de fluxo. Nesses casos, mensagens maiores que 64 KB exigem divisão.
O MNS oferece uma solução para transmitir mensagens maiores que 64 KB sem fragmentação.
Solução
Ao enviar uma mensagem maior que 64 KB para o Simple Message Queue (formerly MNS), o cliente produtor faz upload da mensagem no Object Storage Service (OSS).
O cliente produtor envia as informações do objeto do OSS contendo a mensagem para o Simple Message Queue (formerly MNS).
O cliente consumidor lê a mensagem da fila do Simple Message Queue (formerly MNS) e verifica se o conteúdo corresponde às informações de um objeto do OSS.
Se o conteúdo for referente a um objeto do OSS, o cliente consumidor baixa esse objeto e retorna o conteúdo da mensagem à aplicação de camada superior.
A figura a seguir ilustra o processo de transferência de mensagens.

Código de exemplo
O MNS disponibiliza um código de exemplo em Java para transferir mensagens grandes. Baixe o código de exemplo. A classe BigMessageSizeQueue encapsula todos os recursos necessários.
A classe BigMessageSizeQueue fornece os seguintes métodos públicos:
// Specify a constructor. cq is a common mnsqueue object. The ossClient and ossBucketName include the information of the OSS region and bucket that are used to transfer oversized messages.
public BigMessageSizeQueue(CloudQueue cq, OSSClient ossClient, String ossBucketName)
// Send a message.
public Message putMessage(Message message)
// Receive the message.
public Message popMessage(int waitSeconds)
// Delete the message.
public void deleteMessage(String receiptHandle)
// Specify the maximum size of a message. If the size of a message exceeds the limit, the message is transferred by using OSS. Default value: 64 KB.
public void setBigMessageSize(long bigMessageSize)
// Specify whether to delete the OSS object that contains the message. Default value: yes.
public void setNeedDeleteMessageObjectOnOSSFlag(boolean flag)
Para mais detalhes sobre o código de exemplo, consulte o arquivo Demo.java.
Precauções
A transferência de mensagens grandes consome muita largura de banda de rede e pode causar gargalos nos clientes produtores e consumidores.
Essa transferência é demorada e suscetível a instabilidades de rede. Implemente tentativas de repetição na camada da aplicação caso ocorram erros.