Skip to content

Wolverine 6.57.0

Choose a tag to compare

@jeremydmiller jeremydmiller released this 29 Oct 00:40
a452564

New

  • GH-5244 (#5272): NServiceBus interop now supports XML. Many NServiceBus systems still use the NServiceBus XmlSerializer, and they no longer have to switch to JSON before a migration to Wolverine can start. Every NServiceBus interop endpoint (Rabbit MQ, Azure Service Bus, Amazon SQS and SNS, and the SQL Server and PostgreSQL NServiceBus transports) now reads both JSON and XML, choosing per message from the NServiceBus.ContentType header. To send XML, use the new NServiceBusXmlSerializer: .UseNServiceBusInterop().DefaultSerializer(new NServiceBusXmlSerializer()). Because one endpoint reads both formats, NServiceBus endpoints can also move from XML to JSON gradually. See XML Serialization with NServiceBus.
  • #5268 (thanks @lahma) and #5273: A durable listener now gives a message from a non-Wolverine producer, which has no Wolverine id, a stable envelope id derived from the broker's own identity for that message. A redelivery is then deduplicated by the durable inbox instead of being handled twice. This covers Kafka (topic, partition and offset), NATS JetStream, Pulsar, Redis Streams, Amazon SQS and GCP Pub/Sub pull subscriptions. On SQS and Pub/Sub it applies in every endpoint mode. #5273 also makes raw JSON work on durable SQS listeners. A duplicate the durable inbox refuses is now logged at Information instead of as an error.
  • GH-5260 (#5261): New opt-in WolverineHttpOptions.RejectUnparseableHeaderValues answers 400 with ProblemDetails when a [FromHeader] value can't be parsed.

Fixes

  • GH-5244 (#5272): NServiceBus replies to Wolverine over Rabbit MQ now go to the queue marked UseForReplies(). Wolverine used to give NServiceBus its own wolverine.response.{guid} system queue as the reply address, which NServiceBus can't reach, so every reply ended up in NServiceBus's error queue.
  • GH-5247 (#5248): DurabilityAgent.StopAsync() now cancels its in-flight durability command and waits for it to finish. Before, a command still running at shutdown could outlive the host and fail against a disposed data source.
  • GH-5253 (#5256, thanks @thomhurst): A leadership lock acquisition cancelled by node shutdown is no longer logged as an error.
  • GH-5254 (#5265): Shutdown now waits for handlers still running on a buffered local queue.
  • GH-5257 (#5266): Stopping a listener now interrupts an inline retry cooldown instead of waiting it out, and the retry doesn't run after the stop.
  • GH-5262 (#5263): Lightweight EF Core handlers now collect domain events before their save, so the events are published atomically with it.
  • #5245 (thanks @ahyousif): Managed EF Core tenancy combined with WithDbContextAbstraction now reuses the tenant DbContext, so repository writes, the save and outbox enrollment all use one context. This could previously fail code generation.
  • #5250 (thanks @johnkaram02): A request that repeats a [FromHeader] header binds the comma-joined values instead of answering 500.
  • #5252 (thanks @johnkaram02) and #5259: Additional error actions such as AndPauseProcessing() chained after ScheduleRetryIndefinitely() / RequeueIndefinitely() now apply, including to the open-ended attempts after the listed delays.

Dependencies

  • JasperFx 2.96.1 and JasperFx.RuntimeCompiler 5.0.1 (#5258)
  • Weasel 9.47.1 (#5269)

Docs and build

  • The Best Practices guide is rewritten (#5270).
  • New docs for stable envelope ids from non-Wolverine producers, and for deduplicating CloudEvents (#5273).
  • ./build.sh LocalGate runs every CI suite on one machine (GH-5125, #5246). The CI suites are rebalanced to stay under the 20 minute job limit (#5267), and the scaffold tests now pass on Windows (GH-5255, #5264).