Compartilhar via


Comunicação em fila volátil

O exemplo de volátil demonstra como realizar a comunicação em fila volátil no transporte do Enfileiramento de Mensagens (MSMQ). Esse exemplo usa NetMsmqBinding. Neste caso, o serviço é um aplicativo de console auto-hospedado para permitir que você observe o serviço que está recebendo mensagens na fila.

Observação

Os procedimentos de instalação e as instruções de build desse exemplo estão localizadas no final deste tópico.

Na comunicação na 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. Portanto, o serviço e o cliente 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 só faz o possível para entregar a mensagem. Com as garantias Exactly Once, o MSMQ se assegura de que a mensagem seja entregue ou, se não puder ser entregue, permitirá que você saiba disso.

Em determinados cenários, talvez seja conveniente enviar uma mensagem volátil sem garantias em uma fila, quando a entrega oportuna for mais importante do que perder mensagens. 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 mensagens em si não sobreviverão, pois não são armazenadas no disco.

Observação

Você não pode enviar mensagens voláteis sem garantias no escopo de uma transação usando o MSMQ. Além disso, você deve criar uma fila não transacional para enviar mensagens voláteis.

O contrato de serviço nesse exemplo é IStockTicker, que define serviços unidirecionais mais adequados para uso com enfileiramento.

[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 seguinte código de exemplo:

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

O serviço é auto-hospedado. Quando o transporte MSMQ é usado, a fila usada precisa ser criada com antecedência. Isso pode ser feito manualmente ou por meio do código. Neste exemplo, o serviço contém o código para verificar a existência da fila e criá-la, se necessário. O nome da fila é lido no arquivo de configuração. O endereço básico é usado pela Ferramenta Utilitário de Metadados ServiceModel (Svcutil.exe) para gerar o proxy do 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 do serviço é definido na seção system.serviceModel do arquivo de configuração e especifica a associação netMsmqBinding.

Observação

O nome da fila usa um ponto (.) para o computador local e separadores de barra invertida no caminho ao criar uma fila usando System.Messaging. O endereço de ponto de extremidade do WCF (Windows Communication Foundation) especifica um esquema net.msmq:, usa "localhost" para o computador local e barras no 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 de cliente e de serviço são exibidas nas janelas do serviço e do console 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 a fila está em uso, o cliente e o serviço não precisam estar em funcionamento ao mesmo tempo. Você pode executar o cliente, desligá-lo e iniciar o serviço e ele ainda receber as 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. Verifique se você executou o Procedimento de instalação única para os exemplos do Windows Communication Foundation.

  2. Para compilar a edição .NET do C# ou do Visual Basic da solução, siga as instruções contidas em Como Compilar as Amostras do Windows Communication Foundation.

  3. Para executar o exemplo em uma configuração de computador único ou cruzado, siga as instruções em Como executar os exemplos do Windows Communication Foundation.

Por padrão com a NetMsmqBinding, a segurança do transporte está habilitada. Há duas propriedades pertinentes para a segurança do transporte MSMQ, MsmqAuthenticationMode e MsmqProtectionLevel.. Por padrão, 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 precisa fazer parte de um domínio e a opção de integração do Active Directory para o MSMQ precisa ser instalada. Se você executar este exemplo em um computador que não atenda a esses critérios, receberá um erro.

Executar o exemplo em um computador integrante de um grupo de trabalho ou sem integração de diretórios ativos

  1. Se o computador não fizer parte de um domínio ou não tiver a integração do Active Directory instalada, desative a segurança do transporte definindo o modo de autenticação e o nível de proteção como None, conforme mostrado no exemplo de código de configuração 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. Verifique se você alterou a configuração no servidor e no cliente antes de executar o exemplo.

    Observação

    Definir security mode como None é equivalente a configurar a segurança MsmqAuthenticationMode, MsmqProtectionLevel e Message como None.