Upload
ottoline-leeb
View
118
Download
2
Embed Size (px)
Citation preview
No. 240
Marcel Gnoth, NTeam GmbH
Message Queueing
Stille Post mit dem .Net-Framework
Zur Person
Dipl. Inf. Marcel Gnothwww.gnoth.net
NTeam GmbH, Berlinwww.nteam.de
Senior Consultant, TrainerVB6, COM, DatenbankenVerteilte InformationssystemeUnd ....
.Net
Überblick
Einführung MSMQ
Vorstellen des Anwendungsszenarios
MSMQ im Detail
Message Queueing
Einführung
Message – QueueingTransport von Nachrichten
zwischen Computern
Queue Manager
Queue
Message
Message
Message
Queue
Message
Message
Message
Message
Queue Manager
Queue
Message
Message
Queue
Message
Message
Message
Message
Message
Message
Einführung Konzepte
Asynchrone Abarbeitung von AufgabenEmpfänger oder Sender kann Offline
seinNachrichten werden
zwischengepuffert
Aktiver Austausch von Informationen zwischen Programmen / ComputernPushen der Infos
Einführung TechnikVersionen
NT4: MSMQ 1.0 (Option Pack)ab Win2k MSMQ 2.0
Bestandteil des Win2k / WinXP Setup
Active Directory / Domänen Controller
MQISMessage Queue Information StorePublic QueuesAktive DirectoryOhne MQIS nur Private Queues
Einführung ProgrammierenReferenz auf System.MessagingMessageQueue
Zugriff auf eine WarteschlangePublic Queues
Sind im MQIS eingetragen Private Queues
Ohne Active DirectoryMessage
Nachrichten, die verschickt oder empfangen werden
Öffnen einer Queue
MessageQueue.Create (Path As String)
New MessageQueue (Path As String)
MessageQueue.Exists (Path As String)
Imports System.MessagingPrivate WithEvents m_JobQueue As MessageQueueSub Test() m_JobQueue = New MessageQueue _ ("Gengar\Private$\Jobs")End Sub
Dim mqs As MessageQueue() = _ MessageQueue.GetPrivateQueuesByMachine("Gengar")
Wie findet MSMQ eine Queue?
Mit MQIS (Active Directory)Public und PrivatePath - PropertyLabel - PropertyFormatName - Property
Ohne MQISNur PrivateFormatName - Property
Öffnen mit Path
Zugriff auf MQISKein OfflinePrivate Queues nur lokal öffnen
Dim mq As MessageQueue, s As String
s = "Gengar\Jobs" 'Publics = "Gengar\Private$\Jobs" 'Private
mq = New MessageQueue(s)
Öffnen mit Label
Label = Name einer QueueSucht über MQIS die QueueLangsamer, da Zugriff auf MQISKein OfflineNur Public Queues
Dim myQueue As New MessageQueue("Label:TheLabel")
Öffnen mit FormatNameOffline ModeOhne MQISSchnellste 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")
Senden einer Nachricht
Queue öffnenSend Methode mit einen String
oder einem Objekt aufrufenObject wird serialisiertXML ist Standardformatz.B. DataSets verschickenmsgQ.Send(myObject, "Message Label")
Senden mit explizitem Message - ObjektKonfigurieren der Message –
ParameterFormat, Verschlüsselung, TimeOuts
Formate für Serialisierung:XMLMessageFormatterBinaryMessageFormatterActiveXMessageFormatterWith myMsg
.Label = "Job " + theJob.ID .Formatter = New BinaryMessageFormatter() .AppSpecific = 34 .Priority = MessagePriority.VeryHigh .Body = theJobEnd With
Demo: Nachricht versenden
Inhalt einer Queue ansehenPeek – Methode
GetEnumeratorDim 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
myMsg = m_JobQueue.Peek()
Nachricht empfangenReceive
BeginReceiveAsynchrones 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.MessageEnd Sub
Format der NachrichtBody ist vom Typ ObjectMögliche Typen festlegen
Formatter initialisierenFür Deserialisierung zuständig
Dim m_MsgTargetTypes(1) As Typem_MsgTargetTypes(0) = GetType(String)m_MsgTargetTypes(1) = GetType(Job)
Dim m_XmlMsgFrmt As XmlMessageFormatter m_XmlMsgFrmt = New _ XmlMessageFormatter(m_MsgTargetTypes)
Nachrichten Body auspackenDer Formatter deserialisiert den BodyErzeugt gewünschtes Objekt
Dim j As Job, s As StringmyMsg.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
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 StringEnd Class
Demo Nachricht empfangen
MSMQ in der Praxis
Job Shop Scheduling als Anwendungsszenario
Job Shop Scheduling
Viele Jobs die lange dauernArbeit auf mehrere Rechner
verteilenErgebnisse werden eingesammelt
Eine oder mehrere Queue(s) mit AufträgenQueue(s) mit Ergebnissen
Job Shop Scheduling
Job Creator
JobQueue
Result W atcher
ResultQueue
W orker
W orker
W orker
Database
Meßdaten
ProjekteJobShopComponent
(Dll)Klassen Job und JobsKapselt Aufträge
JobShopManager (Exe)Erzeugt JobsSammelt Ergebnisse einKontrolliert
Bestätigungen
JobShopWorker (Exe)Nimmt Job aus QueueVerarbeitet JobSendet Ergebnis in
Queue
JobShopManager.vbpjfrmCreatorMainErzeugt Jobs /
NachrichtenStellt
Nachrichten in Job-Queue
JobShopManager.vbpj
frmResultÜberwacht
Result-QueueZeigt
Ergebnisse an
JobShopWorker.vbpjLauscht an der Job-QueueBearbeitet JobsSendet Ergebnisse an Result-Queue
Live - Demo
MSMQ im DetailAcknowledgementsTimeOutsJournlaingTransaktionen
Time OutsWas passiert, wenn Nachricht nicht
gelesen wird?MSMQ informiert wenn Zeiten
zum Übermitteln und zum Lesen überschritten werden
Properties:TimeToReachQueueTimeToBeReceived
AcknowlegdgementsMSMQ schickt Bestätigungs -
NachrichtenReachQueue: Erreichen der QueueReceive: Aus der Queue entnommenAcknowledgeTypes:
NoneFullReachQueue, PositiveArrivalNotAcknowledgeReachQueueFullReceive, NotAcknowledgeReceiveNegativeReceive, PositiveReceive
AcknowledgementsAdministratorQueue:
Wurde der Nachricht beim Versenden übergeben
Benachrichtigungen landen in dieser Queue
Ganz „normale“ QueueNach dem Senden ist Message.ID
gesetzttheMsg.TimeToBeReceived = New TimeSpan(0, 0, 20)theMsg.AcknowledgeType = _ AcknowledgeTypes.FullReachQueue Or _ AcknowledgeTypes.FullReceivetheMsg.AdministrationQueue = m_JobAckQueuem_JobQueue.Send(theMsg)myJob.MQMessageID = theMsg.Id 'für CorrelationID
Acknowledgement NachrichtenMessageType:Acknowledgment
CorrelationId:Kennung der
betroffenen NachrichtBeim Öffnen der Ack-
Queue:
Dim j As Job, s As Stringj = m_Jobs.ItemByMQMessageID(theMsg.CorrelationID)s = Msg.Acknowledgment.ToString
m_JobAckQueue.MessageReadPropertyFilter.CorrelationId = True
JournalingÜberwacht Transport der
Nachrichten zwischen einzelnen ComputernNur bei Versand zwischen Computern!
Journal-Queues:System-QueuesIndividuelle für jede QueueEine Systemweite Journal-Queue
Journaling
Szenario:Negatives Acknowledgement
überwachenBetroffene Nachricht aus der Journal-
Queue holen (ReceiveByID)System – Journal – Queue
Queue eigene Journal - Queue
theMsg.UseJournalQueue = True
theQueue.UseJournalQueue = True
Demo
Transaktion
Interne MSMQ TransaktionenDTC – Transaktionen
Distributed Transaktion CoordinatorMSMQ, SQL-Server, Oracle, SybaseRessource-Manager arbeiten mit DTC
zusammenInfos:
http://msdn.microsoft.com/library/en-us/dnbda/html/bdadotnettransact1.asp
Fazit - MSMQEinfacher Daten (Objekt) – Austausch
in der WindowsweltBridges in andere Welten
http://www.microsoft.com/msmq/interop.htm
http://www.envoytech.com/ Wann Einsetzen:
Rechnerübergreifende KommunikationAsynchrone Abarbeitung von
ProgrammenDisconected Programmierung
Fazit - QueuesPublic Queues
sind bequemernur bei solidem Active Directory
Private QueuesSchneller, weniger OverheadErmöglichen Offline – Betrieb kein Domänen- oder Active Directory
Controller vorhanden
Fazit – Formate
XML:Kleine DatenmengeBLOBs ???Gut lesbar
Binary:Weniger Overhead, effizienterNur wenn XML keinen Sinn macht
Serialisierung kann kontrolliert werden
LinksBasic 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/dn
bda/html/bdadotnetasync2.asp
MSMQ Home-Pagehttp://www.microsoft.com/msmq/overview.
htm
Fragen?
Uff...Uff...