1 / 44

Message Queueing

Message Queueing. Stille Post mit dem .Net-Framework. Marcel Gnoth, NTeam GmbH. No. 240. Zur Person. Dipl. Inf. Marcel Gnoth www.gnoth.net NTeam GmbH, Berlin www.nteam.de Senior Consultant, Trainer VB6, COM, Datenbanken Verteilte Informationssysteme Und .... .Net. Überblick.

aure
Download Presentation

Message Queueing

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Message Queueing Stille Post mit dem .Net-Framework Marcel Gnoth, NTeam GmbH No. 240

  2. Zur Person • Dipl. Inf. Marcel Gnoth • www.gnoth.net • NTeam GmbH, Berlin • www.nteam.de • Senior Consultant, Trainer • VB6, COM, Datenbanken • Verteilte Informationssysteme • Und .....Net

  3. Überblick • Einführung MSMQ • Vorstellen des Anwendungsszenarios • MSMQ im Detail

  4. Message Queueing Einführung

  5. Message – Queueing • Transport von Nachrichten zwischen Computern

  6. Einführung Konzepte • Asynchrone Abarbeitung von Aufgaben • Empfänger oder Sender kann Offline sein • Nachrichten werden zwischengepuffert • Aktiver Austausch von Informationen • zwischen Programmen / Computern • Pushen der Infos

  7. Einführung Technik • Versionen • NT4: MSMQ 1.0 (Option Pack) • ab Win2k MSMQ 2.0 • Bestandteil des Win2k / WinXP Setup • Active Directory / Domänen Controller • MQIS • Message Queue Information Store • Public Queues • Aktive Directory • Ohne MQIS nur Private Queues

  8. Einführung Programmieren • Referenz auf System.Messaging • MessageQueue • Zugriff auf eine Warteschlange • Public Queues • Sind im MQIS eingetragen • Private Queues • Ohne Active Directory • Message • Nachrichten, die verschickt oder empfangen werden

  9. Öffnen einer Queue • MessageQueue.Create (Path As String) • New MessageQueue (Path As String) • MessageQueue.Exists (Path As String) Imports System.Messaging Private WithEvents m_JobQueue As MessageQueue Sub Test() m_JobQueue = New MessageQueue _ ("Gengar\Private$\Jobs") End Sub Dim mqs As MessageQueue() = _ MessageQueue.GetPrivateQueuesByMachine("Gengar")

  10. Wie findet MSMQ eine Queue? • Mit MQIS (Active Directory) • Public und Private • Path - Property • Label - Property • FormatName - Property • Ohne MQIS • Nur Private • FormatName - Property

  11. Öffnen mit Path • Zugriff auf MQIS • Kein Offline • Private Queues nur lokal öffnen Dim mq As MessageQueue, s As String s = "Gengar\Jobs" 'Public s = "Gengar\Private$\Jobs" 'Private mq = New MessageQueue(s)

  12. Öffnen mit Label • Label = Name einer Queue • Sucht über MQIS die Queue • Langsamer, da Zugriff auf MQIS • Kein Offline • Nur Public Queues Dim myQueue As New MessageQueue("Label:TheLabel")

  13. Öffnen mit FormatName • Offline Mode • Ohne MQIS • Schnellste und flexibelste Methode FormatName:Public=5A5F7535-AE9A-41d4-935C-845C2AFF7112 FormatName:DIRECT=SPX:NetworkNumber;HostNumber\QueueName FormatName:DIRECT=TCP:IPAddress\QueueName FormatName:DIRECT=OS:MachineName\QueueName FormatName:DIRECT=OS:MachineName\Private$\QueueName Dim myQueue As New MessageQueue _ ("FormatName:DIRECT=OS:Gengar\private$\Jobs")

  14. Senden einer Nachricht • Queue öffnen • Send Methode mit einen String oder einem Objekt aufrufen • Object wird serialisiert • XML ist Standardformat • z.B. DataSets verschicken msgQ.Send(myObject, "Message Label")

  15. Senden mit explizitem Message - Objekt • Konfigurieren der Message – Parameter • Format, Verschlüsselung, TimeOuts • Formate für Serialisierung: • XMLMessageFormatter • BinaryMessageFormatter • ActiveXMessageFormatter With myMsg .Label = "Job " + theJob.ID .Formatter = New BinaryMessageFormatter() .AppSpecific = 34 .Priority = MessagePriority.VeryHigh .Body = theJob End With

  16. Demo: Nachricht versenden

  17. Inhalt einer Queue ansehen • Peek – Methode • GetEnumerator myMsg = m_JobQueue.Peek() Dim eM As IEnumerator = mqJobs.GetEnumerator() lstJobMessages.Items.Clear() Do While eM.MoveNext() Dim q As Message q = CType(eM.Current, Message) lstJobMessages.Items.Add(q.Label) Loop

  18. Nachricht empfangen • Receive • BeginReceive • Asynchrones Empfangen Dim msg As Message = mqResults.Receive() mqResults.BeginReceive() Private Sub mqResults_ReceiveCompleted(..., _ ByVal e As ...ReceiveCompletedEventArgs) _Handles mqResults.ReceiveCompleted Dim myMsg As System.Messaging.Message myMsg = e.Message End Sub

  19. Format der Nachricht • Body ist vom Typ Object • Mögliche Typen festlegen • Formatter initialisieren • Für Deserialisierung zuständig Dim m_MsgTargetTypes(1) As Type m_MsgTargetTypes(0) = GetType(String) m_MsgTargetTypes(1) = GetType(Job) Dim m_XmlMsgFrmt As XmlMessageFormatter m_XmlMsgFrmt = New _ XmlMessageFormatter(m_MsgTargetTypes)

  20. Nachrichten Body auspacken • Der Formatter deserialisiert den Body • Erzeugt gewünschtes Objekt Dim j As Job, s As String myMsg.Formatter = m_XmlMsgFrmt If TypeOf (myMsg.Body) Is Job Then 'Job Object j = CType(myMsg.Body, Job) ProcessJob(j) Else 'String s = CStr(myMsg.Body) Console.Write(s) End If

  21. Woher weiß der Formatter das? • Durch Reflection kann zur Laufzeit ein Object „untersucht“ werden • Klasse als <Serializable()> kennzeichnen • Wird automatisch serialisiert <Serializable()> Public Class Job Public Name As String End Class

  22. Demo Nachricht empfangen

  23. MSMQ in der Praxis Job Shop Scheduling als Anwendungsszenario

  24. Job Shop Scheduling • Viele Jobs die lange dauern • Arbeit auf mehrere Rechner verteilen • Ergebnisse werden eingesammelt • Eine oder mehrere • Queue(s) mit Aufträgen • Queue(s) mit Ergebnissen

  25. Job Shop Scheduling

  26. Projekte • JobShopComponent (Dll) • Klassen Job und Jobs • Kapselt Aufträge • JobShopManager (Exe) • Erzeugt Jobs • Sammelt Ergebnisse ein • Kontrolliert Bestätigungen • JobShopWorker (Exe) • Nimmt Job aus Queue • Verarbeitet Job • Sendet Ergebnis in Queue

  27. JobShopManager.vbpj • frmCreatorMain • Erzeugt Jobs / Nachrichten • Stellt Nachrichten in Job-Queue

  28. JobShopManager.vbpj • frmResult • Überwacht Result-Queue • Zeigt Ergebnisse an

  29. JobShopWorker.vbpj • Lauscht an der Job-Queue • Bearbeitet Jobs • Sendet Ergebnisse an Result-Queue

  30. Live - Demo

  31. MSMQ im Detail Acknowledgements TimeOuts Journlaing Transaktionen

  32. Time Outs • Was passiert, wenn Nachricht nicht gelesen wird? • MSMQ informiert wenn Zeiten zum Übermitteln und zum Lesen überschritten werden • Properties: • TimeToReachQueue • TimeToBeReceived

  33. Acknowlegdgements • MSMQ schickt Bestätigungs - Nachrichten • ReachQueue: Erreichen der Queue • Receive: Aus der Queue entnommen • AcknowledgeTypes: • None • FullReachQueue, PositiveArrival • NotAcknowledgeReachQueue • FullReceive, NotAcknowledgeReceive • NegativeReceive, PositiveReceive

  34. Acknowledgements • AdministratorQueue: • Wurde der Nachricht beim Versenden übergeben • Benachrichtigungen landen in dieser Queue • Ganz „normale“ Queue • Nach dem Senden ist Message.ID gesetzt theMsg.TimeToBeReceived = New TimeSpan(0, 0, 20) theMsg.AcknowledgeType = _ AcknowledgeTypes.FullReachQueue Or _ AcknowledgeTypes.FullReceive theMsg.AdministrationQueue = m_JobAckQueue m_JobQueue.Send(theMsg) myJob.MQMessageID = theMsg.Id 'für CorrelationID

  35. Acknowledgement Nachrichten • MessageType: • Acknowledgment • CorrelationId: • Kennung der betroffenen Nachricht • Beim Öffnen der Ack-Queue: m_JobAckQueue.MessageReadPropertyFilter.CorrelationId = True Dim j As Job, s As String j = m_Jobs.ItemByMQMessageID(theMsg.CorrelationID) s = Msg.Acknowledgment.ToString

  36. Journaling • Überwacht Transport der Nachrichten zwischen einzelnen Computern • Nur bei Versand zwischen Computern! • Journal-Queues: • System-Queues • Individuelle für jede Queue • Eine Systemweite Journal-Queue

  37. Journaling • Szenario: • Negatives Acknowledgement überwachen • Betroffene Nachricht aus der Journal-Queue holen (ReceiveByID) • System – Journal – Queue • Queue eigene Journal - Queue theMsg.UseJournalQueue = True theQueue.UseJournalQueue = True

  38. Demo

  39. Transaktion • Interne MSMQ Transaktionen • DTC – Transaktionen • Distributed Transaktion Coordinator • MSMQ, SQL-Server, Oracle, Sybase • Ressource-Manager arbeiten mit DTC zusammen • Infos: • http://msdn.microsoft.com/library/en-us/dnbda/html/bdadotnettransact1.asp

  40. Fazit - MSMQ • Einfacher Daten (Objekt) – Austausch in der Windowswelt • Bridges in andere Welten • http://www.microsoft.com/msmq/interop.htm • http://www.envoytech.com/ • Wann Einsetzen: • Rechnerübergreifende Kommunikation • Asynchrone Abarbeitung von Programmen • Disconected Programmierung

  41. Fazit - Queues • Public Queues • sind bequemer • nur bei solidem Active Directory • Private Queues • Schneller, weniger Overhead • Ermöglichen Offline – Betrieb • kein Domänen- oder Active Directory Controller vorhanden

  42. Fazit – Formate • XML: • Kleine Datenmenge • BLOBs ??? • Gut lesbar • Binary: • Weniger Overhead, effizienter • Nur wenn XML keinen Sinn macht • Serialisierung kann kontrolliert werden

  43. Links • Basic Pro 5/2001 • „Nachrichtenbasierte Informationssysteme“ • auf MSDN suchen • „Accessing Message Queues“ • http://msdn.microsoft.com/library/en-us/dnbda/html/bdadotnetasync1.asp • „Reliable Messaging with MSMQ and .NET“ • http://msdn.microsoft.com/library/en-us/dnbda/html/bdadotnetasync2.asp • MSMQ Home-Page • http://www.microsoft.com/msmq/overview.htm

  44. Uff... Fragen?

More Related