Fix duplicate envelope exception when rescheduling messages in database-backed scenarios #3
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.
Problem
When using
messageBus.ScheduleAsync(msg, delay)or callingReScheduleAsync()within a message handler that uses database-backed scheduling (DurableInbox), Wolverine would throw duplicate key exceptions. This occurred because the rescheduling logic was attempting to insert a new envelope entry rather than updating the existing one.The issue was that
ReScheduleAsync()was callingScheduleJobAsync()which creates new envelope entries, instead ofScheduleExecutionAsync()which updates existing envelopes.Solution
This PR fixes the core issue and improves the developer experience:
Core Fix
MessageContext.ReScheduleAsync()to useScheduleExecutionAsync()instead ofScheduleJobAsync()for non-native scheduling scenariosScheduleExecutionAsync()updates the existing envelope's execution time rather than creating a duplicate entryDeveloper Experience Improvements
Added convenient extension methods on
IMessageContextfor easier discoverability:Changes Made
MessageContext.ReScheduleAsync()now callsScheduleExecutionAsync()for database-backed scenariosIMessageContextfor reschedulingTesting
All rescheduling tests pass, including:
DateTimeOffsetandTimeSpanoverloadsThe fix resolves the duplicate envelope issue while maintaining full backward compatibility and improving the developer experience.
💬 Share your feedback on Copilot coding agent for the chance to win a $200 gift card! Click here to start the survey.