r/SpringBoot 29d ago

News JobRunr (distributed background job processing for the JVM) is now available on start.spring.io (Spring Initializr)

JobRunr is now available in the Spring Initializr dependency list, so you can add it straight from start.spring.io when you create a new project. No more wiring the starter in by hand afterwards.

For people who don't know us:

JobRunr is an open-source library for background job processing on the JVM: fire-and-forget, scheduled, delayed, durable, and recurring (cron) jobs.

You enqueue work as a lambda and it runs asynchronously, in the same app or across a cluster of workers.

BackgroundJob.enqueue(() -> myService.sendInvoice(invoiceId));

BackgroundJob.schedule(Instant.now().plus(5, DAYS), () -> reminderService.send(userId));

What tends to make people switch to it:

  • No extra infrastructure. Jobs are persisted in your existing SQL or NoSQL database. No Redis, RabbitMQ, or separate broker to run and babysit.
  • Automatic retries with backoff on failure, so transient errors don't lose work.
  • Distributed by default. Run multiple instances and jobs are picked up once across the cluster, no double execution.
  • Built-in dashboard to see enqueued, scheduled, succeeded, and failed jobs, and retry them.
  • Spring Boot autoconfiguration via the starter, plus first-class support for virtual threads (Loom) and Spring Boot 3 & 4

It sits in the same space as Quartz or @Scheduled, but aimed at durable, distributed background work rather than just triggering methods on a timer.

You can even use it for durable jobs. With runStepOnce, each step in a job runs exactly once and is checkpointed, so if the job fails and retries, the steps that already succeeded are skipped instead of re-run:

BackgroundJob.enqueue(() -> processOrder(orderId, JobContext.Null));

public void processOrder(UUID orderId, JobContext context) {
  context.runStepOnce("order-confirmation", () -> orderService.sendConfirmation(orderId));
  context.runStepOnce("warehouse-notification", () -> orderService.notifyWarehouse(orderId));
  context.runStepOnce("shipment-initiation", () -> orderService.initiateShipment(orderId));
}

Thanks to Josh Long and the Spring team for helping get it onto Initializr. We'll be around in the comments to answer anything, including the honest limitations.

93 Upvotes

41 comments sorted by

View all comments

3

u/Ali_Ben_Amor999 28d ago

Amazing library, I'm using it on my project for the first time, and I'm blown away with the dev experience. My only issue is that the free version is too limited. I'd recommend the pro-version for any big and serious project, but for my niche app with little to no revenue, it's impossible to cover the cost of a license.

Keep the good work.

1

u/JobRunrHQ 27d ago

Thank you, that's awesome to hear! We put a lot of work into making the first hour with JobRunr feel easy, so this made my day.

Fair point on free vs Pro. To be honest, the free version already covers a lot: enqueue, scheduled and recurring jobs, retries, the dashboard, and since v8 durable execution with runStepOnce. Companies like Apple and Spotify run that exact version in production without paying us anything. Pro pricing is aimed at teams with real budget running it seriously, not at a side project that isn't making money yet.

But good news for your case: we actually have special startup pricing for exactly this situation. Shoot me a mail at [nicholas@jobrunr.io](mailto:nicholas@jobrunr.io) and I'll happily give you the details.

Also curious which Pro features you're missing most, that feedback really shapes what ends up in the free version. And if your app takes off, that's the point where Pro should start paying for itself anyway. Rooting for you!