2016-05-25 22 views
1

Ich versuche, bestimmte Nachrichten aus einer MSMQ-Nachrichtenwarteschlange mithilfe von PowerShell zu löschen. Ich bin mir bewusst, dass mehrere neue Cmdlets für die Verwaltung von MSMQ-Warteschlangen & Nachrichten in PowerShell 4+ eingeführt wurden, aber von dem, was ich sagen kann, helfen mir diese immer noch nicht mein Ziel des Löschens bestimmter Nachrichten zu erreichen.So verwenden Sie PowerShell, um bestimmte Nachrichten aus einer MSMQ-Nachrichtenwarteschlange zu löschen

Was ich versuche, ist ein einfaches Skript, das eine Verbindung zu einer bestimmten Warteschlange herstellt, dann jede Nachricht in dieser Warteschlange durchläuft, nach einer angegebenen Suchzeichenfolge im Nachrichtentext sucht und dann alle übereinstimmenden Nachrichten zu einer anderen Warteschlange auf demselben Server. Ich habe dies sehr gut funktioniert Nachrichten für die Suche, und jede passende Kopie kann mit der Send-Methode verwenden:

$source = new-object System.Messaging.MessageQueue($sourcequeuename) 
$destination = new-object System.Messaging.MessageQueue($destinationqueuename) 
$msgs = $source.GetAllMessages() 
foreach ($msg in $msgs) 
{ 
    #Extra logic here - check message body for search string etc... 
    $destination.Send($msg) 
} 

Aber - einmal kopiert, meine einzige Option, um die ursprüngliche Nachricht von der Quelle Warteschlange zu löschen scheint das Spülen zu werden gesamte Quellwarteschlange, die auch alle anderen Nachrichten löschen wird, was ich nicht tun möchte!

$source.Purge() 

Ich dachte, ich wäre auf etwas mit dem neuen (Powershell 4+) 'Move-MSMQMessage' Cmdlets ...

Move-MsmqMessage -DestinationQueue $d -InputObject $q -Message $msg 

Aber ich bin zu kämpfen, dies zu an der Arbeit - ich m unklar, ob ich es bestimmte Nachrichtenobjekte übergeben kann. Kann mir jemand ein praktisches Beispiel für die Verwendung von PowerShell (einer beliebigen Version) geben, um Nachrichten in einer Warteschlange durchzulaufen und bestimmte Nachrichten mit diesem Cmdlet Move-MsmqMessage zu verschieben?

+0

Sie keine Nachrichten außerhalb der Warteschlange verschieben können. Sie können nur eine neue Nachricht erstellen, die den Inhalt des Originals verwendet, um sie an eine andere Warteschlange zu senden und dann das Original zu löschen. Mag pedantisch klingen, aber MSMQ hat das Konzept, dass die Zielwarteschlange die letzte Ruhestätte für eine Nachricht ist. Es gibt einen zugrunde liegenden Mechanismus von Acks und Timeouts, um die Zustellung an eine Warteschlange zu bestätigen. Wenn Sie eine Nachricht verschieben könnten, müsste dieser Mechanismus diese Aktivität (über mehrere Computer hinweg!) Verfolgen und den ursprünglichen Absender jedes Mal informieren. –

+0

Move-MsmqMessage wirkt sich nur auf Nachrichten in derselben Warteschlange aus, wenn Unterwarteschlangen verwendet werden. Eine Warteschlange kann in viele Unterwarteschlangen unterteilt werden, aber alle Nachrichten befinden sich noch immer in derselben Warteschlange. –

+0

Danke John, das macht die Dinge viel klarer für mich – verticallyg

Antwort

2

Nicht getestet, aber Sie sollten die Nachricht mit der ReceiveById Funktion löschen können,:

foreach ($msg in $msgs) 
{ 
    #Extra logic here - check message body for search string etc... 
    $source.ReceiveById($msg.Id, [timespan]::FromMinutes(1)) 
} 
+0

Das hat funktioniert! Indem ich dann $ destinationqueue.Send ($ msg) anrufe, erhalte ich die effektive Bewegung, nach der ich gesucht habe. Ursprüngliche Nachricht, die aus der Quellenwarteschlange entfernt wurde, eine Kopie wird in der Zielwarteschlange angezeigt. Ich habe versucht, die .Send vor der ReceivebyId-Funktion zu starten, aber das Skript blieb hängen und meldete dann eine Zeitüberschreitung. Ich kann nicht ganz verstehen, wie ich eine Nachricht kopieren kann, nachdem ich die Quelle bereits erhalten/entfernt habe, aber ich denke, weil ich in meinem vollständigen Skript alle Nachrichten in $ msgs = $ q.GetAllMessages() lade, so das Kopieren verwendet, was in der Variablen NICHT die eigentliche Quellnachricht ist? – verticallyg

+0

Ja, es wird wahrscheinlich die Nachricht in der Variablen verwenden. Aber ich habe keine Ahnung, warum du eine Auszeit hast, wenn du es anders machst. –