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

Post on 05-Apr-2015

113 views 2 download

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

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