Megosztás:


Illékony üzenetsoros kommunikáció

Az illékony minta bemutatja, hogyan hajthat végre illékony üzenetsoros kommunikációt a Message Queuing (MSMQ) átvitelen keresztül. Ez a minta a következőt használja NetMsmqBinding: . Ebben az esetben a szolgáltatás egy saját üzemeltetésű konzolalkalmazás, amely lehetővé teszi az üzenetsorba helyezett üzeneteket fogadó szolgáltatás megfigyelését.

Megjegyzés:

A minta telepítési eljárása és összeállítási utasításai a témakör végén találhatók.

Az üzenetsoros kommunikáció során az ügyfél üzenetsor használatával kommunikál a szolgáltatással. Pontosabban az ügyfél üzeneteket küld egy üzenetsorba. A szolgáltatás üzeneteket fogad az üzenetsorból. A szolgáltatásnak és az ügyfélnek ezért nem kell egyszerre futnia ahhoz, hogy üzenetsor használatával kommunikáljon.

Ha garanciát nem tartalmazó üzenetet küld, az MSMQ csak az üzenet kézbesítésére törekszik, ellentétben a pontos egyszeri garanciával, ahol az MSMQ biztosítja az üzenet kézbesítését, vagy ha nem kézbesíthető, tudatja Önnel, hogy az üzenet nem kézbesíthető.

Bizonyos esetekben előfordulhat, hogy olyan volatilis üzenetet szeretne küldeni, amely nem biztosít bizonyosságot az üzenetsoron, ha az időben történő kézbesítés fontosabb, mint az üzenetek elvesztése. Az ingatag üzenetek nem élik túl a várólista-kezelő összeomlását. Ezért ha a várólista-kezelő összeomlik, a nem tranzakciós üzenetsor, amely az illékony üzenetek tárolására szolgál, megmarad, de maguk az üzenetek nem, mert az üzenetek nincsenek a lemezen tárolva.

Megjegyzés:

Az MSMQ használatával nem küldhet olyan illékony üzeneteket, amely nem tartalmaz biztosítékokat egy tranzakció hatókörén belül. Emellett létre kell hoznia egy nem tranzakciós üzenetsort is az illékony üzenetek küldéséhez.

A mintában szereplő szolgáltatási szerződés egy IStockTicker olyan egyirányú szolgáltatásokat határoz meg, amelyek a legjobban alkalmasak a sorba állításhoz.

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

A szolgáltatásművelet megjeleníti a tőzsdei ticker szimbólumot és az árat az alábbi mintakódban látható módon:

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

A szolgáltatás saját üzemeltetésű. Az MSMQ-átvitel használatakor a használt üzenetsort előre létre kell hozni. Ez manuálisan vagy kódon keresztül is elvégezhető. Ebben a mintában a szolgáltatás kódokat tartalmaz az üzenetsor meglétének ellenőrzéséhez és szükség esetén létrehozásához. A sor nevét a konfigurációs fájlból olvassák be. Az alapcímet a ServiceModel metadata segédprogram (Svcutil.exe) használja a szolgáltatás proxyjának létrehozásához.

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

Az MSMQ-üzenetsor neve a konfigurációs fájl AppSettings szakaszában van megadva. A szolgáltatás végpontja a konfigurációs fájl system.serviceModel szakaszában van definiálva, és megadja a kötést netMsmqBinding .

Megjegyzés:

Az üzenetsor neve egy pont (.) karaktert használ a helyi gépen, és visszavonalat alkalmaz az elérési útjában, amikor üzenetsort hoz létre System.Messaging használatával. A Windows Communication Foundation (WCF) végpontcíme egy net.msmq: sémát határoz meg, a helyi géphez a "localhost"-t használja, és perjeleket továbbít az elérési útján.

Az üzenetek megbízhatósága és tartóssága vagy változékonysága a konfigurációban is meg van adva.

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

Mivel a minta nem tranzakciós üzenetsor használatával küld várólistás üzeneteket, a tranzakciós üzenetek nem küldhetők el az üzenetsorba.

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

A minta futtatásakor az ügyfél- és szolgáltatástevékenységek a szolgáltatás és az ügyfélkonzol ablakaiban is megjelennek. Láthatja, hogy a szolgáltatás üzeneteket fogad az ügyféltől. A szolgáltatás és az ügyfél leállításához nyomja le az ENTER billentyűt az egyes konzolablakokban. Vegye figyelembe, hogy mivel a sorba állítás használatban van, az ügyfélnek és a szolgáltatásnak nem kell egyszerre üzemelnie. Futtathatja az ügyfelet, leállíthatja, majd elindíthatja a szolgáltatást, és az még mindig megkapja az üzeneteit.

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

A példa beállítása, elkészítése és futtatása

  1. Győződjön meg arról, hogy elvégezte a Windows Communication Foundation-minták One-Time beállítási eljárását.

  2. A megoldás C# vagy Visual Basic .NET kiadásának létrehozásához kövesse Windows Communication Foundation-mintákcímű témakör utasításait.

  3. Ha a mintát egy vagy több gép közötti konfigurációban szeretné futtatni, kövesse A Windows Communication Foundation-minták futtatásacímű témakör utasításait.

Alapértelmezés szerint az NetMsmqBinding átviteli biztonsági engedélyezve van. Az MSMQ átviteli biztonságának két lényeges tulajdonsága van, MsmqAuthenticationMode ésMsmqProtectionLevel.alapértelmezés szerint a hitelesítési mód van beállítvaWindows, a védelmi szint pedig a következőre van állítvaSign. Ahhoz, hogy az MSMQ biztosítsa a hitelesítési és aláírási funkciót, egy tartománynak kell lennie, és telepítenie kell az MSMQ Active Directory-integrációs lehetőségét. Ha a mintát olyan számítógépen futtatja, amely nem felel meg ezeknek a feltételeknek, hibaüzenet jelenik meg.

A minta futtatása munkacsoporthoz csatlakoztatott számítógépen vagy Active Directory-integráció nélkül

  1. Ha a számítógép nem része tartománynak, vagy nincs telepítve active directory-integráció, kapcsolja ki az átviteli biztonságot úgy, hogy a hitelesítési módot és a védelmi szintet az alábbi konfigurációs mintakódban látható módon None állítja be:

    <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. A minta futtatása előtt győződjön meg arról, hogy a kiszolgálón és az ügyfélen is módosítja a konfigurációt.

    Megjegyzés:

    A security mode beállítása egyenértékű azzal, hogy a None, MsmqAuthenticationMode és MsmqProtectionLevel biztonsági beállítását Message-re állítjuk.