私の紺碧の機能では、ある時点でメッセージを延期したいと思います。しかし、そうすると、例外が発生します。
[7/30/2020 5:59:02 PM] Message processing error (Action=Complete, ClientId=MessageReceiver1UserCreated/Subscriptions/MySubscription, EntityPath=UserCreated/Subscriptions/MySubscription, Endpoint=xxxxxxxxxxx.servicebus.windows.net)
[7/30/2020 5:59:02 PM] Microsoft.Azure.ServiceBus: The lock supplied is invalid. Either the lock expired, or the message has already been removed from the queue, or was received by a different receiver instance.
これは私のコードです
[FunctionName("UserCreated")]
public static async Task Run([ServiceBusTrigger("UserCreated", "MySubscription", Connection = "ServiceBusConnectionString")]UserCreated userCreated, ILogger log, string lockToken, MessageReceiver messageReceiver)
{
//some logic.....
await messageReceiver.DeferAsync(lockToken);
}
正直なところ、私は自分が間違っていることの手がかりがありません。コード例IDが見つかり、このStackOverflow:Azure Function V2 Service Busメッセージの延期の投稿も役に立ちません。
関数が完了すると、メッセージが自動的に完了することを理解しています。そのため、オートコンプリートを無効にしようとしましたが、そこでも有効な解決策を見つけることができませんでした。
パッケージの使用:
すべての回答に感謝しますが、実際に本当の原因を説明したものはありません。
メッセージを自分で完了、延期、破棄、または削除する場合は、ファイルのオートコンプリートを無効にする必要がありhost.json
ます。
ロックが無効である理由は次のとおりです。
指定されたロックは無効です。ロックの有効期限が切れているか、メッセージがすでにキューから削除されているか、別のレシーバーインスタンスによって受信されました。
私の場合、メッセージは使用してからすでに「削除」されています messageReceiver.DeferAsync(lockToken);
つまり、このステートメントの後、関数はメッセージを自動的に完了します(これはすでに延期されています)。
したがって、メッセージのオートコンプリートを無効にする必要があります。
でオートコンプリートを無効にする host.json
"extensions": {
"serviceBus": {
"messageHandlerOptions": {
"autoComplete": false
}
}
}
オートコンプリートを無効にするときは、メッセージを処理する責任があります。常に決定を下す必要があります。そうしないと、ロックのタイムアウト後にメッセージが再び使用可能になります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加