How jinbriden/asyncflow works
AsyncFlow accepts sales-report tasks over REST, deduplicates submissions, and processes accepted work asynchronously into downloadable regional-sales CSV reports. Its main path is task submission and transactional persistence, Outbox publication, RabbitMQ consumption, report generation and storage, then status/result queries. Separate API capabilities support task listing, event history, cancellation, dead-task replay and compensation; scheduled recovery and retry behavior are represented at the subsystem level. The README documents these paths, but several implementation classes were not sampled, so their internal calls are not expanded.
Main entry points: TaskRepository.java Task repository · TaskController.java Task endpoints · TaskProcessor.java Task processor · TaskSubmissionService.java Task submission
Components 28
Task API
- Task endpoints
src/main/java/io/github/asyncflow/api/TaskController.java - Recovery endpoints
src/main/java/io/github/asyncflow/api/InternalTaskController.java
Async execution
- Task submission
src/main/java/io/github/asyncflow/service/TaskSubmissionService.java - Creation transaction
src/main/java/io/github/asyncflow/service/TaskCreationTransaction.java - Task listener
src/main/java/io/github/asyncflow/messaging/TaskListener.java - Task processor
src/main/java/io/github/asyncflow/service/TaskProcessor.java
Report lifecycle
- Payload validation
src/main/java/io/github/asyncflow/report/ReportPayloadParser.java - Sales report generator
src/main/java/io/github/asyncflow/report/SalesReportGenerator.java - CSV storage
src/main/java/io/github/asyncflow/report/ReportStorage.java - Result query
src/main/java/io/github/asyncflow/report/ReportQueryService.java
State and recovery
- Idempotency store
src/main/java/io/github/asyncflow/idempotency/IdempotencyStore.java - Task state model
src/main/java/io/github/asyncflow/domain/TaskStateMachine.java - Event recording
src/main/java/io/github/asyncflow/service/TaskEventRecorder.java - Replay and compensation
src/main/java/io/github/asyncflow/service/RecoveryService.java - Task cancellation
src/main/java/io/github/asyncflow/service/TaskCancellationService.java - Stale-task scanner
src/main/java/io/github/asyncflow/service/StaleTaskScanner.java
Persistence and messaging
- Outbox scheduling
src/main/java/io/github/asyncflow/messaging/OutboxScheduler.java - Outbox publisher
src/main/java/io/github/asyncflow/messaging/OutboxPublisher.java - RabbitMQ
- Task repository
src/main/java/io/github/asyncflow/repository/TaskRepository.java - Event repository
src/main/java/io/github/asyncflow/repository/TaskEventRepository.java - Outbox repository
src/main/java/io/github/asyncflow/repository/OutboxEventRepository.java - Report-result repository
src/main/java/io/github/asyncflow/report/ReportResultRepository.java - MySQL
- Redis idempotency
src/main/java/io/github/asyncflow/idempotency/RedisIdempotencyStore.java - Redis
- Report files
Other components
- API client
Connections 42
- API client → Task endpoints: submits and queries
- Task endpoints → Task submission: submits task
- Task submission → Payload validation: validates report
- Task submission → Idempotency store: checks and reserves
- Task submission → Task repository: looks up task
- Task submission → Creation transaction: creates task
- Creation transaction → Task repository: persists task
- Creation transaction → Event recording: records creation
- Creation transaction → Outbox repository: writes outbox event
- Event recording → Event repository: persists event
- Outbox scheduling → Outbox repository: reads pending events
- Outbox scheduling → Outbox publisher: dispatches events
- Outbox publisher → RabbitMQ: publishes task
- RabbitMQ → Task listener: delivers message
- Task listener → Task processor: dispatches task
- Task processor → Sales report generator: generates CSV
- Task processor → CSV storage: stores report
- CSV storage → Report files: writes and loads files
- Task processor → Task repository: updates task
- Task processor → Event recording: records progress
- Task processor → Report-result repository: stores result metadata
- Task endpoints → Result query: requests download
- Result query → Task repository: checks task status
- Result query → Report-result repository: reads result metadata
- Result query → CSV storage: loads report
- Task endpoints → Task repository: lists tasks
- Task endpoints → Event repository: reads event history
- Task endpoints → Task cancellation: cancels task
- Task cancellation → Task repository: loads and updates task
- Task cancellation → Event recording: records cancellation
- Recovery endpoints → Replay and compensation: replays or compensates
- Replay and compensation → Task repository: loads and updates task
- Replay and compensation → Event recording: records recovery
- Replay and compensation → RabbitMQ: requeues replay
- Stale-task scanner → Task repository: finds stale tasks
- Task repository → MySQL: reads and writes
- Event repository → MySQL: reads and writes
- Outbox repository → MySQL: reads and writes
- Report-result repository → MySQL: reads and writes
- Idempotency store → Redis idempotency: uses configured store
- Redis idempotency → Redis: stores short-lived mappings
- Task state model → Task repository: state persisted with task