Komunikasi Berantrean Volatil

Sampel Volatile menunjukkan cara melakukan komunikasi antrean volatil melalui transportasi Message Queuing (MSMQ). Sampel ini menggunakan NetMsmqBinding. Layanan dalam hal ini adalah aplikasi konsol yang dihost secara mandiri untuk memungkinkan Anda mengamati layanan yang menerima pesan antrean.

Nota

Prosedur penyiapan dan instruksi build untuk sampel ini terletak di akhir topik ini.

Dalam komunikasi antrian, klien berkomunikasi dengan layanan menggunakan antrian. Lebih tepatnya, klien mengirim pesan ke daftar antrian. Layanan menerima pesan dari antrean. Oleh karena itu, layanan dan klien tidak harus beroperasi pada saat yang bersamaan untuk berkomunikasi menggunakan antrean.

Ketika Anda mengirim pesan tanpa jaminan, MSMQ hanya melakukan upaya terbaik untuk mengirimkan pesan, tidak seperti jaminan Persis Sekali di mana MSMQ memastikan bahwa pesan dikirimkan atau, jika tidak dapat dikirimkan, memberi tahu Anda bahwa pesan tidak dapat dikirimkan.

Dalam skenario tertentu, Anda mungkin ingin mengirim pesan volatil tanpa jaminan atas antrean, ketika pengiriman tepat waktu lebih penting daripada kehilangan pesan. Pesan volatil tidak bertahan dari gangguan pada manajer antrean. Oleh karena itu, jika pengelola antrean mengalami kerusakan, antrean non-transaksional yang digunakan untuk menyimpan pesan volatil akan tetap ada, tetapi pesan-pesan itu sendiri tidak bertahan karena pesan tersebut tidak disimpan di dalam disk.

Nota

Anda tidak dapat mengirim pesan volatil tanpa jaminan dalam cakupan transaksi menggunakan MSMQ. Anda juga harus membuat antrean non-transaksi untuk mengirim pesan volatil.

Kontrak layanan pada sampel ini adalah IStockTicker yang mendefinisikan layanan satu arah yang paling cocok untuk digunakan dengan antrean.

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

Operasi layanan menampilkan simbol ticker dan harga saham, seperti yang ditunjukkan dalam kode sampel berikut.

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

Layanan ini dihost sendiri. Saat menggunakan protokol transportasi MSMQ, antrean yang digunakan harus dibuat terlebih dahulu. Ini dapat dilakukan secara manual atau melalui kode. Dalam sampel ini, layanan berisi kode untuk memeriksa keberadaan antrean dan membuatnya jika diperlukan. Nama antrean dibaca dari file konfigurasi. Alamat dasar digunakan oleh Alat Utilitas Metadata ServiceModel (Svcutil.exe) untuk menghasilkan proksi untuk layanan.

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

Nama antrean MSMQ ditentukan di bagian appSettings dari file konfigurasi. Titik akhir untuk layanan ditentukan di bagian system.serviceModel dari file konfigurasi dan menentukan pengikatan netMsmqBinding .

Nota

Nama antrean menggunakan titik (.) untuk komputer lokal dan pemisah garis miring terbalik pada jalurnya ketika membuat antrean menggunakan System.Messaging. Alamat titik akhir Windows Communication Foundation (WCF) menentukan skema net.msmq:, menggunakan "localhost" untuk komputer lokal dan meneruskan garis miring maju yang terletak di jalurnya.

Jaminan dan durabilitas atau volatilitas pesan juga ditentukan dalam konfigurasi.

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

Karena sampel mengirim pesan dalam antrean menggunakan antrean non-transaksional, pesan transaksi tidak dapat dikirim ke antrean.

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

Saat Anda menjalankan sampel, aktivitas klien dan layanan ditampilkan di jendela layanan dan konsol klien. Anda dapat melihat layanan menerima pesan dari klien. Tekan ENTER di setiap jendela konsol untuk mematikan layanan dan klien. Perhatikan bahwa karena antrean digunakan, klien dan layanan tidak perlu berfungsi secara bersamaan. Anda dapat menjalankan klien, mematikannya, lalu memulai layanan dan masih menerima pesannya.

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

Untuk menyiapkan, mengompilasi, dan menjalankan sampel

  1. Pastikan Anda telah melakukan Prosedur Penyiapan One-Time untuk Sampel Windows Communication Foundation.

  2. Untuk membangun solusi edisi C# atau Visual Basic .NET, ikuti instruksi di Membangun Sampel Windows Communication Foundation.

  3. Untuk menjalankan sampel dalam konfigurasi satu atau lintas komputer, ikuti instruksi di Menjalankan Sampel Windows Communication Foundation.

Secara default dengan NetMsmqBinding, keamanan transportasi diaktifkan. Ada dua properti terkait untuk keamanan transportasi MSMQ, MsmqAuthenticationMode danMsmqProtectionLevel.Secara default, mode autentikasi diatur ke Windows dan tingkat perlindungan diatur ke Sign. Agar MSMQ menyediakan fitur autentikasi dan penandatanganan, MSMQ harus menjadi bagian dari domain dan opsi integrasi direktori aktif untuk MSMQ harus diinstal. Jika Anda menjalankan sampel ini pada komputer yang tidak memenuhi kriteria ini, Anda menerima kesalahan.

Untuk menjalankan sampel di komputer yang bergabung ke grup kerja atau tanpa integrasi direktori aktif

  1. Jika komputer Anda bukan bagian dari domain atau tidak memiliki integrasi direktori aktif yang terinstal, nonaktifkan keamanan transportasi dengan mengatur mode autentikasi dan tingkat perlindungan ke None seperti yang ditunjukkan dalam kode konfigurasi sampel berikut:

    <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. Pastikan Anda mengubah konfigurasi di server dan klien sebelum menjalankan sampel.

    Nota

    Pengaturan security mode ke None setara dengan pengaturan MsmqAuthenticationMode, , MsmqProtectionLeveldan Message keamanan ke None.