This is the story about JobRunr, a distributed background job processing framework for Java and JobRunr Pro a drop-in replacement which adds extra features like Queues, Atomic batches, job chaining and more.
You can read part 1 here. Part 2 comes almost 2 years later (rather 950 GitHub stars later). What a crazy ride it has been!
Some history
So, on the 4th of September 2020, I blogged for the first time how it was to start a freemium developer product in the Java world. Back then, I hadn’t sold a single Pro license and although I had some users liking my product, I started of with only 19 unique downloads per month. That same week saw also the release of JobRunr 1.0.0 with the jobrunr-spring-boot-starter
integration.
As I could not live forever without any income, I took on another contracting role but In my spare time (mostly evenings, weekends and holidays), I kept on working on JobRunr. Below you will find the journey from September 2020 until today.
October 2020
October 2020 saw the first contribution of a Spring Core Contributor, Stéphane Nicoll (how cool is that!) and in release v1.1.0 I made some improvements when Jobs are not found anymore due to refactoring in your code. As of then, a message is shown in the dashboard if one of your scheduled jobs does not exist in your code.
November 2020 - my first customer!
Then, in November 2020 it finally happened: I was contacted by KomaK with the request to add support for DocumentDB and it resulted in my first sold license. Thanks, KomaK for the trust! It resulted in the first 25 trees being planted.
January 2021 - JobRunr featured on Oracle Blog!
In January 2021, a tutorial on how to use JobRunr was featured in Oracle Java Magazine, the Java resource for developers worldwide. I quickly found out how warm and welcoming the Java community is and I want to take this opportunity to thank Alan Zeichick, the editor in chief of Oracle Java Magazine. Colleagues who knew I was working on JobRunr, reached out and told me about the Oracle article - it was fun to see and gather all the feedback.
February 2021 - the release called Made In Germany
As I had some concurrency issues that were hard to track down, I added a feature in JobRunr that automatically suggests to create a Github issue in case such a concurrency issue happened. It allowed me to track down these difficult and nasty bugs and it helped me to improve JobRunr even more.
April 2021 until July 2021 - a lot of releases!
In April 2021 I released JobRunr 2.0.0 - it was a breaking release as I added support for Kotlin and the argument order when creating jobs changed. JobRunr 3.x was released and I added the option to search for Jobs in the JobRunr Pro dashboard.
But I noticed something changing: the amount of downloads from JobRunr kept on rising month after month and I had 2800 unique downloads in July 2021!
August 2021 - my second customer!
Only 10 months (🤣) after my first customer, I was contacted by ECG inc and they were also interested in a JobRunr Pro license. It was an easy sell as they needed a specific JobRunr Pro feature and it resulted in another 75 planted trees.
September 2021 - JobRunr 4.0.0, the biggest release since JobRunr 1.0.0
During my holidays (COVID was still a thing and travel was still a hassle), I continued to work on JobRunr and JobRunr Pro and it resulted in one of the best releases. A lot of improvements were done:
- Job Analysis Performance Mode: thanks to some smart caching, Job Analysis is now faster than ever
- JobRequest and JobRequestHandler: this release introduced the JobRequest and JobRequesthandler. It was a new way to create jobs using the command / commandhandler pattern (meaning you can use objects instead of lambda’s to create background jobs). I added it after feedback from users on Reddit.
- Integration with other frameworks: the Spring Boot Integration was improved and support for Micronaut and Quarkus was added.
September until December 2021 - small & incremental improvements
From September 2021 I worked less on JobRunr as I took on a new role as the CTO of a startup, Ventory. However, the usage of JobRunr kept on growing and Josh Long aka starbuxman wrote about JobRunr in his weekly newsletter ‘This week in Spring!’. It didn’t take long before I was invited for his great podcast series - a Bootiful Podcast. And that same night, we started pairing and added Spring Native support to JobRunr. Again this showed me how warm and welcoming the whole Spring Boot and Java community is!
January until May 2022 - JobRunr 5.0.0
After working hours, I continued making improvements to both JobRunr and JobRunr Pro and March 2022 saw the release of JobRunr and JobRunr Pro 5.0.0. Some highly anticipated features were added to JobRunr Pro like a Spring Boot Transaction plugin, instant job processing, updating of jobs and an improved dashboard. More companies reached out and I was able to sell 6 more licenses. As I care about our planet, this resulted in 950 new trees being planted!
May 2022 - Spring.io!
The crazy ride continued and I was invited to speak at Spring.io Barcelona before an audience of 250 people. I had a blast presenting JobRunr and I also received a lot of nice feedback. Mental note: if you will do live coding on stage, do practice with presenter mode
in Intellij :-).
Where are we in June 2022
On June 10, I received 1000 GitHub stars!
If I compare my Google analytics from 2020 to 2022, there also definitely an increase:
And the unique downloads via Maven Central has also boomed:
JobRunr tends to work well for long projects as JobRunr 1.x is about 10% of the unique downloads today:
Going forward
As the project is growing, it’s time to do some governance. I don’t want to be a project where the bus factor is 1. That’s why I have recently onboarded Renaud Bernon, another great developer who will be maintaining JobRunr and JobRunr Pro together with me. Welcome Renaud!
Last but not least…
I would like to thank all the JobRunr Pro customers and amazing people that helped on JobRunr - without them, JobRunr would not be the product it is now.
Thanks Renaud, for embarking on this adventure together with me!
Thanks Josh, for pairing with me with during christmas holidays!
Thanks Sergi, for giving me the opportunity to speak on Spring.io!
Thanks Michael, for following the JobRunr repo so dilligent and writing about JobRunr on each minor release.
Thanks Alan, for having articles about JobRunr in @OracleJavaMag.
Thanks Eugen and Yong for publising the articles about JobRunr.
Thanks Carson, for pairing with me and searching for the Redis support in JobRunr.
Thanks Graham and Bilal, for searching for that one difficult issue together with me!
Thanks Sazzadul, for helping me with the Redis integration!
Thanks Dat, Pat and David, for believing in the product and your awesome feedback.
And of course all the contributors:
Thanks Eddú, for the help with the awesome TestContainers!
Thanks Gilberto, for the great discussion and PR you created.
Thanks Dawie, for adding support for interval in the @Recurring
annotation.
Thanks Pixnbit, for helping with the transactions in Micronaut.
Thanks Kevin, for adding support for multiple datasources.
Thanks Jeremy, for helping with the docs.
Thanks Sunyoung, for helping with internationalization in the Dashboard.
Thanks Daniela, for adding support for interval in recurring jobs! This was some great work!
Thanks Alexander, for making the exceptions more readable.
Thanks Anatolijs, for supporting table-prefixes
in MongoDB.
Thanks Pei-Tang, for all your help with recurring jobs.
Thanks Neil, for helping with the table name prefixes.
Thanks Benoît, for your help with the logging.
Thanks Damien, to make the dashbord secure.
Thanks Manfred, for improving the ArchUnit tests.
Thanks Ivan, for fixing one of the tests!
Thanks Jakub, for improving the Mongo integration!
Thanks Krisztián, for improving the Readme.
Thanks Stéphane, for improving the Spring Fluent API example.
Thanks Daniell, for making the dashboard port configurable.
Thanks Ziad, for cleaning up some of the code.
And I’m sure I’ve forgotten some people too, so also a big thank you for everybody that helped but that I forgot for some reason! Feel free to reach out and I’ll make sure I will add you to this list.
Thanks again,
Ronald