2017-10-14 1 views
0

Ich habe eine MSMQ-Warteschlange, die von fünf Windows-Diensten gehört wird. Ich habe zu diesem Zweck das BeginPeek- und das PeekCompleted-Ereignis verwendet. Mein Problem ist unter fünf Diensten, nur ein Dienst ist der richtige Empfänger der Nachricht. Alle vier lesen nur die Nachricht, aber es wird keine Aktion ausgeführt. Dies kann nur identifiziert werden, wenn wir die MQ-Nachricht lesen. Jetzt habe ich einen Code in meinen Diensten hinzugefügt, um zu überprüfen, ob die Kriterien übereinstimmen und die Nachricht vom richtigen Dienst verarbeitet wird. Dann verwende ich Receive, um die Nachricht aus MSMQ zu entfernen. Ist das eine gute Idee?Gleiche Nachricht an mehrere Dienste

Zweitens, wenn die Nachricht nicht Bedingung erfüllt und alle fünf Dienste haben es nur geschaut, aber nicht erhalten, die Nachricht liegt immer noch in der Warteschlange. Ich verstehe. Aber dieselbe Nachricht wird unendlich oft verarbeitet, da die Nachricht nie entfernt wurde.

private void queue_PeekCompleted(object sender, PeekCompletedEventArgs e) 
{ 
MessageQueue queue = (MessageQueue)sender; 
//Message msg = queue.EndPeek(e.AsyncResult); 
Message msg = e.Message; 
//Read message and check if the criteria matches 
if(CriteriaMatches) 
{ 
    queue.ReceiveById(e.Message.Id); 
} 


queue.EndPeek(e.AsyncResult); 
queue.BeginPeek(); 
} 

Schätzen Sie Ihre Hilfe. Danke, Fayaz

Antwort

0

Legen Sie fest, dass die Nachrichten nach einem festgelegten (kurzen) Zeitraum ablaufen. Sie werden dann in die Warteschlange für unzustellbare Nachrichten verschoben, wo Sie einen anderen Dienst erwarten können, der auf die Ankunft wartet. Dieser Dienst könnte dann beispielsweise eine Benachrichtigung auslösen, sobald eine Nachricht eintrifft.

+0

Aber dies wird alle Nachrichten in der Warteschlange blockieren. – Fayaz

+0

Wie? Die Nachricht befindet sich nicht mehr in Ihrer Hauptwarteschlange. –

Verwandte Themen