330 likes | 495 Views
Programmkommunikation Microsoft Message Queueing. Asynchron und Nachrichtenbasiert. E-Mail Marcel@Gnoth.net. No. NA10, NT5. Zur Person. Dipl. Inf. Marcel Gnoth, MCSD www.gnoth.net Code und Powerpoint auf der Webseite NTeam GmbH, Berlin www.nteam.de
E N D
Programmkommunikation Microsoft Message Queueing Asynchron und Nachrichtenbasiert E-Mail Marcel@Gnoth.net No. NA10, NT5
Zur Person • Dipl. Inf. Marcel Gnoth, MCSD • www.gnoth.net • Code und Powerpoint auf der Webseite • NTeam GmbH, Berlin • www.nteam.de • IT – Infrastruktur, BI, BizTalk, Entwicklung • Senior Consultant, Trainer, Programmierer • Autor dotnet magazin und dotnetpro • VB6, COM, Datenbanken • Verteilte Informationssysteme • Und .....Net
Agenda • Kurze Einführung MSQM • Beispiel – Anwendung • Fallbeispiele • Offline Einsatz mit abgeklemmten Kabel • Journal, Timeouts, Acknowledgements • Message Queuing Trigger • Neuerungen in MSMQ3 • Messages über HTTP • Real Time Multicast Messages
Teil 1 Kurze Einführung
Message Queueing • Briefe zwischen Computern versenden
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 • Workflows
Einführung Technik • Versionen • NT4: MSMQ 1.0 (Option Pack) • Win2k MSMQ 2.0 • WinXP MSMQ 3.0 • Auch Win CE 3.0 • Bestandteil des Win2k / WinXP Setup • Active Directory / Domänen Controller • MQIS • Message Queue Information Store • Public Queues • Ohne MQIS nur Private Queues
Objekte • Referenz: System.Messaging • MessageQueue • Zugriff auf eine Warteschlange • Message • Nachrichten, die verschickt oder empfangen werden • Achtung: ohne Active Directory = Workgroup – Modus -> nur Private Queues
Ö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")
Ö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=HTTP://MSMQComputer/msmq/MyPublicQueue FormatName:DIRECT=HTTPS://MSMQComputer/msmq/MyPublicQueue FormatName:DIRECT=OS:MachineName\QueueName FormatName:DIRECT=OS:MachineName\Private$\QueueName Dim myQueue As New MessageQueue _ ("FormatName:DIRECT=OS:Gengar\private$\Jobs")
Senden einer Nachricht • Queue öffnen • Send Methode mit einem Objekt aufrufen • Objekt wird serialisiert <Serializable()> Public Class Job • XML ist Standardformat • z.B. DataSets verschicken • Eigenes Message – Objekt verwenden • Konfiguration vieler Parameter msgQ.Send(myObject, "Message Label")
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
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
Beispielprojekt Jobs und Shops
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
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
MSMQ im Detail Offline Trigger TimeOuts Acknowledgements Journlaing
Offline • Disconnected Szenario • Außendienstmitarbeiter • Ausfallsicherheit • Direct Format Name verwenden • Kein Directory Service • Nachrichten im Recover – Mode verschicken • Ausgehende Warteschlangen theMsg.Recoverable = True
Trigger • Windows Service (mqtgsvc.exe) • Verwendet Regeln • Instanziiert COM Komponente • Startet Exe • Parameterübergabe
Demo Trigger
Time Outs • Was passiert, wenn Nachricht nicht gelesen wird? • MSMQ informiert wenn Zeiten zum Übermitteln und zum Lesen überschritten werden • Properties: • TimeToReachQueue • TimeToBeReceived
Acknowlegdgements • MSMQ schickt Bestätigungs - Nachrichten • ReachQueue: Erreichen der Queue • Receive: Aus der Queue entnommen • AcknowledgeTypes: • None • FullReachQueue, PositiveArrival • NotAcknowledgeReachQueue • FullReceive, NotAcknowledgeReceive • NegativeReceive, PositiveReceive
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
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
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
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
Neues in MSMQ 3 • Trigger • Zugriff auf Queues über HTTP(S) • real-time multicast messaging • Administration
Uff... Fragen? Alles wird gut