Pergunta

Eu tenho um serviço .NET que usa o cliente ActiveMQ. Eu tenho implementado um MessageListener com uma conexão transacionado a consumir as mensagens.

Ocasionalmente, recebo mensagens em uma ordem diferente em que eles foram colocados na fila.

O que é errado usar um MessageListner? Existe uma maneira de preservar a ordem mensagem?

FYI:. Há um produtor colocando mensagens na fila e um consumidor puxando mensagens fora da fila

Foi útil?

Solução 2

Mais informações: A chamada do servidor I é o terceiro partido e não tenho controle sobre o que as mensagens que envia. Eu sei, baseado no de identificação da mensagem que eles são colocados na ordem certa. Além disso, neste sistema, há uma diferença entre ACK e Reconhecer. O ACK é recebido quando a minha mensagem original é colocado na fila de "saída". Eu, então, monitorar uma fila de "entrada" para as respostas. Eu costumo ter uma "Reconhecer" seguido por um "Pass" ou "Fail". O ID de correlação para estas mensagens é o ID da mensagem do ACK.

Eu tinha originalmente usado um ouvinte mensagem e respondeu a um evento OnMessge. Eu abandonei essa abordagem depois de perceber que, usando este método, as mensagens são entregues de forma assíncrona e, portanto, em nenhuma ordem particular. Então, eu mudei meu código para pesquisa usando um temporizador (System.Threading.Timer) para chamar consumer.Receive () e obter uma mensagem de cada vez. Isso funciona da maneira que eu quero.

Eu abro o consumidor uma vez quando o serviço é iniciado e I continuamente pesquisa para mensagens.

Outras dicas

Você não deveria ter que fazer qualquer coisa para manter a ordem; isso é uma das coisas que uma fila de mensagens faz para você. Eu acho que se você tem uma única escuta do consumidor para a fila, e ele está processando mensagens fora de ordem, então você quer ter encontrado um bug ou as mensagens não são enfileirados na ordem que você acha que eles são.

Além disso, há esta questão do ActiveMQ FAQ que podem ajudar.

Editar: Após a leitura dos comentários em o duffymo resposta , parece que você está overengineering um pouco. Em geral, uma fila de mensagens como ActiveMQ, MQ Series, Jorão, etc. ter duas características: eles entregar mensagens na mesma ordem em que são enfileirado, e eles garantem a entrega da mensagem. O envio de uma mensagem de ACK separado é redundante; é um pouco como cometer uma transação de banco de dados, em seguida, consultando a mesma informação de volta para o duplo controlo que o banco de dados realmente armazenados-lo.

Dito isto, é seu servidor de vários segmentos? Se assim for, pode possível para que possa enfileirar a resposta antes que enfileira o ACK.

Por que é fim mensagem importante? A MessageListener não deve ter para se importar.

Se você precisa de um ID de correlação para coincidir com uma resposta com um pedido particular, isso é outro assunto. É isso que você quer dizer?

Tudo Jason disse. Algumas outras coisas para ter cuidado. Você está mantendo o aberto dos consumidores por muitas mensagens certas? Você não está criando um consumidor para algumas mensagens, em seguida, fechando-o? Apenas fechando um consumidor faz com que mensagens associadas a um consumidor para ser colocado de volta em uma fila que pode quebrar ordem.

Está relacionado com reversões? (Você está revertendo qualquer transação?).

Finalmente, você sempre pode garantir a ordem usando um re-sequenciador para as coisas de pedido de você.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top