# learnerview/simplydone4j architecture

> Architecture diagram of the GitHub repository learnerview/simplydone4j, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-10). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/learnerview/simplydone4j
- Repository: https://github.com/learnerview/simplydone4j

## Overview

SimplyDone4J is an embeddable Spring Boot background-job engine backed by Redis, not a standalone service. An application submits a job and registers its handler; the engine admits and stores it, schedules it by weighted priority, and executes it under a lease. Failures can be retried or sent to a dead-letter list, while Redis retains job and execution-history state. The README documents these capabilities; source excerpts confirm scheduler dispatch, Redis-backed repositories, and health reporting, but do not expose all runtime wiring, so uncertain links are omitted.

Main entry points: [`src/main/java/io/github/learnerview/simplydone4j/service/impl/JobSubmissionServiceImpl.java`](https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/service/impl/JobSubmissionServiceImpl.java) (Job submission), [`src/main/java/io/github/learnerview/simplydone4j/service/impl/JobExecutorServiceImpl.java`](https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/service/impl/JobExecutorServiceImpl.java) (Job executor), [`src/main/java/io/github/learnerview/simplydone4j/service/impl/SchedulerEngine.java`](https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/service/impl/SchedulerEngine.java) (Priority scheduler), [`src/main/java/io/github/learnerview/simplydone4j/repository/RedisQueueRepository.java`](https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/repository/RedisQueueRepository.java) (Priority queues)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_submission["Submission and admission"]
  node_submit["Job submission"]
  node_request["Submission request"]
  node_idempotency["Idempotency reservation"]
  node_job["Job record<br/>[JobEntity.java]"]
  node_queue["Priority queues"]
end

subgraph group_runtime["Scheduling and execution"]
  node_scheduler["Priority scheduler"]
  node_executor["Job executor"]
  node_registry["Handler registry"]
  node_handler["Application handler<br/>[JobHandler.java]"]
end

subgraph group_recovery["Recovery and history"]
  node_retry["Retry policy"]
  node_maintenance["Worker maintenance"]
  node_deadletter["Dead-letter recovery"]
  node_history[("Execution history")]
  node_events["Lifecycle events"]
end

subgraph group_platform["Redis and engine health"]
  node_jobstore[("Job repository")]
  node_redis[("Redis")]
  node_status["Engine health"]
  node_config["Engine configuration"]
end

node_application(("Spring application"))

node_application -->|"submits jobs"| node_submit
node_application -->|"registers handler"| node_registry
node_submit -->|"accepts request"| node_request
node_submit -->|"reserves key"| node_idempotency
node_submit -->|"persists job"| node_jobstore
node_submit -->|"admits job"| node_queue
node_scheduler -->|"claims batches"| node_queue
node_scheduler -->|"loads claimed jobs"| node_jobstore
node_scheduler -->|"dispatches jobs"| node_executor
node_executor -.->|"invokes handler"| node_handler
node_registry -->|"registers handlers"| node_handler
node_executor -.->|"records failures"| node_retry
node_maintenance -.->|"reaps leases"| node_retry
node_retry -.->|"exhausts attempts"| node_deadletter
node_executor -.->|"logs attempts"| node_history
node_submit -->|"publishes lifecycle"| node_events
node_jobstore -->|"stores job state"| node_redis
node_queue -->|"stores queue state"| node_redis
node_idempotency -->|"stores reservations"| node_redis
node_history -.->|"stores execution logs"| node_redis
node_status -->|"reads queue depths"| node_queue
node_status -->|"checks reachability"| node_redis
node_config -->|"configures scheduling"| node_scheduler

click node_submit "https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/service/impl/JobSubmissionServiceImpl.java"
click node_request "https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/dto/JobSubmissionRequest.java"
click node_idempotency "https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/service/impl/RedisIdempotencyServiceImpl.java"
click node_job "https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/entity/JobEntity.java"
click node_queue "https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/repository/RedisQueueRepository.java"
click node_scheduler "https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/service/impl/SchedulerEngine.java"
click node_executor "https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/service/impl/JobExecutorServiceImpl.java"
click node_registry "https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/handler/HandlerRegistry.java"
click node_handler "https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/handler/JobHandler.java"
click node_retry "https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/service/impl/RetryServiceImpl.java"
click node_maintenance "https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/service/impl/WorkerMaintenanceServiceImpl.java"
click node_deadletter "https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/service/impl/DeadLetterServiceImpl.java"
click node_history "https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/repository/RedisJobExecutionLogRepository.java"
click node_jobstore "https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/repository/RedisJobRepository.java"
click node_status "https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/service/impl/EngineStatusServiceImpl.java"
click node_config "https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/autoconfigure/SimplyDoneProperties.java"
click node_events "https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/event/JobEventPublisher.java"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_submit,node_request,node_idempotency,node_job,node_queue toneBlue
class node_scheduler,node_executor,node_registry,node_handler toneAmber
class node_retry,node_maintenance,node_deadletter,node_history,node_events toneMint
class node_jobstore,node_redis,node_status,node_config toneRose
class node_application toneIndigo
```

## Components

### Submission and admission

- [Job submission](https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/service/impl/JobSubmissionServiceImpl.java): `src/main/java/io/github/learnerview/simplydone4j/service/impl/JobSubmissionServiceImpl.java`
- [Submission request](https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/dto/JobSubmissionRequest.java): `src/main/java/io/github/learnerview/simplydone4j/dto/JobSubmissionRequest.java`
- [Idempotency reservation](https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/service/impl/RedisIdempotencyServiceImpl.java): `src/main/java/io/github/learnerview/simplydone4j/service/impl/RedisIdempotencyServiceImpl.java`
- [Job record](https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/entity/JobEntity.java): `src/main/java/io/github/learnerview/simplydone4j/entity/JobEntity.java`
- [Priority queues](https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/repository/RedisQueueRepository.java): `src/main/java/io/github/learnerview/simplydone4j/repository/RedisQueueRepository.java`

### Scheduling and execution

- [Priority scheduler](https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/service/impl/SchedulerEngine.java): `src/main/java/io/github/learnerview/simplydone4j/service/impl/SchedulerEngine.java`
- [Job executor](https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/service/impl/JobExecutorServiceImpl.java): `src/main/java/io/github/learnerview/simplydone4j/service/impl/JobExecutorServiceImpl.java`
- [Handler registry](https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/handler/HandlerRegistry.java): `src/main/java/io/github/learnerview/simplydone4j/handler/HandlerRegistry.java`
- [Application handler](https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/handler/JobHandler.java): `src/main/java/io/github/learnerview/simplydone4j/handler/JobHandler.java`

### Recovery and history

- [Retry policy](https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/service/impl/RetryServiceImpl.java): `src/main/java/io/github/learnerview/simplydone4j/service/impl/RetryServiceImpl.java`
- [Worker maintenance](https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/service/impl/WorkerMaintenanceServiceImpl.java): `src/main/java/io/github/learnerview/simplydone4j/service/impl/WorkerMaintenanceServiceImpl.java`
- [Dead-letter recovery](https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/service/impl/DeadLetterServiceImpl.java): `src/main/java/io/github/learnerview/simplydone4j/service/impl/DeadLetterServiceImpl.java`
- [Execution history](https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/repository/RedisJobExecutionLogRepository.java): `src/main/java/io/github/learnerview/simplydone4j/repository/RedisJobExecutionLogRepository.java`
- [Lifecycle events](https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/event/JobEventPublisher.java): `src/main/java/io/github/learnerview/simplydone4j/event/JobEventPublisher.java`

### Redis and engine health

- [Job repository](https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/repository/RedisJobRepository.java): `src/main/java/io/github/learnerview/simplydone4j/repository/RedisJobRepository.java`
- **Redis**
- [Engine health](https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/service/impl/EngineStatusServiceImpl.java): `src/main/java/io/github/learnerview/simplydone4j/service/impl/EngineStatusServiceImpl.java`
- [Engine configuration](https://github.com/learnerview/simplydone4j/blob/main/src/main/java/io/github/learnerview/simplydone4j/autoconfigure/SimplyDoneProperties.java): `src/main/java/io/github/learnerview/simplydone4j/autoconfigure/SimplyDoneProperties.java`

### Other components

- **Spring application**

## Connections

- Spring application → Job submission: submits jobs (evidence: `README.md`)
- Spring application → Handler registry: registers handler (evidence: `README.md`)
- Job submission → Submission request: accepts request (evidence: `src/main/java/io/github/learnerview/simplydone4j/service/impl/JobSubmissionServiceImpl.java`)
- Job submission → Idempotency reservation: reserves key (evidence: `src/main/java/io/github/learnerview/simplydone4j/service/impl/JobSubmissionServiceImpl.java`)
- Job submission → Job repository: persists job (evidence: `src/main/java/io/github/learnerview/simplydone4j/service/impl/JobSubmissionServiceImpl.java`)
- Job submission → Priority queues: admits job (evidence: `src/main/java/io/github/learnerview/simplydone4j/service/impl/JobSubmissionServiceImpl.java`)
- Priority scheduler → Priority queues: claims batches (evidence: `src/main/java/io/github/learnerview/simplydone4j/service/impl/SchedulerEngine.java`)
- Priority scheduler → Job repository: loads claimed jobs (evidence: `src/main/java/io/github/learnerview/simplydone4j/service/impl/SchedulerEngine.java`)
- Priority scheduler → Job executor: dispatches jobs (evidence: `src/main/java/io/github/learnerview/simplydone4j/service/impl/SchedulerEngine.java`)
- Job executor → Application handler: invokes handler (evidence: `src/main/java/io/github/learnerview/simplydone4j/service/impl/JobExecutorServiceImpl.java`)
- Handler registry → Application handler: registers handlers (evidence: `src/main/java/io/github/learnerview/simplydone4j/handler/HandlerRegistry.java`)
- Job executor → Retry policy: records failures
- Worker maintenance → Retry policy: reaps leases
- Retry policy → Dead-letter recovery: exhausts attempts
- Job executor → Execution history: logs attempts
- Job submission → Lifecycle events: publishes lifecycle (evidence: `src/main/java/io/github/learnerview/simplydone4j/service/impl/JobSubmissionServiceImpl.java`)
- Job repository → Redis: stores job state (evidence: `README.md`)
- Priority queues → Redis: stores queue state (evidence: `README.md`)
- Idempotency reservation → Redis: stores reservations (evidence: `README.md`)
- Execution history → Redis: stores execution logs
- Engine health → Priority queues: reads queue depths (evidence: `src/main/java/io/github/learnerview/simplydone4j/service/impl/EngineStatusServiceImpl.java`)
- Engine health → Redis: checks reachability (evidence: `src/main/java/io/github/learnerview/simplydone4j/service/impl/EngineStatusServiceImpl.java`)
- Engine configuration → Priority scheduler: configures scheduling (evidence: `src/main/java/io/github/learnerview/simplydone4j/service/impl/SchedulerEngine.java`)
