2016-04-06 9 views
0

Ich benutze Windows Azur Service Bus für Messaging. Wir haben eine Web-API erstellt, um die Nachrichten vom Servicebus zu holen. Die mobile App verwendet diese Web-API zum Abrufen von Nachrichten. Wir verwenden den PeekLock-Modus im Abonnement-Client und die Lockduration beträgt 5 Minuten.LockToken läuft vor LockUntilUtc Zeit in azurem Service-Bus

Auf Client-Seite, wenn Nachrichten mehr als 5 Minuten dauern dann zu verarbeiten Nachricht entsperrt. Also bevor wir es entsperren wollen wir das Lock erneuern. Also haben wir eine andere Web-API erstellt, um das Schloss zu erneuern. In der Web-API übergeben wir den LockToken. Wenn wir jedoch subscriptionClient.RenewMessageLockAsync (new Guid (lockToken)) verwenden, gibt es den Fehler "Die angegebene Sperre ist ungültig. Entweder ist die Sperre abgelaufen oder die Nachricht wurde bereits vor Ablauf der Sperrzeit aus der Warteschlange entfernt". Wir führen die Erneuerungssperre vor 1,5 Minuten der Nachricht LockUntilUtc-Zeit ein.

Meine Frage ist, können wir die Nachricht Sperre erneuern, bevor es ExpiryTime? Und wenn ja, warum azurblauen Service Bus werfen Sperre abgelaufen Fehler? Bitte hilf mir, diese Dinge zu verstehen.

Antwort

0

Sie können die Sperre manuell erweitern, aber Sie müssen sicherstellen, dass es passiert, bevor der Server es entriegelt wird.

Eine weitere Option, die ich persönlich mehr bevorzugen, ist OnMessage API zu verwenden. Sie können OnMessageOptions.AutoRenewTimeout angeben. Dies ist eine Verlängerungszeit für den Fall, dass Ihr Rückruf, der die Nachricht verarbeitet, nicht ausgeführt wird. OnMessage API stellt auch sicher, dass die Erweiterung aufgerufen wird, wenn Sie die Sperrdauer überschreiten möchten. Auf diese Weise brauchen Sie auch keine andere Web-API, die etwas abgeht.

Werfen Sie einen Blick auf die recent post ich auf dieser API geschrieben.

+0

Hallo Sean, Danke für die Antwort. Ich kann die Methode subscriptionClient.OneMessage nicht verwenden, da sie ereignisgesteuert ist. Deshalb verwende ich receive Methode, damit ich nicht die ganze Nachricht in einer while Schleife erhalten und zurück zum Benutzer senden kann. –

+0

Die Sperre aus dem Code manuell zu erneuern, der die eingehende Nachricht verarbeitet, sollte funktionieren. Neugierig, warum machst du es von einem anderen Prozess und nicht derselbe, der die Nachricht behandelt? –

+0

Hallo Sean, ich kann dies nicht tun, da die Nachrichten von iPad-Anwendung verbrauchen und es gibt keine direkte API für objektive C oder Swift. Deshalb habe ich Rest Web-API erstellt, anstatt azurblauen Service Bus Rest api zu verwenden. –