Java 21 scheduler / UTC cursor / Netty executor / JDBC HA
A lightweight scheduling service with clear module boundaries. Firefly separates job definitions, runtime cursors, executor connections, shard leases, and operational APIs so scheduled work stays understandable and reliable.
Firefly can run inside a business process or as a standalone scheduling center. The core does not bind to Spring, HTTP, databases, or a specific transport; those capabilities evolve in integration, transport, store, and plugin modules.
Cron, fixed-rate, misfire, concurrency policy, and job-level time zones live in the pure Java core.
Business services actively register with the gateway through Netty, so they do not need to expose listener ports.
Job definitions, runtime cursors, shard leases, executions, outbox records, and audits can all be persisted.
Start locally with memory or H2, then switch to PostgreSQL or MySQL and split nodes by api, gateway, and scheduler roles.
Jobs explicitly declare IANA ZoneId values, while runtime state uses UTC Instant values.
scheduler-core does not depend on web frameworks, IOC containers, databases, or monitoring systems.
Admin UI, Admin HTTP API, Prometheus metrics, and audit logs form a separate operational surface.
Firefly does not try to become a large workflow platform. It is a lightweight scheduler center for Java systems, remote executor management, job-level time correctness, and clear module boundaries.
| Dimension | Firefly | Traditional schedulers | Workflow orchestrators |
|---|---|---|---|
| Positioning | Lightweight task scheduling service | Operational task platform | Complex DAG and dataflow orchestration |
| Integration | Embedded, Spring Boot, standalone Server, remote Executor | Usually center service plus executor agent | Tasks must fit workflow models |
| Boundary | Pure Java core with independent plugins and transports | Platform features often couple with scheduling core | Scheduling, dependency graph, and state machine are deeply tied |
Run the local Server and Admin UI first, then connect Spring Boot jobs or Netty remote executors.