Partilhar via


Pontos de extremidade de serviço e endereçamento de fila

Este tópico discute como os clientes lidam com 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 aplicativos em fila do Windows Communication Foundation (WCF).

Queued Application Diagram

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 leia mensagens da fila, ele define 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 serviço de enfileiramento de mensagens (MSMQ) não são baseados em URI. Portanto, é essencial entender como lidar com filas criadas no MSMQ usando WCF.

Endereçamento MSMQ

O MSMQ usa caminhos e nomes de formato para identificar uma fila. Os caminhos especificam um nome de host e um QueueNamearquivo . Opcionalmente, pode haver um Private$ entre o nome do host e o para indicar uma fila QueueName privada que não é publicada no serviço de diretório do Ative Directory.

Os nomes dos caminhos são mapeados para "FormatNames" para determinar aspetos adicionais do endereço, incluindo o roteamento e o protocolo de transferência do gerenciador de filas. O Queue Manager suporta dois protocolos de transferência: protocolo MSMQ nativo e SOAP Reliable Messaging Protocol (SRMP).

Para obter mais informações sobre nomes de caminho e formato MSMQ, consulte Sobre o serviço de 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 único. O regime deve refletir a natureza dos transportes utilizados para a comunicação. Por exemplo, net.tcp, net.pipe, HTTP e assim por diante.

O transporte em fila do MSMQ no WCF expõe um esquema net.msmq. Qualquer mensagem endereçada usando o esquema net.msmq é enviada usando o NetMsmqBinding canal de transporte em fila do MSMQ.

O endereçamento de uma fila no WCF é baseado no seguinte padrão:

net.msmq: // <host-name> / [private/] <queue-name>

onde:

  • <host-name> é o nome da máquina que hospeda a fila de destino.

  • [privado] é opcional. Ele é usado ao abordar uma fila de destino que é uma fila privada. Para resolver uma fila pública, você não deve especificar privado. Observe que, ao contrário dos caminhos MSMQ, não há "$" no formulário URI do WCF.

  • <queue-name> é o nome da fila. O nome da fila também pode se referir a uma subfila. Assim, <queue-name> = <name-of-queue>[;nome da subfila].

Exemplo1: Para endereçar uma fila privada PurchaseOrders hospedada no computador abc atadatum.com, o URI seria net.msmq://abc.adatum.com/private/PurchaseOrders.

Exemplo2: Para resolver uma fila pública AccountsPayable hospedada no computador def atadatum.com, o URI seria net.msmq://def.adatum.com/AccountsPayable.

O endereço da fila é usado como o URI de escuta pelo ouvinte para ler mensagens. Em outras palavras, o endereço da fila é equivalente à porta de escuta do soquete TCP.

Um ponto de extremidade 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 Vinculação MSMQ líquida.

Vários contratos em uma fila

As mensagens em uma fila podem implementar contratos diferentes. Neste caso, é essencial que uma das seguintes opções seja verdadeira para ler e processar todas as mensagens com sucesso:

  • Especifique um ponto de extremidade para um serviço que implementa todos os contratos. Esta é a abordagem recomendada.

  • Especifique vários pontos de extremidade com contratos diferentes, mas certifique-se de que todos os pontos de extremidade usem o mesmo NetMsmqBinding objeto. A lógica de despacho no ServiceModel usa uma bomba de mensagens que lê mensagens fora do canal de transporte para expedição, que eventualmente desmultiplexa mensagens com base no contrato para diferentes pontos de extremidade. Uma bomba de mensagem é criada para um par URI/Binding de escuta. O endereço da fila é usado como o URI Listen pelo ouvinte enfileirado. Fazer com que todos os pontos de extremidade usem o mesmo objeto de vinculação garante que uma única bomba de mensagem seja usada para ler a mensagem e de-multiplex para pontos de extremidade relevantes com base no contrato.

Mensagens SRMP

Como discutido anteriormente, você pode usar o protocolo SRMP para transferências de fila para fila. Isso é comumente 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, endereçe mensagens usando o esquema de URI net.msmq, conforme mencionado anteriormente, e especifique a opção de SRMP ou SRMP Seguro na QueueTransferProtocol propriedade do NetMsmqBinding.

Especificar a QueueTransferProtocol propriedade é um recurso somente de envio. Esta é uma indicação pelo cliente que tipo de protocolo de transferência de fila usar.

Utilizar o Active Directory

O MSMQ vem com suporte para integração com o Ative Directory. Quando o MSMQ é instalado com integração com o Ative Directory, a máquina deve fazer parte de um domínio do Windows. O Ative 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 Ative Directory. Isto é semelhante à forma como o Sistema de Nomes de Domínio (DNS) é utilizado para resolver o endereço IP de um nome de rede. A UseActiveDirectory propriedade in NetMsmqBinding é um Boolean que indica se o canal enfileirado deve usar o Ative Directory para resolver o URI da fila. Por padrão, ele é definido como false. Se a UseActiveDirectory propriedade estiver definida como true, o canal enfileirado usará o Ative 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 serviço de enfileiramento de mensagens

O canal enfileirado manipula o mapeamento do nome de URI net.msmq fornecido ao canal para nomes de formato MSMQ. A tabela a seguir resume as regras usadas para mapear entre elas.

Endereço da fila baseado em URI do WCF Usar a propriedade Ative Directory Propriedade Queue Transfer Protocol Nomes de formato MSMQ resultantes
Net.msmq://<machine-name>/private/abc Falso (predefinição) Nativo (padrão) DIRECT=OS:machine-name\private$\abc
Net.msmq://<machine-name>/private/abc False SRMP DIRECT=http://machine/msmq/private$/abc
Net.msmq://<machine-name>/private/abc True Nativa 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ê a fila de mensagens suspeitas da fila privada PurchaseOrders da máquina local endereçaria net.msmq://localhost/private/PurchaseOrders; veneno.

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 letras mortas não transacionais do sistema, o URI deve ter o formato: net.msmq://localhost/system$; Carta morta.

Ao usar uma fila de mensagens mortas personalizada, observe que a fila de cartas mortas deve residir no computador local. Como tal, o URI para a fila de letras mortas é restrito ao formulário:

net.msmq: //localhost/ [private/] <custom-dead-letter-queue-name>.

Um serviço WCF verifica se todas as mensagens que recebe foram endereçadas para a fila específica em que está escutando. Se a fila de destino da mensagem não corresponder à fila em que ela foi encontrada, o serviço não processará a mensagem. Esse é um problema que os serviços que escutam uma fila de mensagens mortas devem 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 envenenamento, um ServiceBehavior com o Any parâmetro deve ser usado. Para obter um exemplo, consulte Filas de letra inválida.

MsmqIntegrationVinculação 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 suporta apenas endereçamento de nome de formato. Assim, as mensagens enviadas usando essa associação devem estar em conformidade com o esquema de URI:

msmq.formatname:<MSMQ-format-name>>

O MSMQ-format-name tem o formato especificado pelo MSMQ em Sobre o serviço de enfileiramento de mensagens.

Observe que você só pode usar nomes de formato direto e nomes de formato público e privado (requer integração com o Ative Directory) ao receber mensagens de uma fila usando MsmqIntegrationBindingo . No entanto, é aconselhá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 abordar o SRMP usando MsmqIntegrationBindingo , não há necessidade de adicionar /msmq/ no nome do formato direto para ajudar os Serviços de Informações da Internet (IIS) com o despacho. 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 não é possível usar o endereçamento net.msmq:// com MsmqIntegrationBinding. Como MsmqIntegrationBinding oferece suporte ao endereçamento de nome no formato MSMQ de forma livre, você pode usar um serviço WCF que usa essa associação para usar recursos de multicast e lista de distribuição no MSMQ. Uma exceção é especificar CustomDeadLetterQueue ao usar o MsmqIntegrationBindingarquivo . Ele deve ser do formato net.msmq://, semelhante a como é especificado usando o NetMsmqBinding.

Consulte também