Udostępnij za pośrednictwem


Komunikacja za pomocą nietrwałych kolejek

Przykład Volatile pokazuje, jak wykonać nietrwałą komunikację w kolejce za pośrednictwem transportu kolejkowania komunikatów (MSMQ). W tym przykładzie użyto metody NetMsmqBinding. Usługa w tym przypadku jest aplikacją konsolową self-hosted, aby umożliwić obserwowanie usługi odbierających komunikaty w kolejce.

Uwaga

Procedura instalacji i instrukcje kompilacji dla tego przykładu znajdują się na końcu tego tematu.

W komunikacji w kolejce klient komunikuje się z usługą przy użyciu kolejki. Mówiąc dokładniej, klient wysyła komunikaty do kolejki. Usługa odbiera komunikaty z kolejki. W związku z tym usługa i klient nie muszą być uruchomione w tym samym czasie, aby komunikować się przy użyciu kolejki.

Po wysłaniu komunikatu bez gwarancji usługa MSMQ dokłada wszelkich starań, aby dostarczyć komunikat, w przeciwieństwie do opcji Dokładnie raz, gdy msMQ gwarantuje, że komunikat zostanie dostarczony lub, jeśli nie będzie można go dostarczyć, informuje o tym, że nie można dostarczyć komunikatu.

W niektórych scenariuszach możesz wysłać nietrwały komunikat bez gwarancji w kolejce, gdy terminowe dostarczanie jest ważniejsze niż utrata komunikatów. Komunikaty nietrwałe nie przetrwają awarii menedżera kolejek. W związku z tym jeśli menedżer kolejek ulegnie awarii, kolejka nie transakcyjna używana do przechowywania nietrwałych komunikatów przetrwa, ale same komunikaty nie są przechowywane na dysku.

Uwaga

Nie można wysyłać nietrwałych komunikatów bez gwarancji w zakresie transakcji przy użyciu msMQ. Aby wysyłać nietrwałe komunikaty, należy również utworzyć kolejkę nie transakcyjną.

Kontrakt usługi w tym przykładzie definiuje IStockTicker usługi jednokierunkowe, które najlepiej nadają się do użycia z kolejkowaniem.

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

Operacja usługi wyświetla symbol i cenę znacznika akcji, jak pokazano w poniższym przykładowym kodzie:

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

Usługa jest hostowana samodzielnie. W przypadku korzystania z transportu MSMQ używana kolejka musi zostać utworzona z wyprzedzeniem. Można to zrobić ręcznie lub za pomocą kodu. W tym przykładzie usługa zawiera kod umożliwiający sprawdzenie istnienia kolejki i utworzenie jej, jeśli jest to wymagane. Nazwa kolejki jest odczytywana z pliku konfiguracji. Adres podstawowy jest używany przez narzędzie ServiceModel Metadata Tool (Svcutil.exe) do generowania serwera proxy dla usługi.

// 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();
    }
}

Nazwa kolejki MSMQ jest określona w sekcji app Ustawienia pliku konfiguracji. Punkt końcowy usługi jest zdefiniowany w sekcji system.serviceModel pliku konfiguracji i określa netMsmqBinding powiązanie.

Uwaga

Nazwa kolejki używa kropki (.) dla maszyny lokalnej i separatorów ukośnika odwrotnego w ścieżce podczas tworzenia kolejki przy użyciu polecenia System.Messaging. Adres punktu końcowego programu Windows Communication Foundation (WCF) określa net.msmq: scheme, używa "localhost" dla maszyny lokalnej i ukośników w ścieżce.

Gwarancje i trwałość lub zmienność komunikatów są również określone w konfiguracji.

<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>

Ponieważ przykład wysyła komunikaty w kolejce przy użyciu kolejki nie transakcyjnej, nie można wysyłać komunikatów transakcyjnych do kolejki.

// 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();

Po uruchomieniu przykładu działania klienta i usługi są wyświetlane zarówno w oknach konsoli usługi, jak i klienta. Usługa odbiera komunikaty od klienta. Naciśnij klawisz ENTER w każdym oknie konsoli, aby zamknąć usługę i klienta. Należy pamiętać, że ponieważ kolejkowanie jest używane, klient i usługa nie muszą być uruchomione w tym samym czasie. Możesz uruchomić klienta, zamknąć go, a następnie uruchomić usługę i nadal odbierać komunikaty.

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

Aby skonfigurować, skompilować i uruchomić przykład

  1. Upewnij się, że wykonano procedurę instalacji jednorazowej dla przykładów programu Windows Communication Foundation.

  2. Aby skompilować wersję rozwiązania w języku C# lub Visual Basic .NET, postępuj zgodnie z instrukcjami w temacie Building the Windows Communication Foundation Samples (Tworzenie przykładów programu Windows Communication Foundation).

  3. Aby uruchomić przykład w konfiguracji pojedynczej lub między maszynami, postępuj zgodnie z instrukcjami w temacie Uruchamianie przykładów programu Windows Communication Foundation.

Domyślnie w systemie NetMsmqBindingsą włączone zabezpieczenia transportu. Istnieją dwie istotne właściwości zabezpieczeń transportu MSMQ, MsmqAuthenticationMode a.MsmqProtectionLeveldomyślnie tryb uwierzytelniania jest ustawiony na Windows , a poziom ochrony jest ustawiony na Sign. Aby usługa MSMQ zapewniała funkcję uwierzytelniania i podpisywania, musi być częścią domeny, a opcja integracji usługi Active Directory dla usługi MSMQ musi być zainstalowana. Jeśli uruchomisz ten przykład na komputerze, który nie spełnia tych kryteriów, zostanie wyświetlony błąd.

Aby uruchomić przykład na komputerze przyłączonym do grupy roboczej lub bez integracji z usługą Active Directory

  1. Jeśli komputer nie jest częścią domeny lub nie ma zainstalowanej integracji z usługą Active Directory, wyłącz zabezpieczenia transportu, ustawiając tryb uwierzytelniania i poziom ochrony, tak None jak pokazano w poniższym przykładowym kodzie konfiguracji:

    <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. Przed uruchomieniem przykładu upewnij się, że zmienisz konfigurację zarówno na serwerze, jak i na kliencie.

    Uwaga

    Ustawienie security mode wartości jest None równoważne ustawieniu MsmqAuthenticationMode, MsmqProtectionLeveli Message zabezpieczeń na Nonewartość .