Bagikan melalui


Komunikasi Antrean Volatil

Sampel Volatil menunjukkan cara melakukan komunikasi antrean volatil melalui transportasi Message Queuing (MSMQ). Sampel ini menggunakan NetMsmqBinding. Layanan dalam kasus ini adalah aplikasi konsol yang dihosting sendiri untuk memungkinkan Anda mengamati layanan yang menerima pesan antrean.

Catatan

Prosedur penyiapan dan petunjuk pembuatan untuk sampel ini terdapat di akhir topik ini.

Di komunikasi dalam antrean, klien berkomunikasi ke layanan menggunakan antrean. Lebih tepatnya, klien mengirim pesan ke antrean. Layanan menerima pesan dari antrean. Oleh karena itu, layanan dan klien tidak harus berjalan pada saat yang bersamaan untuk berkomunikasi menggunakan antrean.

Ketika Anda mengirim pesan tanpa jaminan, MSMQ hanya melakukan upaya terbaik untuk menyampaikan pesan, tidak seperti jaminan Exactly Once di mana MSMQ memastikan bahwa pesan dikirim atau, jika tidak dapat dikirim, memberi tahu Anda bahwa pesan tidak dapat dikirim.

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 akan bertahan dari crash manajer antrean. Oleh karena itu jika manajer antrean mengalami crash, antrean non-transaksional yang digunakan untuk menyimpan pesan volatil bisa bertahan tetapi pesan itu sendiri tidak bisa karena pesan tidak disimpan pada disk.

Catatan

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

Kontrak layanan dalam 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 dan harga kode saham, seperti yang ditunjukkan pada 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 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 pada file konfigurasi. Titik akhir untuk layanan didefinisikan di bagian system.serviceModel dari file konfigurasi dan menentukan pengikatan netMsmqBinding.

Catatan

Nama antrean menggunakan titik (.) untuk komputer lokal dan pemisah garis miring terbalik di jalurnya saat membuat antrean menggunakan System.Messaging. Alamat titik akhir Windows Communication Foundation (WCF) menentukan net.msmq: scheme, menggunakan "localhost" untuk komputer lokal dan garis miring di jalurnya.

Jaminan dan daya tahan 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 yang diantrekan dengan menggunakan antrean non-transaksional, pesan yang ditransaksikan 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 baik di jendela konsol layanan dan klien. Anda dapat melihat layanan menerima pesan dari klien. Tekan ENTER di setiap jendela konsol untuk mematikan layanan dan klien. Perhatikan bahwa karena antrean sedang digunakan, klien dan layanan tidak harus aktif dan dijalankan pada saat yang sama. Anda dapat menjalankan klien, mematikannya, dan kemudian memulai layanan dan klien masih akan 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, membangun, dan menjalankan sampel

  1. Pastikan Anda telah melakukan Prosedur Penyiapan Satu Kali untuk Sampel Windows Communication Foundation.

  2. Untuk membangun solusi edisi C# atau Visual Basic .NET, ikuti petunjuknya di Membangun Sampel WCF.

  3. Untuk menjalankan sampel dalam konfigurasi satu atau lintas komputer, ikuti instruksi pada Menjalankan Sampel WCF.

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 sampel ini dijalankan di komputer yang tidak memenuhi kriteria ini, Anda akan menerima kesalahan.

Menjalankan sampel di komputer yang digabungkan ke grup kerja atau tanpa integrasi direktori aktif

  1. Jika komputer Anda bukan bagian dari domain atau tidak memiliki integrasi direktori aktif yang telah diinstal, 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.

    Catatan

    Mengatur security mode ke None setara dengan mengatur keamanan MsmqAuthenticationMode, MsmqProtectionLevel, dan Message ke None.