Pergunta

É possível ter vários ouvintes para mensagens transportadas por MSMQ?

WCF parece moldura tudo em termos de serviços, tornando a comunicação um negócio ponto-a-ponto. Eu quero usar uma fila de mensagens para o buffer o tráfego de entrada para outro processo que registra os logs em um banco de dados.

Não pode haver haver qualquer número de outros processos interessados ??em monitorar o tráfego de entrada, e isso levanta positivamente para o padrão Observer, mas eu não posso ver como expressar padrão Observer, pelo menos não usando MSMQ via WCF.

Alguém pode aconselhar-me sobre isso?


Algumas informações básicas sobre por que eu me importo, o que também pode servir para ilustrar o problema: Eu tenho um serviço do Windows que aceita solicitações de conexão de pequenas caixas negras no campo. Ele configura soquetes e as caixas-pretas enviar mensagens descrevendo eventos anotados com localização GPS em tempo e espaço.

I pacotes de mensagens de análise do fluxo de tomada e enviá-los via MSMQ para outro processo que filtra duplicatas e escreve os pacotes em uma tabela de banco de dados.

Não há qualquer quantidade de pós-processamento que se beneficiariam de computação incremental na resposta ao tráfego de entrada, e as ferramentas fáceis executar notificação do usuário, também em resposta ao tráfego de entrada.

Então, eu realmente gostaria de ter um processo de envio de mensagens, e vários recebê-los. Um desses receptores é responsável por analisar o conteúdo do pacote e transcrever a mensagem em um banco de dados; este é um candidato óbvio para a responsabilidade de finalmente remover a mensagem da fila, mas há a questão de como garantir este é o último manipulador para processar a mensagem.

Foi útil?

Solução

Eu não acredito MSMQ está devidamente projetado para lidar com esta situação por si só. Há apenas 2 coisas que você pode fazer para uma mensagem - Peek () ou Get (). AFAIK, não é uma boa maneira para controlar se uma mensagem foi processada por todos os manipuladores.

O trabalho de força é ter o seu processo que transcreve a mensagem ser o observée, e publicar a mensagem (talvez usando a arquitetura .NET Event) para todos os observadores interessados ??antes de transcrever a mensagem e escrever para o banco de dados. Isto proporcionaria uma garantia de que todos os observadores interessados ??viu a mensagem, ea mensagem é escrita para o DB de forma adequada.

Outras dicas

Eu acho que você precisa de um Publish-Subscribe Canal :

Como pode o remetente transmitir um evento para todos os receptores interessados? Enviar o evento em um Publish-Subscribe Channel, que entrega uma cópia de um determinado evento para cada receptor.

A Publish-Subscribe obras do Canal assim: Ele tem um canal de entrada que se divide em vários canais de saída, um para cada assinante. Quando um evento é publicada para o canal, a publicação-assinatura Canal entrega uma cópia da mensagem para cada um dos canais de saída. Cada canal de saída tem um único assinante, o que só é permitido consumir uma mensagem de uma vez. Desta forma, cada assinante só recebe o mensagem de uma vez e cópias consumidos desaparecer de seus canais.

Este padrão é implementado em cima do MSMQ por MassTransit e NServiceBus .

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