Este artigo é um artigo espelhado de tradução automática, por favor clique aqui para ir para o artigo original.

Vista: 44647|Resposta: 8

[WinForm] Persistência de Mensagens da Fila de Fila rabbitMQ [com código-fonte]

[Copiar link]
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 favorResposta





Anterior:Mensagem de exceção: "StrongTypingException: IsPrima...
Próximo:Introdução aos delegados em C# (delegar, Ação, Func, predicado)
Publicado em 09/04/2018 13:17:51 |
Aprenda a aprender
Publicado em 25/06/2019 23:22:47 |
Aprenda a aprender
Publicado em 29/06/2019 09:36:23 |
Por que não vi a demo? Preciso responder para ver
Publicado em 09/07/2019 17:34:42 |
Quero código-fonte em C#
Publicado em 24/07/2019 14:21:51 |
É bom, é exatamente o que eu preciso
Publicado em 11/04/2020 14:34:54 |
Aprenda
Publicado em 01/01/2022 14:45:24 |
1111111111111111
 Senhorio| Publicado em 03/05/2023 22:12:22 |
Parâmetros da Fila do RabbitMQ e seus significados


/**
* Construir uma nova fila, receber um nome, uma flag de durabilidade, uma flag de exclusão automática e argumentos.
* @param nomear o nome da fila - não pode ser nulo; Defina para "" para que o corretor gere o nome.
* @param verdadeiro se estivermos declarando uma fila durável (a fila sobreviverá a um reinício do servidor)
* @param verdadeiro exclusivo se estivermos declarando uma fila exclusiva (a fila será usada apenas pelos declarantes
* conexão)
* @param autoDelete verdadeiro se o servidor deletar a fila quando ela não estiver mais em uso
* @param argumentos os argumentos usados para declarar a fila
*/
public Queue(Nome da cadeia, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> argumentos) {
   Assert.notNull(nome, "'nome' não pode ser nulo");
   this.name = nome;
   this.actualName = StringUtils.hasText(name) ? Nome
         : (Base64UrlNamingStrategy.DEFAULT.generateName() + "_awaiting_declaration");
   this.durable = durável;
   this.exclusivo = exclusivo;
   this.autoDelete = autoDelete;
   this.arguments = argumentos != null ? argumentos : novo HashMap<>();
}

Introdução de parâmetros:
1. nome: o nome da fila;
2. actualName: O nome real da fila, o parâmetro de nome é usado por padrão; se o nome estiver vazio, um é gerado de acordo com as regras;
3. durável: se é persistente;
4. Exclusivo: seja exclusivo ou exclusivo;
5. autoDelete: se deve deletar automaticamente;
6. Argumentos: Outros parâmetros de atributos da fila possuem as seguintes opções, veja Argumentos na Figura 2:
(1) x-message-ttl: o tempo de expiração da mensagem, em milissegundos;
(2) x-expires: tempo de expiração da fila, quanto tempo a fila será deletada se não for acessada, unidade: milissegundos;
(3) comprimento máximo x: o comprimento máximo da fila, se exceder o valor máximo, a mensagem será excluída do cabeçalho da fila;
(4) bytes de comprimento máximo x: o conteúdo da mensagem da fila ocupa o espaço máximo, limitado pelo tamanho da memória, e se ultrapassar esse limite, a mensagem será excluída do cabeçalho da fila;
(5) x-overflow: Defina o comportamento de overflow da fila. Isso determina o que acontece com a mensagem quando o comprimento máximo da fila é atingido. Valores válidos são drop-head, rejeitar-publicar ou rejeitar-publicar-dlx. Tipos de fila de quórum suportam apenas drop-head;
(6) troca-letras mortas x: o nome da troca de letras mortas e as mensagens que expiraram ou foram excluídas (devido ao longo comprimento da fila ou ao espaço acima do limiar) podem ser especificados para serem enviadas à central;
(7) chave de roteamento de letras mortas x: A chave de roteamento da mensagem de letra morta, que será usada quando a mensagem for enviada ao trocador de letras mortas, se não for definida, o valor original da chave de roteamento da mensagem será usado
(8) x-consumidor ativo-único: indica se a fila é um único consumidor ativo, se for verdade, apenas um consumidor no grupo de consumidores registrado consome mensagens, os outros são ignorados, e falso quando a mensagem é distribuída para todos os consumidores em um loop (padrão falso)
(9) prioridade máxima x: o número máximo de prioridades a serem suportadas pela fila; Se não estiver ativado, a fila não suportará prioridade de mensagem;
(10) modo x-queue (modo preguiçoso): Definir a fila para modo de atraso, manter o máximo de mensagens possível no disco para reduzir o uso de RAM; Se não estiver definido, a fila manterá um cache de memória para entregar mensagens o mais rápido possível;
(11) x-queue-master-locator: Coloque a informação do nó mestre da fila espelhada no modo cluster.


Disclaimer:
Todo software, material de programação ou artigos publicados pela Code Farmer Network são apenas para fins de aprendizado e pesquisa; O conteúdo acima não deve ser usado para fins comerciais ou ilegais, caso contrário, os usuários terão todas as consequências. As informações deste site vêm da Internet, e disputas de direitos autorais não têm nada a ver com este site. Você deve deletar completamente o conteúdo acima do seu computador em até 24 horas após o download. Se você gosta do programa, por favor, apoie um software genuíno, compre o registro e obtenha serviços genuínos melhores. Se houver qualquer infração, por favor, entre em contato conosco por e-mail.

Mail To:help@itsvse.com