Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este tópico aborda como os clientes endereçam serviços que leem de filas e como os pontos de extremidade de serviço são mapeados para filas. Como lembrete, a ilustração a seguir mostra a implantação clássica de aplicativo enfileirado do WCF (Windows Communication Foundation).
Para o cliente enviar a mensagem para o serviço, o cliente endereça a mensagem para a Fila de Destino. Para que o serviço consiga ler mensagens da fila, ele configura seu endereço de escuta para a Fila de Destino. O endereçamento no WCF é baseado em URI (Uniform Resource Identifier), enquanto os nomes de fila do MSMQ (Enfileiramento de Mensagens) não são baseados em URI. Portanto, é essencial entender como lidar com filas criadas no MSMQ usando o WCF.
Endereçamento do MSMQ
O MSMQ usa caminhos e nomes de formato para identificar uma fila. Os caminhos especificam um nome de host e um QueueName
. Opcionalmente, pode haver um Private$
entre o nome do host e o QueueName
para indicar uma fila privada que não é publicada no serviço de diretório do Active Directory.
Os nomes de caminho são mapeados para "FormatNames" para determinar aspectos adicionais do endereço, incluindo o roteamento e o protocolo de transferência do gerenciador de filas. O Gerenciador de Filas suporta dois protocolos de transferência: protocolo MSMQ nativo e protocolo de mensagens confiáveis SOAP (SRMP).
Para obter mais informações sobre o caminho e os nomes de formato do MSMQ, consulte Sobre o Enfileiramento de Mensagens.
NetMsmqBinding e endereçamento de serviço
Ao endereçar uma mensagem a um serviço, o esquema no URI é escolhido com base no transporte usado para comunicação. Cada transporte no WCF tem um esquema exclusivo. O esquema deve refletir a natureza do transporte usado para comunicação. Por exemplo, net.tcp, net.pipe, HTTP e assim por diante.
O transporte enfileirado do MSMQ no WCF expõe um esquema net.msmq. Qualquer mensagem endereçada usando o esquema net.msmq é enviada usando o canal de transporte enfileirado NetMsmqBinding
MSMQ.
O endereçamento de uma fila no WCF baseia-se no seguinte padrão:
net.msmq: // <host-name> / [private/] <queue-name>
onde:
< nome do host> é o nome da máquina que hospeda a Fila de Destino.
[privado] é opcional. Ele é usado ao endereçar uma Fila de Destino que é uma fila privada. Para resolver uma fila pública, não especifique private. Observe que, ao contrário dos caminhos MSMQ, não há "$" no formulário URI do WCF.
< nome-da-fila> é o nome da fila. O nome da fila também pode se referir a uma subfila. Portanto, <queue-name> = <name-of-queue>[;sub-queue-name].
Exemplo1: Para acessar uma fila privada chamada PurchaseOrders hospedada no computador abc.adatum.com, o URI seria net.msmq://abc.adatum.com/private/PurchaseOrders.
Exemplo 2: Para acessar uma fila pública AccountsPayable hospedada no computador def.adatum.com, o URI seria net.msmq://def.adatum.com/AccountsPayable.
O endereço da fila é usado como o URI de Escuta pelo Ouvinte do qual ler as mensagens. Em outras palavras, o endereço da fila é equivalente à porta de escuta do soquete TCP.
Um endpoint que lê de uma fila deve especificar o endereço da fila usando o mesmo esquema especificado anteriormente ao abrir o ServiceHost. Para obter exemplos, consulte Net MSMQ Binding.
Vários contratos em uma fila
As mensagens em uma fila podem implementar contratos diferentes. Nesse caso, é essencial que um dos seguintes procedimentos seja verdadeiro para ler e processar todas as mensagens com êxito:
Especifique um ponto de extremidade para um serviço que implementa todos os contratos. Essa é a abordagem recomendada.
Especifique vários pontos de extremidade com contratos diferentes, mas verifique se todos os pontos de extremidade usam o mesmo
NetMsmqBinding
objeto. A lógica de expedição no ServiceModel usa uma bomba de mensagens que lê mensagens do canal de transporte para expedição, que eventualmente desfaz a multiplexação de mensagens com base no contrato para pontos de extremidade diferentes. Uma bomba de mensagens é criada para um par de URI/associação de escuta. O endereço da fila é usado como o URI de escuta pelo ouvinte enfileirado. Ter todos os pontos de extremidade usando o mesmo objeto de associação garante que uma só bomba de mensagens seja usada para ler a mensagem e desfazer a multiplexação para pontos de extremidade relevantes com base no contrato.
Mensagens de SRMP
Conforme discutido anteriormente, você pode usar o protocolo SRMP para transferências entre filas. Isso geralmente é usado quando um transporte HTTP transmite mensagens entre a Fila de Transmissão e a Fila de Destino.
Para usar o protocolo de transferência SRMP, enderece mensagens usando o esquema de URI net.msmq, conforme mencionado anteriormente, e especifique a escolha de SRMP ou SRMP Seguro na propriedade QueueTransferProtocol
do NetMsmqBinding
.
Especificar a propriedade QueueTransferProtocol
é um recurso somente envio. Essa é uma indicação pelo cliente de qual tipo de protocolo de transferência de fila deve ser usado.
Como usar o Active Directory
O MSMQ vem com suporte para integração do Active Directory. Quando o MSMQ é instalado com a integração do Active Directory, o computador deve fazer parte de um domínio do Windows. O Active Directory é usado para publicar filas para descoberta; essas filas são chamadas de filas públicas. Ao abordar uma fila, a fila pode ser resolvida usando o Active Directory. Isso é semelhante a como o DNS (Sistema de Nomes de Domínio) é usado para resolver o endereço IP de um nome de rede. A propriedade UseActiveDirectory
em NetMsmqBinding
é um valor Boolean que indica se o canal enfileirado deve usar o Active Directory para resolver o URI da fila. Por padrão, ele é definido como false
. Se a propriedade UseActiveDirectory
estiver definida como true
, o canal enfileirado usará o Active Directory para converter o URI net.msmq:// em nome de formato.
A UseActiveDirectory
propriedade é significativa apenas para o cliente que está enviando a mensagem porque é usada para resolver o endereço da fila ao enviar mensagens.
Mapeando o URI net.msmq para nomes de formato do Enfileiramento de Mensagens
O canal enfileirado manipula o mapeamento do nome do URI net.msmq fornecido ao canal para nomes de formato do MSMQ. A tabela a seguir resume as regras usadas para mapear entre elas.
Endereço de fila baseado em URI do WCF | Usar a propriedade do Active Directory | Propriedade do Queue Transfer Protocol | Nomes de formato MSMQ resultantes |
---|---|---|---|
Net.msmq://<machine-name>/private/abc |
False (padrão) | Nativo (padrão) | DIRECT=OS:machine-name\private$\abc |
Net.msmq://<machine-name>/private/abc |
Falso | SRMP | DIRECT=http://machine/msmq/private$/abc |
Net.msmq://<machine-name>/private/abc |
Verdade | Nativo |
PUBLIC=some-guid (o GUID da fila) |
Lendo mensagens da fila de mensagens mortas ou da fila de mensagens suspeitas
Para ler mensagens de uma fila de mensagens suspeitas que é uma subfila da fila de destino, abra o ServiceHost
com o endereço da subfila.
Exemplo: um serviço que lê da fila de mensagens suspeitas da fila privada PurchaseOrders do computador local endereçaria net.msmq://localhost/private/PurchaseOrders;poison.
Para ler mensagens de uma fila de mensagens mortas transacionais do sistema, o URI deve ter o formato: net.msmq://localhost/system$;DeadXact.
Para ler mensagens de uma fila de mensagens mortas não transacionais do sistema, o URI deve ter o formato: net.msmq://localhost/system$;DeadLetter.
Ao usar uma fila de mensagens mortas personalizada, observe que a fila de mensagens mortas deve residir no computador local. Dessa forma, o URI da fila de mensagens mortas é restrito ao formato:
net.msmq: //localhost/ [private/] <custom-dead-letter-queue-name>.
Um serviço WCF verifica se todas as mensagens recebidas foram endereçadas à fila específica em que está escutando. Se a fila de destino da mensagem não corresponder à fila em que foi encontrada, o serviço não processará a mensagem. Esse é um problema que os serviços que escutam uma fila de mensagens mortas precisam resolver porque qualquer mensagem na fila de mensagens mortas deveria ser entregue em outro lugar. Para ler mensagens de uma fila de mensagens mortas ou de uma fila de mensagens suspeitas, um ServiceBehavior
com o parâmetro Any deve ser usado. Para obter um exemplo, consulte Filas de Mensagens Inativas.
MsmqIntegrationBinding e endereçamento de serviço
O MsmqIntegrationBinding
é usado para comunicação com aplicativos MSMQ tradicionais. Para facilitar a interoperação com um aplicativo MSMQ existente, o WCF dá suporte apenas ao endereçamento de nome de formato. Portanto, as mensagens enviadas usando essa associação devem estar em conformidade com o esquema de URI:
msmq.formatname:<MSMQ-format-name>>
O nome do formato MSMQ segue o formato especificado pelo MSMQ em Sobre Enfileiramento de Mensagens.
Observe que você só pode usar nomes de formato direto e nomes de formato público e privado (requer integração do Active Directory) ao receber mensagens de uma fila usando MsmqIntegrationBinding
. No entanto, é recomendável que você use nomes de formato direto. Por exemplo, no Windows Vista, usar qualquer outro nome de formato causa um erro porque o sistema tenta abrir uma subfila, que só pode ser aberta com nomes de formato direto.
Ao endereçar o SRMP usando MsmqIntegrationBinding
, não há nenhum requisito de adicionar /msmq/ ao nome de formato direto para ajudar os Serviços de Informações da Internet (IIS) com a expedição. Por exemplo: ao abordar uma fila abc usando o protocolo SRMP, em vez de DIRECT=http://adatum.com/msmq/private$/abc
, você deve usar DIRECT=http://adatum.com/private$/abc
.
Observe que você não pode usar o endereçamento net.msmq:// com MsmqIntegrationBinding
. Como MsmqIntegrationBinding
oferece suporte ao endereçamento de nome de formato MSMQ de forma livre, é possível utilizar um serviço WCF que emprega essa associação para utilizar recursos de lista de distribuição e multicast no MSMQ. Uma exceção é especificar CustomDeadLetterQueue
ao usar o MsmqIntegrationBinding
. Ele deve ser do formulário net.msmq://, semelhante ao modo como ele é especificado usando o NetMsmqBinding
.