Skip to content

Commit afcc474

Browse files
authored
Merge pull request #119 from blehnen/fix/dashboard-history-reads
Fix: dashboard history reads regardless of cached EnableHistory option
2 parents 5b84a1e + caa9e0f commit afcc474

17 files changed

Lines changed: 795 additions & 228 deletions

File tree

CHANGELOG.md

Lines changed: 73 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,24 @@
1-
### 0.9.32 -- 2026-04-16
1+
### 0.9.34 — 2026-04-20
2+
- Fix: dashboard history reads no longer short-circuit on `IBaseTransportOptions.EnableHistory`; fixes empty history when the dashboard container was started before its queue existed (GitHub #119)
3+
- Fix: Dashboard UI history exceptions now collapse by default with a per-row expand chevron; previously the full stack trace rendered inline and inflated row height on pages with errors
4+
- Relational (PostgreSQL / SQL Server / SQLite) read and purge handlers catch `DbException` when the history table does not exist and return empty rather than 500
5+
- Redis and Memory read/purge paths rely on native empty-on-missing behavior; same net effect
6+
- Test: `PostgreSqlHistoryEnabledTests` + `SqlServerHistoryEnabledTests` close the dashboard integration-test coverage gap (previously only Redis, Memory, LiteDb, SQLite had history-enabled coverage)
7+
- Test: `DashboardStartupTimingTests` regressions the exact startup-before-queue timing bug on SQLite
8+
- Follow-up: GitHub #120 tracks the underlying options-factory caching defect that caused this and affects other transport options
9+
10+
### 0.9.33 — 2026-04-18
11+
- Dependency refresh: 15 low-risk patch/minor bumps + 8 major-version bumps across `Directory.Packages.props` (GitHub #118)
12+
- `Microsoft.Data.SqlClient` 6.1.3 → 7.0.0
13+
- `Npgsql` 8.0.8 → 10.0.2 (2-major leap)
14+
- `Swashbuckle.AspNetCore` 7.2.0 → 10.1.7; required `Microsoft.OpenApi` 1→2 namespace migration in `DashboardExtensions` and swagger tests
15+
- `coverlet.collector` 6.0.4 → 8.0.1, `Microsoft.Testing.Extensions.Retry` 1.6.2 → 2.2.1
16+
- `Microsoft.Extensions.Configuration.Binder` / `Http` / `Caching.Memory` 9.0.3 → 10.0.6
17+
- CVE fix: `System.Security.Cryptography.Xml` overridden to 10.0.6 (NU1903)
18+
- No API surface changes outside the mandatory Swashbuckle/OpenApi namespace migration
19+
- `FluentAssertions` remains pinned at 6.12.2 (MIT); net10.0 + net8.0 multi-targeting preserved
20+
21+
### 0.9.32 — 2026-04-16
222
- Fix: Redis `PurgeMessageHistoryHandler` eliminates redundant `CompletedUtc` round-trip in orphan cleanup path; `HashGet("CompletedUtc")` now executes only when the hash exists (ISSUE-016)
323
- Fix: RelationalDatabase `WriteMessageHistoryHandler.RecordComplete` removes `StartedUtc IS NOT NULL` guard from WHERE clause so `DurationMs=0` is written for sub-millisecond completions (ISSUE-014)
424
- Test: Redis `Purge_Handles_Missing_Hash_Gracefully` asserts `CompletedUtc` is never read in orphan path via `DidNotReceive()` (ISSUE-017)
@@ -43,7 +63,7 @@
4363
- RelationalDatabase: drop `StartedUtc IS NOT NULL` guard from `RecordComplete` UPDATE; the guard made the UPDATE a no-op for sub-ms rows even though the C# computed `DurationMs = 0` correctly
4464

4565
### 0.9.16 — 2026-04-03 (Dashboard.Api, Dashboard.Ui only)
46-
- Fix: pre-load plugin assemblies into AppDomain at startup so Newtonsoft `TypeNameHandling` can resolve user POCO types during deserialization
66+
- Fix: pre-load plugin assemblies at startup; needed by Newtonsoft `TypeNameHandling` to resolve user POCO types
4767
- Diagnostic logging in `ResolveMessageBodyType` (debug per stage, warning on failure)
4868

4969
### 0.9.15 — 2026-04-03 (Dashboard.Api, Dashboard.Ui only)
@@ -52,7 +72,7 @@
5272

5373
### 0.9.14 — 2026-04-03
5474
- Dashboard UI: replace connection/queue cards with compact tables; remove nav drawer, make title clickable
55-
- Dashboard UI: self-contained mode runs UI and API in one process (for Docker)
75+
- Dashboard UI: self-contained mode UI and API in one process (for Docker)
5676
- `IConfiguration` overload for JSON-based transport registration (`DashboardConnectionConfig` POCO)
5777
- Docker image: `blehnen74/dotnetworkqueue-dashboard` on Docker Hub
5878

@@ -95,8 +115,8 @@
95115
- History for all 6 transports
96116
- `ClearHistoryMonitor` for retention purge, wired into `QueueMonitor`
97117
- Dashboard API: history endpoints (list, detail, count, purge)
98-
- Dashboard UI: History tab with status filter, pagination, expandable exceptions, purge
99-
- `MessageId` and `CorrelationId` pushed into `ILogger` scope during handler execution (always on, zero config)
118+
- Dashboard UI: History tab with status filter, pagination, inline exceptions, purge
119+
- `MessageId` and `CorrelationId` pushed into `ILogger` scope during handler execution (zero config)
100120

101121
### 0.9.8 — 2026-03-17
102122
- Fix: `InvokeMovedToErrorQueue` now increments the error counter — messages moved to the error queue were not being counted
@@ -121,7 +141,7 @@
121141
- SQLite transport: `EnableWalMode` option (default `true`) — sets WAL journal mode on new file-based queues
122142
- Metrics now prefixed with `dotnetworkqueue.` — in Prometheus, search for `dotnetworkqueue_` to find all queue metrics
123143

124-
### 0.9.4 — 2026‑03‑11
144+
### 0.9.4 — 2026-03-11
125145
- Switch from forked GuerrillaNtp DLLs to official [GuerrillaNtp 3.1.0](https://www.nuget.org/packages/GuerrillaNtp/) NuGet package
126146
- Move SNTP time provider (`SntpTime`) into the core library; any transport can now use NTP time, not just Redis
127147
- Reuse a single `NtpClient` instance per provider (per official docs)
@@ -130,7 +150,7 @@
130150
- Dashboard API: Named interceptor profiles (`AddInterceptorProfile`) — register once, reference per-queue
131151
- Dashboard API: Interceptor misconfiguration and missing message type assemblies now return specific error messages instead of 500
132152

133-
### 0.9.3 — 2026‑03‑10
153+
### 0.9.3 — 2026-03-10
134154
- Dashboard API consumer tracking — consumers register via HTTP, send heartbeats, get pruned when stale
135155
- `DotNetWorkQueue.Dashboard.Client` — standalone client library (no core dependency):
136156
- `DashboardApiClient` — typed C# wrapper for all Dashboard API endpoints
@@ -139,7 +159,7 @@
139159
- Dashboard UI: Consumer count badges on queue cards
140160
- `DashboardOptions.EnableConsumerTracking`, `ConsumerHeartbeatIntervalSeconds`, `ConsumerStaleThresholdSeconds`
141161

142-
### 0.9.1 — 2026‑03‑09
162+
### 0.9.1 — 2026-03-09
143163
- **Breaking Change** — Replace `App.Metrics` with built-in `System.Diagnostics.Metrics`; `DotNetWorkQueue.AppMetrics` package removed. Use OpenTelemetry.Metrics exporters instead.
144164
- **Breaking Change** — Remove `SamplingTypes` enum from `IMetrics.Histogram()` and `IMetrics.Timer()`
145165
- **Breaking Change** — Replace `dynamic CollectedMetrics` with typed `MetricsSnapshot GetCollectedMetrics()` on `IMetrics`
@@ -163,135 +183,135 @@
163183
- Two-click delete confirmation for single-record deletes
164184
- Edit body for messages in Error status
165185

166-
### 0.9.0 — 2026‑03‑04
186+
### 0.9.0 — 2026-03-04
167187
- Dashboard API for viewing and modifying messages in transports
168188
- Polly V7 to V8
169189

170-
### 0.8.1 — 2026‑02‑22
190+
### 0.8.1 — 2026-02-22
171191
- Fix various long-standing race conditions
172192
- Fix multiple heartbeat schedulers sharing state in the same process
173193

174-
### 0.8.0 — 2026‑01‑05
194+
### 0.8.0 — 2026-01-05
175195
- .NET 10 target
176196
- Remove out-of-support frameworks
177197
- **Breaking Change** — SQL client changed from `System.Data.SqlClient` to `Microsoft.Data.SqlClient`; may affect SQL Server connection strings
178198

179-
### 0.7.6 — 2024‑02‑02
199+
### 0.7.6 — 2024-02-02
180200
- Remove connection objects from DataStore when queue is complete
181201

182-
### 0.7.5 — 2024‑01‑09
202+
### 0.7.5 — 2024-01-09
183203
- Only verify internal container setup in debug mode, as it pins the memory it uses
184204

185-
### 0.7.4 — 2024‑01‑08
205+
### 0.7.4 — 2024-01-08
186206
- Add test for scheduler creation with memory queue
187207
- Move two logging messages from info to debug
188208
- .NET 8.0 target
189209
- Remove queue param for workgroups, as it was no longer being used
190210

191-
### 0.7.3 — 2023‑11‑28
211+
### 0.7.3 — 2023-11-28
192212
- Error notification will not happen if a rollback notification is being performed
193213

194-
### 0.7.2 — 2023‑11‑28
214+
### 0.7.2 — 2023-11-28
195215
- Add notification of queue events to ConsumerQueues
196216

197-
### 0.7.1 — 2023‑11‑21
217+
### 0.7.1 — 2023-11-21
198218
- Add property to obtain creation script from `IQueueCreation`. Supported by SQL Server, SQLite, and PostgreSQL.
199219

200-
### 0.7.0 — 2023‑10‑26
220+
### 0.7.0 — 2023-10-26
201221
- Fix retry logic for SQLite commands; changes in `System.Data.Sqlite` required changes in transport
202222
- Switch to `DecorrelatedJitterBackoffV2` for SQL Server, PostgreSQL, and SQLite retries
203223

204-
### 0.6.9 — 2023‑10‑25
224+
### 0.6.9 — 2023-10-25
205225
- Update various packages to latest versions
206226
- Replace `OpenTelemetry.Exporter.Jaeger` with `OpenTelemetry.Exporter.OpenTelemetryProtocol`
207227
- Remove .NET 5.0 as a supported version
208228

209-
### 0.6.8 — 2022‑07‑19
229+
### 0.6.8 — 2022-07-19
210230
- Update Npgsql
211231
- Add initial admin interface
212232

213-
### 0.6.7 — 2022‑06‑30
233+
### 0.6.7 — 2022-06-30
214234
- Update various packages to latest versions
215235

216-
### 0.6.6 — 2022‑04‑29
236+
### 0.6.6 — 2022-04-29
217237
- Fix issue with custom default constraints in SQL Server transport
218238

219-
### 0.6.5 — 2022‑02‑06
239+
### 0.6.5 — 2022-02-06
220240
- Relational database transports now allow additional columns to be used as part of the dequeue
221241

222-
### 0.6.4 — 2022‑01‑12
242+
### 0.6.4 — 2022-01-12
223243
- `ILogger` will now be created using the queue name for the category
224244

225-
### 0.6.3 — 2022‑01‑11
245+
### 0.6.3 — 2022-01-11
226246
- Remove Polly Bulkhead; does not correctly work with our task-limited scheduler
227247
- Remove `MaxQueue` feature from async processing, as it depended on Polly Bulkheads
228248
- Switch to `ILogger` from `Microsoft.Extensions.Logging.Abstractions`
229249

230-
### 0.6.2 — 2021‑12‑19
250+
### 0.6.2 — 2021-12-19
231251
- .NET 6.0 target
232252

233-
### 0.6.1 — 2021‑09‑28
253+
### 0.6.1 — 2021-09-28
234254
- Producer will throw an exception on a non-public class used as a message due to internal delegate handling limitations
235255

236-
### 0.6.0 — 2021‑09‑07
256+
### 0.6.0 — 2021-09-07
237257
- Switch from https://opentracing.io/ to https://opentelemetry.io/
238258
**Breaking Change** — OpenTracing always added an entry to headers; OpenTelemetry only adds entries if enabled. Queues must be empty before updating.
239259

240-
### 0.5.4 — 2021‑05‑19
260+
### 0.5.4 — 2021-05-19
241261
- Fix error with adding items to a memory queue that has started shutdown
242262
- Asking for list of error messages should not throw if transport fails; added flag to indicate if errors are loaded
243263

244-
### 0.5.3 — 2021‑05‑18
264+
### 0.5.3 — 2021-05-18
245265
- Fix performance issue with in-memory queues
246266

247-
### 0.5.2 — 2021‑04‑18
267+
### 0.5.2 — 2021-04-18
248268
- LiteDB transport now supports direct and memory connections; all connections must be made in the same process
249269

250-
### 0.5.1 — 2021‑04‑00
270+
### 0.5.1 — 2021-04-00
251271
- LiteDB transport
252272
- .NET 5 target; many references do not yet support 5.0
253273

254-
### 0.5.0 — 2020‑12‑08
274+
### 0.5.0 — 2020-12-08
255275
- Change how connections are set up; **breaking change** to support generic connection settings not expressible in connection strings
256276
- .NET 4.8 target
257277
- .NET Standard 2.0 target for SQLite transport; Microsoft SQLite transport deprecated
258278
- SQL Server transport now supports creating queues in schemas other than `dbo`
259279

260-
### 0.4.6 — 2020‑09‑02
280+
### 0.4.6 — 2020-09-02
261281
- Redis transport: re-cache LUA scripts when no longer in cache; fixes issue with server restarts
262282

263-
### 0.4.5 — 2020‑02‑28
283+
### 0.4.5 — 2020-02-28
264284
- Make previous error types and count available to message processing
265285
- Consumer queues now remove errors by default after 30 days; configurable
266286

267-
### 0.4.4 — 2019‑12‑23
287+
### 0.4.4 — 2019-12-23
268288
- Fix issue with SQL Server transport and heartbeat reset
269289

270-
### 0.4.3 — 2019‑10‑29
290+
### 0.4.3 — 2019-10-29
271291
- Fix issue with registration of message rollback
272292

273-
### 0.4.2 — 2019‑10‑29
293+
### 0.4.2 — 2019-10-29
274294
- .NET 4.6.1 target
275295
- Upgrade packages to latest versions
276296

277-
### 0.4.1 — 2019‑06‑08
297+
### 0.4.1 — 2019-06-08
278298
- Fix issue with retry policies using seconds instead of milliseconds
279299

280-
### 0.4.0 — 2019‑06‑02
300+
### 0.4.0 — 2019-06-02
281301
- Remove RPC
282302
- Implement OpenTracing https://opentracing.io/
283303
- Fix message interception
284304

285-
### 0.3.1 — 2019‑04‑26
305+
### 0.3.1 — 2019-04-26
286306
- Correct versioning for NuGet publish
287307

288-
### 0.3.0 — 2019‑04‑26
308+
### 0.3.0 — 2019-04-26
289309
- All modules now target .NET 4.7.2 and .NET Standard 2.0
290310
- **Breaking Change** — changes to metrics interface to switch to AppMetrics
291311
- Deprecated Metrics.NET
292312
- `DotNetWorkQueue.AppMetrics` replaces `DotNetWorkQueue.Metrics.Net`
293313

294-
### 0.2.1 — 2017‑09‑30
314+
### 0.2.1 — 2017-09-30
295315
- Refactoring to better share logic between transports
296316
- **Breaking Change** — fixed various spelling mistakes affecting public signatures
297317
- **Breaking Change** — fixed typo with internal Redis property; queues should be drained before upgrading
@@ -300,44 +320,44 @@
300320
- **Breaking Change** — heartbeat configuration now uses Schyntax format instead of timespan
301321
- New SQLite transport using Microsoft driver
302322

303-
### 0.1.10 — 2017‑03‑19
323+
### 0.1.10 — 2017-03-19
304324
- Route support for SQL Server, SQLite, Redis, and PostgreSQL transports
305325

306-
### 0.1.9 — 2016‑10‑08
326+
### 0.1.9 — 2016-10-08
307327
- Fix issue with deleting messages with errors for SQL Server, SQLite, PostgreSQL transports
308328

309-
### 0.1.8 — 2016‑09‑24
329+
### 0.1.8 — 2016-09-24
310330
- Refactor default task scheduler to allow easier extension
311331

312-
### 0.1.7 — 2016‑08‑16
332+
### 0.1.7 — 2016-08-16
313333
- Fix issue with PostgreSQL transport returning wrong message body
314334
- Update to msgpack.cli 8.0 for Redis transport
315335

316-
### 0.1.6 — 2016‑08‑12
336+
### 0.1.6 — 2016-08-12
317337
- PostgreSQL transport
318338

319-
### 0.1.5 — 2016‑08‑04
339+
### 0.1.5 — 2016-08-04
320340
- Recurring job scheduler
321341
- Metrics for LINQ serialization, compiling, and execution
322342

323-
### 0.1.4 — 2016‑06‑22
343+
### 0.1.4 — 2016-06-22
324344
- Minor refactor to poison message handling
325345
- Redis-on-Windows integration tests
326346
- Refactor `IConnectionInformation` to be immutable
327347
- Send LINQ expressions as queue items
328348
- Fix scope issue with scheduler and multiple consumer queues
329349

330-
### 0.1.3 — 2016‑02‑18
350+
### 0.1.3 — 2016-02-18
331351
- Fix formatting issue with poison message exception
332352
- Fix formatting issue with user/system exception
333353
- Don't run monitor delegates if queue is shutting down
334354
- SQLite transport
335355

336-
### 0.1.2 — 2015‑11‑22
356+
### 0.1.2 — 2015-11-22
337357
- Fix issue with removing SQL Server queues
338358
- Fix issue with message expiration module running even if transport doesn't support expiration
339359

340-
### 0.1.0 — 2015‑11‑03
360+
### 0.1.0 — 2015-11-03
341361
- Initial release to GitHub
342362

343363

CLAUDE.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
66

77
DotNetWorkQueue is a producer/distributed consumer library for .NET. It supports queueing POCOs, compiled LINQ expressions, and re-occurring job scheduling. Targets .NET 10.0 and .NET 8.0.
88

9+
## Project Instructions
10+
Always use Context7 MCP when I need library/API documentation or setup steps. Automatically resolve library IDs and retrieve docs without being asked.
11+
912
## Build Commands
1013

1114
```bash

Source/Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project>
22
<PropertyGroup>
33
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
4-
<Version>0.9.33</Version>
4+
<Version>0.9.34</Version>
55
<Deterministic>true</Deterministic>
66
<ContinuousIntegrationBuild Condition="'$(CI)' == 'true'">true</ContinuousIntegrationBuild>
77
<DebugType>portable</DebugType>

0 commit comments

Comments
 (0)