{"id":13458705,"url":"https://github.com/jobrunr/jobrunr","last_synced_at":"2026-01-22T12:44:48.492Z","repository":{"id":37393573,"uuid":"252523575","full_name":"jobrunr/jobrunr","owner":"jobrunr","description":"An extremely easy way to perform background processing in Java. Backed by persistent storage. Open and free for commercial use.","archived":false,"fork":false,"pushed_at":"2026-01-14T10:56:28.000Z","size":12972,"stargazers_count":2834,"open_issues_count":4,"forks_count":300,"subscribers_count":31,"default_branch":"master","last_synced_at":"2026-01-16T23:34:08.569Z","etag":null,"topics":["background-jobs","java","java-8","java-scheduler","parallel-processing","quartz","scheduled-jobs","scheduler","scheduling"],"latest_commit_sha":null,"homepage":"https://www.jobrunr.io/en/","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jobrunr.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"License-lgpl.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":"CLA.md"},"funding":{"github":["jobrunr"]}},"created_at":"2020-04-02T17:34:11.000Z","updated_at":"2026-01-15T14:19:08.000Z","dependencies_parsed_at":"2023-11-22T18:43:47.556Z","dependency_job_id":"d7dc8e7f-fddd-4d2a-8786-aeaa77aabae8","html_url":"https://github.com/jobrunr/jobrunr","commit_stats":null,"previous_names":[],"tags_count":134,"template":false,"template_full_name":null,"purl":"pkg:github/jobrunr/jobrunr","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jobrunr%2Fjobrunr","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jobrunr%2Fjobrunr/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jobrunr%2Fjobrunr/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jobrunr%2Fjobrunr/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jobrunr","download_url":"https://codeload.github.com/jobrunr/jobrunr/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jobrunr%2Fjobrunr/sbom","scorecard":{"id":480689,"data":{"date":"2025-08-11","repo":{"name":"github.com/jobrunr/jobrunr","commit":"34e86991c49bdf0f52d41c607aa9cc6c5a26f6a2"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":6.5,"checks":[{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":10,"reason":"30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: SECURITY.md:1","Info: Found linked content: SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: SECURITY.md:1","Info: Found text in security policy: SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Code-Review","score":10,"reason":"all changesets reviewed","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":6,"reason":"binaries present in source code","details":["Warn: binary detected: bin/reviewdog:1","Warn: binary detected: core/src/main/resources/org/jobrunr/server/Java11OrHigherInternalDesktopUtil.class:1","Warn: binary detected: gradle/wrapper/gradle-wrapper.jar:1","Warn: binary detected: tests/e2e-vm-jdk/.mvn/wrapper/maven-wrapper.jar:1"],"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":5,"reason":"badge detected: Passing","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"License","score":9,"reason":"license file detected","details":["Info: project has a license file: License.md:0","Warn: project license file does not contain an FSF or OSI license."],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Pinned-Dependencies","score":2,"reason":"dependency not pinned by hash detected -- score normalized to 2","details":["Warn: containerImage not pinned by hash: BuildDockerfile:2","Warn: containerImage not pinned by hash: BuildDockerfile:4","Warn: downloadThenRun not pinned by hash: BuildDockerfile:13","Info:   1 out of   3 containerImage dependencies pinned","Info:   0 out of   1 downloadThenRun dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":9,"reason":"1 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-x7hr-w5r2-h6wg"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-19T16:32:21.311Z","repository_id":37393573,"created_at":"2025-08-19T16:32:21.311Z","updated_at":"2025-08-19T16:32:21.311Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28663108,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-22T01:17:37.254Z","status":"online","status_checked_at":"2026-01-22T02:00:07.137Z","response_time":144,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["background-jobs","java","java-8","java-scheduler","parallel-processing","quartz","scheduled-jobs","scheduler","scheduling"],"created_at":"2024-07-31T09:00:55.434Z","updated_at":"2026-01-22T12:44:48.472Z","avatar_url":"https://github.com/jobrunr.png","language":"Java","funding_links":["https://github.com/sponsors/jobrunr"],"categories":["Java","Software 💻","任务调度","Projects","java","项目","\u003ca name=\"Java\"\u003e\u003c/a\u003eJava"],"sub_categories":["Tools 🧰","Job Scheduling","作业调度"],"readme":"\u003cp align=\"center\"\u003e\n \u003ca href=\"https://www.jobrunr.io/en/\" target=\"_blank\"\u003e\u003cimg src=\"https://user-images.githubusercontent.com/567842/80095933-1181c900-8569-11ea-85e7-14129b3f8142.png\" alt=\"JobRunr logo\"\u003e\u003c/img\u003e\u003c/a\u003e\n\u003c/p\u003e  \n\u003cp align=\"center\"\u003e\nThe ultimate library to perform background processing on the JVM.\u003cbr/\u003e\nDead simple API. Extensible. Reliable. \u003cbr/\u003e\nDistributed and backed by persistent storage. \u003cbr/\u003e\nOpen and free for commercial use.  \u003cbr/\u003e\nRecommended and \u003ca href=\"https://www.thoughtworks.com/radar/languages-and-frameworks/jobrunr\"\u003eloved by ThoughtWorks\u003c/a\u003e.\n\u003c/p\u003e  \n\u003cbr/\u003e\n\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://central.sonatype.com/artifact/org.jobrunr/jobrunr\"\u003e\u003cimg alt=\"Maven Central Version\" src=\"https://img.shields.io/maven-central/v/org.jobrunr/jobrunr\"\u003e\u003c/a\u003e\u0026nbsp;\n    \u003cimg alt=\"Woodpecker CI\" src=\"https://ci.jobrunr.io/api/badges/1/status.svg\" /\u003e\u0026nbsp;\n    \u003ca href=\"https://www.bestpractices.dev/projects/7376\"\u003e\u003cimg alt=\"OpenSSF Best Practices\" src=\"https://www.bestpractices.dev/projects/7376/badge\"/\u003e\u003c/a\u003e\u0026nbsp;\n    \u003cimg alt=\"LGPLv3 Licence\" src=\"https://img.shields.io/badge/license-LGPLv3-green.svg\" /\u003e\u003cbr/\u003e\n    \u003cbr/\u003e\n    \u003ca href=\"https://twitter.com/intent/tweet?text=Try%20JobRunr%20for%20easy%20distributed%20background%20job%20processing%20on%20the%20JVM%21%20\u0026url=https://www.jobrunr.io\u0026via=jobrunr\u0026hashtags=java,scheduling,processing,distributed,developers\"\u003e\u003cimg alt=\"Tweet about us!\" src=\"https://img.shields.io/twitter/url?label=Tweet%20about%20us!\u0026url=https%3A%2F%2Fx.com%2FJobRunr\"\u003e\u003c/a\u003e\u0026nbsp;\n    \u003ca href=\"https://github.com/jobrunr/jobrunr/stargazers\"\u003e\u003cimg alt=\"Star us!\" src=\"https://img.shields.io/github/stars/jobrunr/jobrunr?label=Star%20us!\" /\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/jobrunr/jobrunr/discussions\"\u003e\u003cimg src=\"https://img.shields.io/badge/chat-Github%20discussions-green\" alt=\"Chat with us in Github Discussions\" /\u003e\u003c/a\u003e\u003cbr /\u003e\n\u003c/p\u003e\n\n## Overview\n\n\u003c!-- // @formatter:off --\u003e\n```java\nBackgroundJob.enqueue(() -\u003e System.out.println(\"This is all you need for distributed jobs!\"));\n```\n\nIncredibly easy way to perform **fire-and-forget**, **delayed**, **scheduled** and **recurring jobs** inside **Java applications** using only *Java 8 lambda's*. CPU and I/O intensive, long-running and short-running jobs are supported. Persistent storage is done via either RDBMS (e.g. Postgres, MariaDB/MySQL, Oracle, SQL Server, DB2 and SQLite) or NoSQL (MongoDB).\n\nJobRunr provides a unified programming model to handle background tasks in a **reliable way** and runs them on shared hosting, dedicated hosting or in the cloud ([hello Kubernetes](https://www.jobrunr.io/en/blog/2020-05-06-jobrunr-kubrnetes-terraform/)) within a JVM instance.\n\n\n## Feedback\n\u003e Thanks for building JobRunr, I like it a lot! Before that I used similar libraries in Ruby and Golang and JobRunr so far is the most pleasant one to use. I especially like the dashboard, it’s awesome! [Alex Denisov](https://www.linkedin.com/in/alex-denisov-a29bab2a/)\n\nView more feedback on [jobrunr.io](https://www.jobrunr.io/en/#why-jobrunr).\n\n\n## Features\n- Simple: just use Java 8 lambda's to create a background job.\n- Distributed \u0026 cluster-friendly: guarantees execution by single scheduler instance using optimistic locking.\n- Persistent jobs: using either a RDBMS (four tables and a view) or a NoSQL data store.\n- Embeddable: built to be embedded in existing applications.\n- Minimal dependencies: ([ASM](https://asm.ow2.io/), slf4j and either [jackson](https://github.com/FasterXML/jackson) and jackson-datatype-jsr310, [gson](https://github.com/google/gson) or a JSON-B compliant library).\n\n## Usage scenarios\nSome scenarios where it may be a good fit:\n- within a REST api return response to client immediately and perform long-running job in the background\n- mass notifications/newsletters\n- calculations of wages and the creation of the resulting documents\n- batch import from xml, csv or json\n- creation of archives\n- firing off web hooks\n- image/video processing\n- purging temporary files\n- recurring automated reports\n- database maintenance\n- updating elasticsearch/solr after data changes \n- *…and so on*\n\nYou can start small and process jobs within your web app or scale horizontally and add as many background job servers as you want to handle a peak of jobs. JobRunr will distribute the load over all the servers for you. JobRunr is also fault-tolerant - is an external web service down? No worries, the job is automatically retried 10-times with a smart back-off policy.\n\nJobRunr is a Java alternative to [HangFire](https://github.com/HangfireIO/Hangfire), [Resque](https://github.com/resque/resque), [Sidekiq](http://sidekiq.org), [delayed_job](https://github.com/collectiveidea/delayed_job), [Celery](https://github.com/celery/celery) and is similar to [Quartz](https://github.com/quartz-scheduler/quartz) and [Spring Task Scheduler](https://github.com/spring-guides/gs-scheduling-tasks).\n\n\nScreenshots\n-----------\n\u003cimg src=\"https://user-images.githubusercontent.com/567842/80217070-60019700-863f-11ea-9f02-d62c77e97a1c.png\" width=\"45%\" style=\"margin-right: 20px;\"\u003e\u003c/img\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003cimg src=\"https://user-images.githubusercontent.com/567842/80217075-609a2d80-863f-11ea-8994-cd0ca16b31c4.png\" width=\"45%\"\u003e\u003c/img\u003e \u003cbr/\u003e \u003cimg src=\"https://user-images.githubusercontent.com/567842/80217067-5f690080-863f-11ea-9d41-3e2878ae7ac8.png\" width=\"45%\" style=\"margin-right: 20px;\"\u003e\u003c/img\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003cimg src=\"https://user-images.githubusercontent.com/567842/80217063-5ed06a00-863f-11ea-847b-3ed829fd5503.png\" width=\"45%\"\u003e\u003c/img\u003e\u003cbr /\u003e\u003cimg src=\"https://user-images.githubusercontent.com/567842/80217079-6132c400-863f-11ea-9789-8633897ef317.png\" width=\"45%\" style=\"margin-right: 20px;\"\u003e\u003c/img\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003cimg src=\"https://user-images.githubusercontent.com/567842/80217078-609a2d80-863f-11ea-9b49-c891985de924.png\" width=\"45%\"\u003e\u003c/img\u003e \n\nUsage\n------\n\n[**Fire-and-forget tasks**](https://www.jobrunr.io/en/documentation/background-methods/enqueueing-jobs/)\n\nDedicated worker pool threads execute queued background jobs as soon as possible, shortening your request's processing time.\n\n```java\nBackgroundJob.enqueue(() -\u003e System.out.println(\"Simple!\"));\n```\n\n[**Delayed tasks**](https://www.jobrunr.io/en/documentation/background-methods/scheduling-jobs/)\n\nScheduled background jobs are executed only after a given amount of time.\n\n```java\nBackgroundJob.schedule(Instant.now().plusHours(5), () -\u003e System.out.println(\"Reliable!\"));\n```\n\n[**Recurring tasks**](https://www.jobrunr.io/en/documentation/background-methods/recurring-jobs/)\n\nRecurring jobs have never been simpler; just call the following method to perform any kind of recurring task using the [CRON expressions](http://en.wikipedia.org/wiki/Cron#CRON_expression).\n\n```java\nBackgroundJob.scheduleRecurrently(\"my-recurring-job\", Cron.daily(), () -\u003e service.doWork());\n```\n\n**Process background tasks inside a web application…**\n\nYou can process background tasks in any web application and we have thorough support for [Spring](https://spring.io/) - JobRunr is reliable to process your background jobs within a web application.\n\n**… or anywhere else**\n\nLike a Spring Console Application, wrapped in a docker container, that keeps running forever and polls for new background jobs.\n\nSee [https://www.jobrunr.io](https://www.jobrunr.io) for more info.\n\nInstallation\n------------\n \n #### Using Maven?\n \n JobRunr is available in Maven Central - all you need to do is add the following dependency:\n \n ```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003eorg.jobrunr\u003c/groupId\u003e\n    \u003cartifactId\u003ejobrunr\u003c/artifactId\u003e\n    \u003cversion\u003e${jobrunr.version}\u003c/version\u003e\n\u003c/dependency\u003e\n```\n \n #### Using Gradle?\n \nJust add the dependency to JobRunr:\n ```groovy\nimplementation 'org.jobrunr:jobrunr:${jobrunr.version}'\n```\n\nConfiguration\n------------\n#### Do you like to work Spring based?\n\nAdd the [*jobrunr-spring-boot-3-starter*](https://search.maven.org/artifact/org.jobrunr/jobrunr-spring-boot-3-starter) to your dependencies and you're almost ready to go! Just set up your `application.properties`:\n\n```\n# the job-scheduler is enabled by default\n# the background-job-server and dashboard are disabled by default\njobrunr.job-scheduler.enabled=true\njobrunr.background-job-server.enabled=true\njobrunr.dashboard.enabled=true\n```\n\n#### Or do you prefer a fluent API?\nDefine a `javax.sql.DataSource` and put the following code on startup:\n\n```java\n@SpringBootApplication\npublic class JobRunrApplication {\n\n    public static void main(String[] args) {\n        SpringApplication.run(JobRunrApplication.class, args);\n    }\n\n    @Bean\n    public JobScheduler initJobRunr(DataSource dataSource, JobActivator jobActivator) {\n        return JobRunr.configure()\n                .useJobActivator(jobActivator)\n                .useStorageProvider(SqlStorageProviderFactory\n                          .using(dataSource))\n                .useBackgroundJobServer()\n                .useDashboard()\n                .initialize().getJobScheduler();\n    }\n}\n```\n## Contributing\n\nSee [CONTRIBUTING](https://github.com/jobrunr/jobrunr/blob/master/CONTRIBUTING.md) for details on submitting patches and the contribution workflow.\n\n### How can I contribute?\n* Take a look at issues with tag called [`Good first issue`](https://github.com/jobrunr/jobrunr/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22)\n* Join the discussion on [Github discussion](https://github.com/jobrunr/jobrunr/discussions) - we won't be using Gitter anymore.\n* Answer questions on [issues](https://github.com/jobrunr/jobrunr/issues).\n* Fix bugs reported on [issues](https://github.com/jobrunr/jobrunr/issues), and send us pull request.\n\n### How to build?\n* `git clone https://github.com/jobrunr/jobrunr.git`\n* `cd jobrunr`\n* `cd core/src/main/resources/org/jobrunr/dashboard/frontend`\n* `npm i`\n* `npm run build`\n* `cd -`\n* `./gradlew publishToMavenLocal`\n\nThen, in your own project you can depend on `org.jobrunr:jobrunr:1.0.0-SNAPSHOT`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjobrunr%2Fjobrunr","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjobrunr%2Fjobrunr","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjobrunr%2Fjobrunr/lists"}