Megosztás:


"Üzenet várakoztatás a Windows Communication Foundation rendszerhez"

Az MsmqToWcf-minta bemutatja, hogy egy Message Queuing (MSMQ) alkalmazás hogyan küldhet MSMQ-üzenetet egy Windows Communication Foundation (WCF) szolgáltatásnak. 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.

A szolgáltatási szerződés egy egyirányú szolgáltatást határoz meg, amely alkalmas az üzenetsorok kezelésére. Az MSMQ-üzenetek nem rendelkeznek műveletfejléccel, így nem lehet különböző MSMQ-üzeneteket automatikusan hozzárendelni a műveleti szerződésekhez. Ezért csak egy műveleti szerződés lehet. Ha több műveleti szerződést szeretne meghatározni a szolgáltatáshoz, az alkalmazásnak meg kell adnia az MSMQ-üzenetben szereplő fejlécet (például a címkét vagy a korrelációs azonosítót) annak eldöntéséhez, hogy melyik műveleti szerződést küldje el.

Az MSMQ-üzenet nem tartalmaz információt arról, hogy mely fejlécek vannak leképezve a műveleti szerződés különböző paramétereihez. A paraméter típusa MsmqMessage<T>(MsmqMessage<T>), amely a mögöttes MSMQ-üzenetet tartalmazza. Az MsmqMessage<T> "T" típus a (MsmqMessage<T>) osztályban jelöli az MSMQ-üzenettörzsbe szerializált adatokat. Ebben a mintában a PurchaseOrder típus szerializálva lesz az MSMQ üzenettörzsében.

Az alábbi mintakód a rendelésfeldolgozó szolgáltatás szolgáltatási szerződését mutatja be.

// Define a service contract.
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
[ServiceKnownType(typeof(PurchaseOrder))]
public interface IOrderProcessor
{
    [OperationContract(IsOneWay = true, Action = "*")]
    void SubmitPurchaseOrder(MsmqMessage<PurchaseOrder> msg);
}

A szolgáltatás saját üzemeltetésű. AZ MSMQ 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 ellenőrzi az üzenetsor meglétét, és szükség esetén létrehozza azt. A sor nevét a konfigurációs fájlból olvassák be.

public static void Main()
{
    // Get the MSMQ queue name from the application settings in
    // configuration.
    string queueName = ConfigurationManager.AppSettings["queueName"];
    // Create the MSMQ queue if necessary.
    if (!MessageQueue.Exists(queueName))
        MessageQueue.Create(queueName, true);
    …
}

A szolgáltatás létrehoz és megnyit egy ServiceHost a OrderProcessorService számára, ahogy az a következő mintakódban látható.

using (ServiceHost serviceHost = new ServiceHost(typeof(OrderProcessorService)))
{
    serviceHost.Open();
    Console.WriteLine("The service is ready.");
    Console.WriteLine("Press <ENTER> to terminate service.");
    Console.ReadLine();
    serviceHost.Close();
}

Az MSMQ-üzenetsor neve a konfigurációs fájl AppSettings szakaszában van megadva, ahogyan az az alábbi mintakonfigurációban látható.

Megjegyzés:

Az sor neve pontot (.) használ a helyi számítógéphez, és perjeleket az elérési útvonalában. A WCF végpontcíme egy msmq.formatname sémát határoz meg, és a localhostot használja a helyi számítógéphez. Az egyes MSMQ formátumnév-címzési irányelvekhez tartozó üzenetsor címe az msmq.formatname sémát követi.

<appSettings>
    <add key="orderQueueName" value=".\private$\Orders" />
</appSettings>

Az ügyfélalkalmazás egy MSMQ-alkalmazás, amely a Send módszerrel tartós és tranzakciós üzenetet küld az üzenetsorba, ahogyan az az alábbi mintakódban látható.

//Connect to the queue.
MessageQueue orderQueue = new MessageQueue(ConfigurationManager.AppSettings["orderQueueName"]);

// Create the purchase order.
PurchaseOrder po = new PurchaseOrder();
po.CustomerId = "somecustomer.com";
po.PONumber = Guid.NewGuid().ToString();

PurchaseOrderLineItem lineItem1 = new PurchaseOrderLineItem();
lineItem1.ProductId = "Blue Widget";
lineItem1.Quantity = 54;
lineItem1.UnitCost = 29.99F;

PurchaseOrderLineItem lineItem2 = new PurchaseOrderLineItem();
lineItem2.ProductId = "Red Widget";
lineItem2.Quantity = 890;
lineItem2.UnitCost = 45.89F;

po.orderLineItems = new PurchaseOrderLineItem[2];
po.orderLineItems[0] = lineItem1;
po.orderLineItems[1] = lineItem2;

// Submit the purchase order.
Message msg = new Message();
msg.Body = po;
//Create a transaction scope.
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{

    orderQueue.Send(msg, MessageQueueTransactionType.Automatic);
    // Complete the transaction.
    scope.Complete();

}
Console.WriteLine("Placed the order:{0}", po);
Console.WriteLine("Press <ENTER> to terminate client.");
Console.ReadLine();

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 például a klienst, leállíthatja, majd elindíthatja a szolgáltatást, és az továbbra is megkapja az üzeneteit.

A minta beállítása, összeállítása é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. Ha a szolgáltatást először futtatják, ellenőrzi, hogy az üzenetsor jelen van-e. Ha az üzenetsor nincs jelen, a szolgáltatás létrehoz egyet. Először futtathatja a szolgáltatást az üzenetsor létrehozásához, vagy létrehozhat egyet az MSMQ Queue Manageren keresztül. Az alábbi lépéseket követve hozzon létre egy sort a Windows Server 2008-ban.

    1. Nyissa meg a Kiszolgálókezelőt a Visual Studio 2012-ben.

    2. Nyissa meg a Funkciók lapot.

    3. Kattintson a jobb gombbal a Privát üzenetsorokelemre, és válassza Új, Privát üzenetsorlehetőséget.

    4. Jelölje be a Tranzakciós jelölőnégyzetet.

    5. Adja meg ServiceModelSamplesTransacted az új üzenetsor neveként.

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

  4. Ha a mintát egy számítógép konfigurációjában szeretné futtatni, kövesse a Windows Communication Foundation-minták futtatására vonatkozó utasításokat.

A minta futtatása számítógépeken

  1. Másolja a szolgáltatásprogram fájljait a \service\bin\ mappából a nyelvspecifikus mappából a szolgáltatásszámítógépre.

  2. Másolja az ügyfélprogram fájljait a \client\bin\ mappából a nyelvspecifikus mappából az ügyfélszámítógépre.

  3. A Client.exe.config fájlban módosítsa az orderQueueName nevet úgy, hogy a "." helyett a szolgáltatásszámítógép nevét adja meg.

  4. A szolgáltatásszámítógépen indítsa el a Service.exe parancssorból.

  5. Az ügyfélszámítógépen indítsa el a Client.exe parancssorból.

Lásd még