Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
0b44578
test(06-01): add failing tests for PartitionKey and InvalidPartitionK…
mnbuhl May 4, 2026
01bc899
feat(06-01): add PartitionKey value object and InvalidPartitionKeyExc…
mnbuhl May 4, 2026
2a6f865
chore: merge executor worktree (worktree-agent-ab78c89eba6732628)
mnbuhl May 4, 2026
8df9ea1
feat(06-02): add PartitionKey to EnqueueOptions and RecurringOptions
mnbuhl May 4, 2026
ed38a9a
feat(06-02): add PartitionKey, SequenceNumber, IsPartitionBlocked to …
mnbuhl May 4, 2026
de3dd05
feat(06-02): add PartitionKey to AtomizerSchedule
mnbuhl May 4, 2026
886ef4c
chore: merge executor worktree (worktree-agent-afd10f277ecbf9d7e)
mnbuhl May 4, 2026
1cfe505
feat(06-03): wire PartitionKey through AtomizerClient
mnbuhl May 4, 2026
6d848db
test(06-03): add PartitionKey and IsPartitionBlocked unit tests
mnbuhl May 4, 2026
796f391
chore: merge executor worktree (worktree-agent-a040dc756d0cf794a)
mnbuhl May 4, 2026
c33d0ec
fix(06): release partition on job cancellation in JobProcessor
mnbuhl May 4, 2026
e311778
fix(06): seal InvalidPartitionKeyException and AtomizerClient
mnbuhl May 4, 2026
86b4d9c
fix(06): guard MarkAsCompleted/MarkAsFailed against invalid status
mnbuhl May 4, 2026
bc18b0a
fix(06): remove null-forgiving operator on PayloadType.FullName
mnbuhl May 4, 2026
2e4d204
fix(06): make string-to-PartitionKey conversion explicit
mnbuhl May 4, 2026
a41f7f0
chore(07-01): add xunit.v3, AwesomeAssertions, NSubstitute to test ut…
mnbuhl May 4, 2026
dfd0666
docs(07-01): add FIFO contract remarks to IAtomizerStorage InsertAsyn…
mnbuhl May 4, 2026
4eea499
feat(07-02): add AtomizerStorageContractTests abstract base class
mnbuhl May 4, 2026
b2858d2
fix(07): WR-02 fix copy-paste error in UpdateSchedulesAsync XML doc
mnbuhl May 4, 2026
7a91391
fix(07): CR-01 CR-02 WR-01 WR-03 WR-04 fix contract test base correct…
mnbuhl May 4, 2026
0846a12
test(08-01): add failing InsertAsync FIFO sequence and idempotency tests
mnbuhl May 4, 2026
1d7588a
feat(08-01): implement FIFO InsertAsync with idempotency fix and sequ…
mnbuhl May 4, 2026
2abf01d
test(08-01): add failing GetDueJobsAsync FIFO partition blocking tests
mnbuhl May 4, 2026
aa161ea
feat(08-01): implement FIFO GetDueJobsAsync with partition blocking f…
mnbuhl May 4, 2026
691d71a
feat(08-01): wire ScheduleProcessor to forward PartitionKey into Atom…
mnbuhl May 4, 2026
23f0710
docs(08-01): complete FIFO InMemoryStorage implementation plan summary
mnbuhl May 4, 2026
b2ee2d2
feat(08-02): add InMemoryStorageContractTests concrete subclass
mnbuhl May 4, 2026
21021eb
chore: merge executor worktree (worktree-agent-a285d999668cb01a3)
mnbuhl May 4, 2026
ba8b01c
test(08-03): add terminal-state unblocking tests (FIFO-13)
mnbuhl May 4, 2026
dc7a024
docs(08-03): complete terminal-state unblocking tests plan summary
mnbuhl May 4, 2026
098be25
chore: merge executor worktree (worktree-agent-abb8ed50d2f2f54c7)
mnbuhl May 4, 2026
9135e93
fix(ef-core-tests): lease jobs before marking completed/failed in Upd…
mnbuhl May 4, 2026
a37afb8
chore(tests): update AwesomeAssertions package version to 9.4.0
mnbuhl May 4, 2026
4e792da
feat(09-01): add PartitionKey and SequenceNumber to AtomizerJobEntity
mnbuhl May 4, 2026
5004096
feat(09-01): configure PartitionKey/SequenceNumber columns and add In…
mnbuhl May 4, 2026
87e2932
docs(09-01): complete EF Core entity layer FIFO foundation plan summary
mnbuhl May 4, 2026
caa7e86
chore: merge executor worktree (worktree-agent-a0882e4fb0e180b85)
mnbuhl May 4, 2026
bd51d1b
feat(09-02): implement InsertJobWithSequence and CTE-based GetDueJobs…
mnbuhl May 4, 2026
c027831
feat(09-02): update InsertAsync to branch on partition key and fix CR…
mnbuhl May 4, 2026
e5acefc
docs(09-02): complete FIFO SQL implementation plan summary
mnbuhl May 4, 2026
b3daa7a
chore: merge executor worktree (worktree-agent-a9ead1e7d34fcf307)
mnbuhl May 4, 2026
4689aac
test(09-03): add PostgreSQL, SQL Server, and MySQL storage contract t…
mnbuhl May 4, 2026
bb813d0
test(09-03): add SQLite contract tests and fix storage for shared DbC…
mnbuhl May 4, 2026
620e8f5
fix(09-03): restrict partition_heads CTE to eligible jobs only
mnbuhl May 4, 2026
5074fd9
chore: merge executor worktree (worktree-agent-a1526744b552af122)
mnbuhl May 4, 2026
ae5bb84
fix(09): CR-01 eager-load Errors in GetDueJobsAsync
mnbuhl May 4, 2026
bef3fe2
fix(09): CR-02 qualify outer WHERE column refs with table alias t.
mnbuhl May 4, 2026
f4fdac1
fix(09): CR-04 add ChangeTracker.Clear() to UpdateSchedulesAsync
mnbuhl May 4, 2026
ea198be
fix(09): WR-01 document RetryStrategy.None reconstitution guard intent
mnbuhl May 4, 2026
f0d27ec
fix(09): WR-02/IN-01 add unique index on IdempotencyKey and handle race
mnbuhl May 4, 2026
7b6d8ee
fix(09): WR-03 align column max lengths to domain object constraints
mnbuhl May 4, 2026
bc492b7
fix(09): WR-04 document ExecuteInLeaseAsync<TResult> default return c…
mnbuhl May 4, 2026
19c84a6
fix(09): WR-05 fix teardown order and add timeout to cleanup in contr…
mnbuhl May 4, 2026
df081f4
fix(09): revert WR-02 unique index (HasFilter breaks Postgres EnsureC…
mnbuhl May 4, 2026
03df194
fix(storage): simplify job error loading and improve sequence number …
mnbuhl May 4, 2026
37be6cb
refactor(sql): simplify SQL dialects and enhance query formatting
mnbuhl May 4, 2026
962f993
chore: remove tracked .planning files from git history
mnbuhl May 4, 2026
c68a996
refactor(storage): simplify job error cleanup and update schedule met…
mnbuhl May 4, 2026
30fc0be
fix: address Codex P1 review findings
mnbuhl May 4, 2026
aff713d
chore(samples): regenerate Initial migrations
mnbuhl May 4, 2026
13e0186
feat(samples): add FIFO partitioned job example and update README
mnbuhl May 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 15 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,12 @@ Atomizer is a modern, high-performance job scheduling and queueing framework for
- 🛑 **Graceful Shutdown** — Ensure in-flight jobs finish and pending batched jobs are safely released for re-processing during shutdowns.
- 📦 **Batch Processing** — Tune throughput with batch size and parallelism settings per queue.
- ⏳ **Visibility Timeout** — Prevent job duplication by locking jobs during processing.
- 🕒 **FIFO Partitioned Processing** — Guarantee strict in-order, one-at-a-time execution per partition key (e.g. per customer, per entity).
- 🧪 **In-Memory Driver** — Perfect for local development and testing; spin up queues instantly with zero setup.
- 🔔 **ASP.NET Core Integration** — Works with DI, logging, and modern C# idioms.

## Planned Features
- 📈 **Dashboard** — Live monitoring, retry/dead-letter management, and operational insights.
- 🕒 **FIFO Processing** — Guarantee jobs are processed in strict order, without overlap.
- ⚡ **Redis Driver** — Lightning-fast, distributed, in-memory queues for massive scale.

## Quick Start
Expand Down Expand Up @@ -130,7 +130,20 @@ app.MapPost(
);
```

### 5. Schedule Recurring Jobs
### 5. FIFO Processing (Partitioned Jobs)
To guarantee jobs for the same entity execute one-at-a-time in enqueue order, assign a `PartitionKey`:

```csharp
// All stock events for the same product are processed in strict FIFO order.
await atomizerClient.EnqueueAsync(
new StockEvent(productId, "restock", delta: 50),
options => options.PartitionKey = new PartitionKey(productId.ToString())
);
```

Jobs sharing the same `PartitionKey` and queue are serialized: the next job in the partition only starts after the previous one completes (or fails and is rescheduled). Unpartitioned jobs in the same queue are unaffected and continue to process in parallel.

### 6. Schedule Recurring Jobs
in Program.cs:
```csharp
...
Expand Down

This file was deleted.

Loading
Loading