|
|
Publicado em 09/04/2018 10:23:21
|
|
|
|

Por padrão, as mensagens da fila rabbitMQ não são persistidas no disco rígido, o que significa que, uma vez reiniciado o serviço rabbitMQ, as mensagens serão perdidas.
Persistência das filas
Por exemplo, a persistência da fila é identificadadurableis está definido como true, o que significa que é uma fila persistente, então, após o serviço ser reiniciado, ele também existirá, porque o serviço armazenará a fila persistente no disco rígido, e quando o serviço for reiniciado, restabelecerá o que era a fila persistida anteriormente. A fila pode ser persistida, mas se as mensagens internas são persistentes depende das configurações de persistência da mensagem. Em outras palavras, se não houver nenhuma mensagem enviada na fila antes do reinício, se a mensagem original ainda existe na fila após o reinício depende das configurações de mensagem que ocorreram quando a mensagem foi enviada. Se você quiser manter as mensagens persistentes após um reinício, deve definir a identidade de que a mensagem é mantida.
Configure persistência na fila:
O quarto parâmetro do método, autoDelete, geralmente é inserido falso. A documentação descreve esse parâmetro se for verdadeiro, o que significa que, se a fila não for mais usada (não assinada), o servidor o excluirá. Durante meus testes, enquanto todos os destinatários da fila de mudança de conexão estiverem desconectados, a fila é excluída, mesmo que ainda haja mensagens não processadas nela. Reiniciar o RabbitMQ também vai removê-los. Se for inserido false, o serviço não excluirá a fila e as mensagens existirão se todos os clientes conectados a ela estiverem desconectados. O remetente também pode colocar mensagens na fila de mudanças quando não há conexão com o cliente, e quando o cliente aparece, ele receberá essas mensagens. No entanto, se o serviço RabbitMQ for reiniciado, a fila desaparecerá, e as mensagens nele desaparecerão naturalmente.
O terceiro parâmetro é exclusivo, e a documentação afirma que, se for verdadeiro, a conexão da fila é quebrada, então a fila é excluída, incluindo as mensagens internas.
O segundo parâmetro, durável, é descrito na documentação como dizendo que, se for verdadeiro, ele representa uma fila persistente, que também existirá após o serviço reiniciar. Como o serviço armazenará a fila persistente no disco rígido e, quando o serviço for reiniciado, ele reafirmará essa fila. Claro, deve ser quando tanto o autoDelete quanto o exclusivo são falsos. A fila pode ser persistida, mas se as mensagens internas são persistentes depende das configurações de persistência da mensagem. Em outras palavras, se ainda houver mensagens enviadas na fila antes do reinício, se a mensagem original ainda existe na fila após o reinício depende das configurações do remetente para a mensagem ao enviar a mensagem.
Depois de modificar o código, tentamos executá-lo, e o erro será o seguinte:
Exceção não tratada: RabbitMQ.Client.Exceptions.OperationInterruptedException: A operação AMQP foi interrompida: AMQP close-reason, iniciada por Peer, code=406, text="PRECONDITION_FAILED - arg inequivalente 'durable' para a fila 'hello' em vhost 'myserver': recebido 'true' mas corrente é 'false'", classId=50, methodId=10, cause=
Porque definimos uma fila não persistente chamada hello. O RabbitMQ não permite redefinir filas existentes com configurações de parâmetros diferentes.
Existem duas soluções:
1: Redeclarar uma fila com um nome diferente, como my_queue 2: Exclua a fila "olá" definida com o endereço de http://localhost:15672 e faça login com o nome de usuário e senha. A senha padrão e o nome de usuário do RabbitMQ são o convidado. Clique na coluna "fila" para ver a lista de filas, clique na fila "olá" para expandir os detalhes da fila. Puxe a página até o final, tem um item "Excluir", clique nele, clique no botão "Delete Queue" e você pode deletar a fila. Então, quando o código é executado, uma fila hello é criada que suporta persistência.
Persistência das mensagens
Se quiser manter a mensagem persistente após um reinício, deve configurar a mensagem para persistir. A configuração é quando o remetente envia, o que é relativamente simples, e o código é o seguinte:
O DeliveryMode padrão é 1, não persistente, e definir como 2 significa que a mensagem é persistente
Depois de modificar o código, tentamos abrir apenas o programa produtor para enviar mensagens, e então reiniciamos o serviço rabbitMQ, abrimos o consumidor novamente e vemos que a mensagem não está perdida.
(Fim)
Anexado está o código-fonte em C#:
Turistas, se quiserem ver o conteúdo oculto deste post, por favor Resposta
|
Anterior:Mensagem de exceção: "StrongTypingException: IsPrima...Próximo:Introdução aos delegados em C# (delegar, Ação, Func, predicado)
|