Quartz vs JobRunr

The Quartz alternative for modern Java teams

JobRunr runs your Java background jobs on the database you already have. You get a real dashboard, automatic retries and a lot more throughput. And because both schedulers run side by side, you can migrate one job at a time.

JobRunr OSS is free forever, for companies too.

18x

more jobs per second than Quartz in our public benchmark, on the same Postgres database

See the numbers →

5 tables

is all JobRunr adds to your database, where Quartz creates 11

1 dashboard

built into JobRunr, showing every job and server in real time, where Quartz ships none

The same job, written twice

This is the Quartz quick-start example next to its JobRunr equivalent. Quartz asks for a Job class, a JobDetail, a JobDataMap and a Trigger. JobRunr asks for a lambda.

Quartz
public class WelcomeMailJob implements Job {
    @Override
    public void execute(JobExecutionContext ctx)
            throws JobExecutionException {
        String userId = ctx.getMergedJobDataMap()
            .getString("userId");
        new MailService().sendWelcomeMail(userId);
    }
}

Scheduler scheduler =
    StdSchedulerFactory.getDefaultScheduler();

JobDetail job = newJob(WelcomeMailJob.class)
    .withIdentity("welcome-mail", "mails")
    .storeDurably()
    .build();
scheduler.addJob(job, true);

JobDataMap data = new JobDataMap();
data.put("userId", userId);

scheduler.triggerJob(job.getKey(), data);
scheduler.start();
JobRunr
// run it now
BackgroundJob.enqueue(
    () -> mailService.sendWelcomeMail(userId));

// or run it tomorrow
BackgroundJob.schedule(now().plus(1, DAYS),
    () -> mailService.sendReminder(userId));

// or run it every morning at 8
BackgroundJob.scheduleRecurrently("0 8 * * *",
    () -> reportService.generateDailyReport());

Any existing class or Spring, Quarkus or Micronaut bean works as a job. There is no interface to implement and no JobDataMap to fill by hand, since JobRunr serializes the lambda and its arguments for you.

Looking for a Quartz scheduler UI? There isn’t one.

Search for a Quartz scheduler UI and you land in a maze of half-abandoned community projects. Quartz itself ships no interface at all, so most teams end up querying the QRTZ_ tables by hand to work out which jobs ran and which ones vanished.

JobRunr comes with a dashboard out of the box. You see every enqueued, scheduled, succeeded and failed job in real time, and when something breaks you get the full stack trace and can requeue the job with one click.

Explore the dashboard →
The JobRunr dashboard showing an overview of enqueued jobs

JobRunr vs Quartz, feature by feature

Quartz has earned two decades of trust and it still wins on business calendars. The rest, side by side.

QuartzJobRunr
Creating a jobA Job class, a JobDetail and a TriggerA Java 8 lambda
DashboardNone, community projects onlyBuilt in, for every job and server
Automatic retriesRefire logic you write yourself10 retries with smart back-off, out of the box
ClusteringOpt-in, needs extra configurationOn by default, servers coordinate through your database
Database tables115
Throughput in our public benchmark145 jobs per second2,732 jobs per second
Virtual threadsPlatform thread poolsSupported out of the box on JDK 21+
Framework integrationsSpring Boot starterOfficial Spring Boot, Quarkus and Micronaut integrations
Business calendarsHoliday and fiscal calendars built inCron with time zones, business-day rules live in your job code
LicenseApache 2.0, freeLGPL 3.0, free for commercial use
Commercial optionNo commercial edition or support contractJobRunr Pro adds priority queues, workflows and support
MaintenanceActive again since IBM acquired the projectActively developed by a dedicated team

Where the 18x comes from

We enqueued 500,000 jobs on the same dedicated Hetzner server and the same Postgres 18 database, once with Quartz and once with JobRunr Pro, using identical thread pools and connection pools. Quartz processed 145 jobs per second. JobRunr Pro processed 2,732.

Quartz coordinates its cluster through row locks on a separate QRTZ_LOCKS table, so every job costs extra database round trips. eBay’s engineering team documented this exact bottleneck under heavy load. JobRunr takes the lock inside the fetch query itself, using FOR UPDATE SKIP LOCKED on Postgres, so your database spends its time processing jobs instead of managing locks.

To be fair to Quartz, the benchmark uses jobs that finish instantly, which is the worst case for scheduler overhead. If your jobs take half a second each, the gap shrinks because your own code becomes the bottleneck. The extra database load Quartz adds to every job stays either way.

Quartz

145

jobs per second

JobRunr Pro

2,732

jobs per second

“Decathlon processes 50 million scans a day on JobRunr.”

Read the Decathlon story →

Keep Quartz when

  • You maintain a legacy system in low-change mode, where any migration carries more risk than the pain it removes.
  • You built years of custom listeners and plugins around Quartz internals and they still serve you well.

Move to JobRunr when

  • You want to see your jobs. The dashboard alone is the reason many teams switch.
  • Your database feels the scheduler load, or you process enough jobs that throughput matters.
  • You run distributed workloads on Kubernetes or in the cloud and want clustering without configuration.
  • You are tired of writing Job classes and want to enqueue a lambda and move on.

Migrate one job at a time

JobRunr and Quartz share no tables and no threads, so they run happily side by side in the same application. Most teams move their jobs over gradually and retire Quartz once the last trigger has fired.

Step 1

Add the dependency

Add jobrunr or the starter for your framework to your build. JobRunr creates its five tables on startup and stays out of Quartz’s way.

Step 2

Move a job

Pick one Job class and replace it with a lambda or a JobRequestHandler. Keep the Quartz version around until you trust the new one.

Step 3

Retire Quartz

When the last trigger has fired, remove the dependency and drop the 11 QRTZ_ tables from your database.

What each one costs

No surprises on either side.

Quartz

Free under Apache 2.0. You build and run everything around it yourself, which in practice means a homegrown UI, your own retry logic, your own alerting and the developer time all of that eats.

JobRunr

JobRunr OSS is free forever under LGPL 3.0, for companies too. JobRunr Pro is €850 per production cluster per month, or €9,000 per year. Startups with fewer than 10 people can apply for the €1,200 per year plan.

See the full pricing →

Trusted by thousands of companies worldwide

Brand Logo
Brand Logo
Brand Logo
Brand Logo
Brand Logo
Brand Logo

FAQ

Questions Quartz users ask us

The things teams want to know before they switch, answered without the sales filter.

For most applications the first job runs on JobRunr within an afternoon. A full migration depends on how many Job classes you have, but there is no big-bang moment because both schedulers run side by side. Teams usually move a few jobs per sprint and remove Quartz when the last one is gone. The migration guide walks through every step with code.
Yes. They use separate tables and share no state, so nothing conflicts. This is how most teams migrate, moving jobs over gradually while Quartz keeps running the rest.
Yes. JobRunr OSS is licensed under LGPL 3.0 and is free for everyone, including companies of any size. JobRunr Pro is the paid tier that adds priority queues, workflows, an enhanced dashboard and priority support.
Yes, there are official integrations for all three. You can even add JobRunr straight from start.spring.io or code.quarkus.io. Configuration happens through your normal application properties.
All major SQL databases, including Postgres, MySQL, MariaDB, Oracle and SQL Server, plus MongoDB on the NoSQL side. JobRunr reuses the datasource your application already has. The full list is in the storage documentation.
No. Your database is the only infrastructure JobRunr needs, exactly like Quartz in that respect. There is no broker to install, monitor or pay for.
JobRunr retries it automatically, up to 10 times with a smart back-off policy. If the job keeps failing, you see the full stack trace in the dashboard and can requeue or delete it with one click. With Quartz, retry behaviour is something you write and maintain yourself.
Every server that starts JobRunr registers itself in the database and the servers coordinate from there. There is nothing to configure, you scale by starting more instances. Quartz can cluster too, but it is opt-in and depends on the row-locking scheme that our benchmark shows becoming the bottleneck under load.
€850 per production cluster per month, or €9,000 per year. A production cluster is every application or microservice talking to one JobRunr database in production, and dev, test and staging are free. Eligible startups can apply for €1,200 per year. All details are on the pricing page.
Yes. After a quiet stretch between 2019 and 2023, the IBM acquisition brought new activity and the community has been closing long-standing issues. Teams that still move to JobRunr do it for architectural reasons. The 11-table schema, the lock-table contention and the missing dashboard are design decisions that a new release does not change.
call to action

Try JobRunr yourself, no install required

Walk through 21 hands-on scenarios in our hosted demo and feel how JobRunr handles real-world workflows. Open it in your browser, no setup, no signup.

Launch the interactive demo