Skip to content

CatMQ v2.9.1

Stable Released Nov 7, 2026 MIT License

Downloads

CatMQ.linux.arm64.zip
59.96 MB · 1 downloads
Download
CatMQ.linux.x64.zip
68.83 MB · 2 downloads
Download
CatMQ.windows.x64.exe
14.03 MB · 1 downloads
Download

NuGet packages: NTDLS.CatMQ.Client, NTDLS.CatMQ.Server and NTDLS.CatMQ.Shared (see all on NuGet).

Release notes

Full Changelog: https://github.com/NTDLS/CatMQ/compare/2.9.0...2.9.1

Be sure to check out the NuGet packages: 📦

https://www.nuget.org/packages/NTDLS.CatMQ.Shared
https://www.nuget.org/packages/NTDLS.CatMQ.Server
https://www.nuget.org/packages/NTDLS.CatMQ.Client

New 🎉

  • Added a per-queue backoff for failed deliveries.

Changed 😎

  • Each queue now runs its delivery loop on a dedicated, named thread (CatMQ.Delivery.<QueueName>) instead of a thread pool thread.
  • A MaxMessageAge of zero now means messages never expire, for both queues and dead-letter queues, matching the documented behavior.
  • Upgrade note: queues with a dead-letter MaxMessageAge of 00:00:00 will now keep expired messages in the dead-letter queue instead of dropping them. These queues may grow and will need to be drained or purged.

Fixed 🐛

  • Fixed thread pool starvation on servers with few cores and multiple queues, where blocked delivery loops could delay delivery replies, enqueues and the web UI.
  • Fixed expired messages being silently dropped instead of dead-lettered when the dead-letter MaxMessageAge was zero.
  • Fixed messages in a dead-letter queue with a MaxMessageAge of zero expiring as soon as they were loaded for delivery.
  • Fixed low throughput with asynchronous delivery: when all delivery slots were full, the delivery thread now wakes as soon as one frees up instead of waiting for its idle timeout.
  • Fixed delivery stalls on persistent queues when reloading an empty message buffer, which scanned every deleted message while holding the write lock. Loading now resumes from the last loaded message.
  • Fixed delivery stopping while the message buffer was under constant read activity, because removing finished messages and reloading the buffer each tried the write lock only once.
An unhandled error has occurred. Reload 🗙