Repository navigation
3.0: sender/receiver split, per-client builder, hosted processor - #42
Merged
Merged
Conversation
… processor Public API spelled out for review before implementation. Tracks #39. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…mended, not required Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…enew/complete race, lease holding, dead-letter replay) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Implements the design in docs/v3-design.md (issue #39) and folds in the pre-release review fixes: - "Never expire" sends: Timeout.InfiniteTimeSpan is mapped to the -1 second the service expects, instead of failing every send with a 400. - Shutdown: when the host's deadline cancels StopAsync, the processor cancels handlers and returns instead of throwing; tokens are captured up front so a late worker never reads a disposed source. - ValidateOnStart registers its validator with TryAddEnumerable, so an app's own validator for QueueClientSettings no longer switches it off. - An empty PoisonQueueName falls back to "<queue>-poison". - Processor VisibilityTimeout must be whole seconds, so renewal at half the timeout stays inside the lease the service actually grants. - A handler that settles and then throws keeps its settlement and is no longer logged as a failure to be redelivered; a message left unsettled with AutoComplete off is no longer logged as removed. - The poison queue is created once rather than on every dead-letter, and recreated if it is deleted. - Public surface trimmed: LoggerMessageExtensions is internal; TagListExtensions, the queue_depth metric and an unused event name are removed; duplicate InternalsVisibleTo dropped. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts: # README.md
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
jasonshave
marked this pull request as ready for review
October 16, 2026 18:47
jasonshave
enabled auto-merge (squash)
October 16, 2026 18:48
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Implements the 3.0 design (issue #39,
docs/v3-design.md). Breaking release; requires .NET 10. Existing .NET 8 customers stay on the2.xline.What changes for users
IQueueSender,IQueueReceiverorIStorageQueue; named clients use[FromKeyedServices("name")].AddClient(...).AddProcessor<TMessage, THandler>()runs the polling loop for you: backoff, lease renewal while the handler runs, retries with a delay, a poison queue, cancellation and graceful shutdown.QueueMessage<T>hasCompleteAsync,AbandonAsync,RenewLockAsyncandDeadLetterAsync. A body that can't be read comes back withErrorset instead of failing the whole receive.ValidateOnStart()fails startup for a misconfigured client.Fixes from the pre-release reviews
Timeout.InfiniteTimeSpan("never expire") failed with a 400. They now work.ValidateOnStart()is no longer silently switched off when the app registers its own settings validator.PoisonQueueNamein config falls back to<queue>-poison.VisibilityTimeoutmust be whole seconds, so lease renewal can't arrive after the lease has lapsed.LoggerMessageExtensionsis internal; unusedTagListExtensionsand thequeue_depthmetric are removed.Verification
After merge: tag
v3.0.0to publish to nuget.org asAzureStorage.QueueService.🤖 Generated with Claude Code