Partilhar via


Comunicação volátil em fila

O exemplo Volátil demonstra como executar comunicação volátil em fila através do transporte MSMQ (Enfileiramento de Mensagens). Este exemplo usa NetMsmqBindingo . O serviço, neste caso, é um aplicativo de console auto-hospedado para permitir que você observe o serviço recebendo mensagens na fila.

Nota

O procedimento de configuração e as instruções de compilação para este exemplo estão localizados no final deste tópico.

Na comunicação em fila, o cliente se comunica com o serviço usando uma fila. Mais precisamente, o cliente envia mensagens para uma fila. O serviço recebe mensagens da fila. O serviço e o cliente, portanto, não precisam estar em execução ao mesmo tempo para se comunicar usando uma fila.

Quando você envia uma mensagem sem garantias, o MSMQ apenas faz um esforço melhor para entregar a mensagem, ao contrário das garantias Exactly Once, onde o MSMQ garante que a mensagem seja entregue ou, se não puder ser entregue, informa que a mensagem não pode ser entregue.

Em determinados cenários, você pode querer enviar uma mensagem volátil sem garantias em uma fila, quando a entrega oportuna é mais importante do que perder mensagens. As mensagens voláteis não sobrevivem a falhas do gerenciador de filas. Portanto, se o gerenciador de filas falhar, a fila não transacional usada para armazenar mensagens voláteis sobreviverá, mas as próprias mensagens não, porque as mensagens não estão armazenadas no disco.

Nota

Não é possível enviar mensagens voláteis sem garantias dentro do escopo de uma transação usando o MSMQ. Você também deve criar uma fila não transacional para enviar mensagens voláteis.

O contrato de serviço neste exemplo é IStockTicker que define os serviços unidirecionais que são mais adequados para uso com filas.

[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
public interface IStockTicker
{
    [OperationContract(IsOneWay = true)]
    void StockTick(string symbol, float price);
}

A operação de serviço exibe o símbolo e o preço do ticker de ações, conforme mostrado no código de exemplo a seguir:

public class StockTickerService : IStockTicker
{
    public void StockTick(string symbol, float price)
    {
        Console.WriteLine("Stock Tick {0}:{1} ", symbol, price);
     }
     …
}

O serviço é auto-hospedado. Ao usar o transporte MSMQ, a fila usada deve ser criada com antecedência. Isso pode ser feito manualmente ou através de código. Neste exemplo, o serviço contém código para verificar a existência da fila e criá-la, se necessário. O nome da fila é lido a partir do arquivo de configuração. O endereço base é usado pela ServiceModel Metadata Utility Tool (Svcutil.exe) para gerar o proxy para o serviço.

// Host the service within this EXE console application.
public static void Main()
{
    // Get MSMQ queue name from app settings in configuration.
    string queueName = ConfigurationManager.AppSettings["queueName"];

    // Create the transacted MSMQ queue if necessary.
    if (!MessageQueue.Exists(queueName))
        MessageQueue.Create(queueName);

    // Create a ServiceHost for the StockTickerService type.
    using (ServiceHost serviceHost = new ServiceHost(typeof(StockTickerService)))
    {
        // Open the ServiceHost to create listeners and start listening for messages.
        serviceHost.Open();

        // The service can now be accessed.
        Console.WriteLine("The service is ready.");
        Console.WriteLine("Press <ENTER> to terminate service.");
        Console.WriteLine();
        Console.ReadLine();

        // Close the ServiceHost to shutdown the service.
        serviceHost.Close();
    }
}

O nome da fila MSMQ é especificado na seção appSettings do arquivo de configuração. O ponto de extremidade para o serviço é definido na seção system.serviceModel do arquivo de configuração e especifica a netMsmqBinding ligação.

Nota

O nome da fila usa um ponto (.) para a máquina local e separadores de barra invertida em seu caminho ao criar uma fila usando System.Messaging. O endereço de ponto de extremidade do Windows Communication Foundation (WCF) especifica um esquema net.msmq:, usa "localhost" para a máquina local e encaminha barras em seu caminho.

As garantias e a durabilidade ou volatilidade das mensagens também são especificadas na configuração.

<appSettings>
  <!-- use appSetting to configure MSMQ queue name -->
  <add key="queueName" value=".\private$\ServiceModelSamplesVolatile" />
</appSettings>

<system.serviceModel>
  <services>
    <service name="Microsoft.ServiceModel.Samples.StockTickerService"
             behaviorConfiguration="CalculatorServiceBehavior">
    ...
      <!-- Define NetMsmqEndpoint -->
      <endpoint address="net.msmq://localhost/private/ServiceModelSamplesVolatile"
                binding="netMsmqBinding"
                bindingConfiguration="volatileBinding"
                contract="Microsoft.ServiceModel.Samples.IStockTicker" />
    ...
    </service>
  </services>

  <bindings>
    <netMsmqBinding>
      <binding name="volatileBinding"
             durable="false"
           exactlyOnce="false"/>
    </netMsmqBinding>
  </bindings>
  ...
</system.serviceModel>

Como o exemplo envia mensagens enfileiradas usando uma fila não transacional, as mensagens transacionadas não podem ser enviadas para a fila.

// Create a client.
Random r = new Random(137);

StockTickerClient client = new StockTickerClient();

float price = 43.23F;
for (int i = 0; i < 10; i++)
{
    float increment = 0.01f * (r.Next(10));
    client.StockTick("zzz" + i, price + increment);
}

//Closing the client gracefully cleans up resources.
client.Close();

Quando você executa o exemplo, as atividades do cliente e do serviço são exibidas nas janelas do console do serviço e do cliente. Você pode ver o serviço receber mensagens do cliente. Pressione ENTER em cada janela do console para desligar o serviço e o cliente. Observe que, como o enfileiramento está em uso, o cliente e o serviço não precisam estar funcionando ao mesmo tempo. Você pode executar o cliente, desligá-lo e, em seguida, iniciar o serviço e ele ainda recebe suas mensagens.

The service is ready.
Press <ENTER> to terminate service.

Stock Tick zzz0:43.25
Stock Tick zzz1:43.23
Stock Tick zzz2:43.28
Stock Tick zzz3:43.3
Stock Tick zzz4:43.23
Stock Tick zzz5:43.25
Stock Tick zzz6:43.25
Stock Tick zzz7:43.24
Stock Tick zzz8:43.32
Stock Tick zzz9:43.3

Para configurar, compilar e executar o exemplo

  1. Certifique-se de ter executado o procedimento de instalação única para os exemplos do Windows Communication Foundation.

  2. Para criar a edição C# ou Visual Basic .NET da solução, siga as instruções em Criando os exemplos do Windows Communication Foundation.

  3. Para executar o exemplo em uma configuração de máquina única ou cruzada, siga as instruções em Executando os exemplos do Windows Communication Foundation.

Por padrão, a segurança de transporte está habilitada NetMsmqBinding. Há duas propriedades pertinentes para a segurança de transporte do MSMQ e.MsmqProtectionLevel, por padrão, MsmqAuthenticationMode o modo de autenticação é definido como Windows e o nível de proteção é definido como Sign. Para que o MSMQ forneça o recurso de autenticação e assinatura, ele deve fazer parte de um domínio e a opção de integração do Ative Directory para MSMQ deve estar instalada. Se você executar este exemplo em um computador que não satisfaz esses critérios, você receberá um erro.

Para executar o exemplo em um computador associado a um grupo de trabalho ou sem integração com o Ative Directory

  1. Se o computador não fizer parte de um domínio ou não tiver a integração com o Ative Directory instalada, desative a segurança de transporte definindo o modo de autenticação e o nível de proteção como None mostrado no código de configuração de exemplo a seguir:

    <system.serviceModel>
        <services>
          <service name="Microsoft.ServiceModel.Samples.StockTickerService"
                   behaviorConfiguration="StockTickerServiceBehavior">
            <host>
              <baseAddresses>
                <add baseAddress="http://localhost:8000/ServiceModelSamples/service"/>
              </baseAddresses>
            </host>
    
            <!-- Define NetMsmqEndpoint -->
            <endpoint address="net.msmq://localhost/private/ServiceModelSamplesVolatile"
                      binding="netMsmqBinding"
                      bindingConfiguration="volatileBinding"
                      contract="Microsoft.ServiceModel.Samples.IStockTicker" />
            <!-- the mex endpoint is exposed at http://localhost:8000/ServiceModelSamples/service/mex -->
            <endpoint address="mex"
                      binding="mexHttpBinding"
                      contract="IMetadataExchange" />
    
          </service>
        </services>
    
        <bindings>
          <netMsmqBinding>
            <binding name="volatileBinding"
                  durable="false"
                  exactlyOnce="false">
              <security mode="None" />
            </binding>
          </netMsmqBinding>
        </bindings>
    
        <behaviors>
          <serviceBehaviors>
            <behavior name="StockTickerServiceBehavior">
              <serviceMetadata httpGetEnabled="True"/>
            </behavior>
          </serviceBehaviors>
        </behaviors>
    
      </system.serviceModel>
    
  2. Certifique-se de alterar a configuração no servidor e no cliente antes de executar o exemplo.

    Nota

    Definir security mode como None é equivalente a definir MsmqAuthenticationMode, MsmqProtectionLevele Message segurança para None.