A word on recent Slf4j and Spring incompatibility
Slf4j is a popular logging facade for Java ecosystem. It separates libraries from the logging backend by providing a common logging API. It is the developer who picks up the actual backend. This setup has been working great for years. Many developers have already forgotten, how shattered the world of Java was in its early […]
How to share Gradle version catalogs between projects
Gradle version catalogs are a new feature of Gradle build system. They help managing dependency versions in the projects. In the previous article, we explored how to use them locally. This time, we are going to learn, how to share a single version catalog between many projects. This may be useful for teams that own […]
Manage your dependencies with Gradle version catalogs
Since the very beginning, Gradle build system relied on Maven artifacts for managing dependencies and their versions. It was a good move from the adoption point of view (access to large library repositories). However, it also meant that for a long time, Gradle lacked a couple of very useful native features. A central place for […]
Immutable classes in Java and Kotlin
If we write code that runs on more than one thread, sooner or later we meet the idea of immutable classes. The lack of ‘write’ functions makes them very useful in multi-threaded applications. In this article I’m going to show what immutable classes are in Java and Kotlin. We will also look at the practical […]
Java records vs Kotlin data classes
Records and data classes are two very similar types of classes in Java and Kotlin. Despite almost the same look and feel, there are also a couple of differences between them. Recently, I had a chance to try out records after writing exclusively in Kotlin for almost a year. In this article I would like […]
Backpressure in reactive streams: a closer look
The backpressure is an important property of reactive streams. In simple words, it ensures us that the publishers do not produce new elements faster than we can process them. In this way, we avoid overloading our system. Over years, I noticed that many newcomers to the reactive world have trouble with understanding how backpressure affects […]
Creating batches with Project Reactor
Imagine an event processing service that consumes application events from a queue. It works well until one day, when it starts lagging. Events are processed with large delays, and the queues fill up. What happens? Most likely we experience a sudden spike of events and our service is not able to catch up. In this […]