2016-03-07 8 views
5

Ich habe ein Problem bei der Kennzeichnung meiner BrokeredMessage als Complete.BrokeredMessage entsorgt

Einfache Code, der wie funktioniert erwartet:

private void OnMessageArrived(BrokeredMessage message) 
{ 
    var myObj= message.GetBody<MyObject>(); 

    //do things with myObj 

    message.Complete();    
} 

Wenn ich versuche, für Benutzer zu warten mit myObj zu beenden ich Ausnahme:

brokeredmessage wurde angeordnet

Code unten:

private Dictionary<long, BrokeredMessage> ReceivedMessages;  
ReceivedMessages = new Dictionary<long, BrokeredMessage>(); 

private void OnMessageArrived(BrokeredMessage message) 
{ 
    var myObj= message.GetBody<MyObject>(); 
    ReceivedMessages.Add(myObj.Id, message); 

    //do things with myObj  
} 

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    // get myObj on which user clicked 

    ReceivedMessages[myObj.Id].Complete(); 
    ReceivedMessages.Remove(myObj.Id);   
} 

Für mich sieht es aus wie ServiceBus irgendwie Verbindung zum eigentlichen Objekt in C# Objekt

Etwas ähnliches wie freistehendes Objekt in EF, nur in diesem Fall verlieren wird losgelöst von ServiceBus

EDIT:

Es ist mir wichtig, Nachricht als abgeschlossen nur nach Benutzer klicken Sie auf Schaltfläche. Wenn AC runter geht (oder ähnliche Dinge) Ich möchte Nachrichten bleiben auf Service Bus Thema, so dass das nächste Mal Benutzer starten App wird er wieder Nachrichten erhalten, die er nicht verarbeitet hat.

Antwort

2

Sie sollten die brokeredMessage nicht selbst speichern. Wenn Sie das Das Gesamt() -Methode aufrufen, ist es das, was according to the documentation passiert:

schließt die Empfangsoperation einer Nachricht und zeigt an, dass die Nachricht als bearbeitet markiert werden soll und gelöscht

Was sollten Sie stattdessen tun ist zu speichern MyObject Art von Objekten in Ihrem Wörterbuch als vermittelte Nachrichten werden bei Fertigstellung zerstört werden.

private Dictionary<long, MyObject> ReceivedMessages;  
ReceivedMessages = new Dictionary<long, MyObject>(); 

Und in dem betreffenden Stück Code:

var myObj= message.GetBody<MyObject>(); 
ReceivedMessages.Add(myObj.Id, myObj); 
+0

Können Sie eine Lösung für diesen Problemfall dann empfehlen: 1. Nachricht empfangen, ihre Daten in Stücke gebrochen und an asynchrone Verarbeitung gesendet. Wir möchten die Nachricht sperren, bis ihre Daten von dem Benutzer verarbeitet wurden, der sie erworben hat. 2. Wenn eine Ausnahme auftritt oder der Benutzer das Programm beendet, entsperren Sie die Nachricht, damit ein anderer Benutzer sie später bearbeiten kann. 3. Wenn/wenn das letzte Datenelement verarbeitet wird, entfernen Sie die Nachricht vom ServiceBus Daten wurden ordnungsgemäß verarbeitet. – ErroneousFatality

+0

Ja. Sie deaktivieren Complete() für die Nachricht, bis Sie fertig sind. –

+0

Entschuldigung, wenn ich falsch liege, aber genau das macht OP. Er speichert die Nachricht in einem Wörterbuch, damit er nach Abschluss der asynchronen Verarbeitung Complete aufrufen kann. Sie haben empfohlen, dies nicht zu tun und nur die Daten zu speichern, die er verarbeitet. Wie würde er dann nach dem Async-Prozess die Nachricht "Complete" aufrufen? – ErroneousFatality

0

einen Blick auf ServiceBus LockToken nehmen.

können Sie komplette nennen (lockToken)

+0

Noch dieselbe Ausnahme _brokeredmessage wurde entsorgt_ – topolm

2

Dies ist sehr implizite und nicht auch weit in der Dokumentation angegeben, wie ich weiß, aber wenn Sie zu einem SB Topic/Abonnement abonnieren, können Sie nur das BrokeredMessage Objekt zugreifen Innerhalb des Ausführungsumfangs des OnMessage Callback-Delegaten, den Sie an SubscriptionClient.OnMessage liefern.

Sobald der Callback zurückkehrt, ist der BrokeredMessage entsorgt.

Wenn Sie die Nachricht zwischenspeichern möchten, und markieren Sie ihn als komplette/aufgegeben/deadletter, sollten Sie die BrokeredMessage.LockToken zwischenzuspeichern, zusammen mit allen anderen Eigenschaft, die Sie wie dem Nachrichtentext benötigen, und verwenden Sie die

  • SubscriptionClient.Complete
  • SubscriptionClient.Abandon
  • SubscriptionClient.Deadletter

die eineerhaltenals Parameter, wenn Sie sie als vollständig markieren möchten.

Verwandte Themen