<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Matteo Rossi on foojay.io - Friends of OpenJDK</title><link>https://foojayio.github.io/website/today/author/matteo-rossi/</link><description>Articles written by Matteo Rossi on foojay.io - Friends of OpenJDK</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Mon, 29 Jun 2026 09:40:40 +0000</lastBuildDate><atom:link href="https://foojayio.github.io/website/today/author/matteo-rossi/index.xml" rel="self" type="application/rss+xml"/><item><title>Building an AI-Powered Operations Assistant with Spring AI and MongoDB Atlas — Part 3: Stateful Workflows and Human-in-the-Loop</title><link>https://foojayio.github.io/website/today/building-an-ai-powered-operations-assistant-with-spring-ai-and-mongodb-atlas-part-3-stateful-workflows-and-human-in-the-loop/</link><pubDate>Mon, 29 Jun 2026 09:40:40 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-an-ai-powered-operations-assistant-with-spring-ai-and-mongodb-atlas-part-3-stateful-workflows-and-human-in-the-loop/</guid><description>&lt;p&gt;This is the third and final article in the series. &lt;a href="https://foojayio.github.io/website/today/building-an-ai-powered-operations-assistant-with-spring-ai-and-mongodb-atlas-part-1-rag-foundation/"&gt;Part 1&lt;/a&gt;
 covered the RAG foundation &amp;mdash; loading runbooks into a vector store and grounding model answers in real documentation. &lt;a href="https://foojayio.github.io/website/today/building-an-ai-powered-operations-assistant-with-spring-ai-and-mongodb-atlas-part-2-conversational-memory/"&gt;Part 2&lt;/a&gt;
 added short-term and long-term conversational memory. This article introduces stateful workflow checkpointing, tool calls, and a pause/resume mechanism that lets multi-step investigations survive session boundaries.&lt;/p&gt;
&lt;h2 id="h2-0-the-remaining-gap"&gt;The Remaining Gap&lt;/h2&gt;
&lt;p&gt;Where were we? At the end of &lt;a href="https://foojayio.github.io/website/today/building-an-ai-powered-operations-assistant-with-spring-ai-and-mongodb-atlas-part-2-conversational-memory/"&gt;Part 2&lt;/a&gt;
 of our tutorial, we have an assistant capable of sustaining a conversation consisting of multiple exchanges and remembering the information exchanged across multiple sessions. For example, an operator can ask multiple questions regarding a CPU spike alert and will receive responses from the assistant that build upon one another, taking into account their preferences or past choices. In fact, across all sessions, the assistant will remember when the operator expressed a preference for using Helm charts for rollback operations and the fact that the payments service runs on a Kubernetes infrastructure consisting of 16 pods.&lt;/p&gt;</description></item><item><title>Building an AI-Powered Operations Assistant with Spring AI and MongoDB Atlas — Part 2: Conversational Memory</title><link>https://foojayio.github.io/website/today/building-an-ai-powered-operations-assistant-with-spring-ai-and-mongodb-atlas-part-2-conversational-memory/</link><pubDate>Wed, 10 Jun 2026 19:23:46 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-an-ai-powered-operations-assistant-with-spring-ai-and-mongodb-atlas-part-2-conversational-memory/</guid><description>&lt;p&gt;This is the second article in a three-part series. Part 1 covered the RAG foundation &amp;mdash; loading runbooks into a vector store and wiring them to a language model. Part 3 will introduce stateful workflow checkpointing with pause and resume.&lt;/p&gt;
&lt;h2 id="h2-0-the-problem-with-stateless-chat"&gt;The Problem with Stateless Chat&lt;/h2&gt;
&lt;p&gt;In the first part of the series, we successfully created a chat interface where an operator can ask questions and receive answers based on the actual content of the runbooks they have uploaded and embedded in the system. For example, they can ask in the chat, &amp;ldquo;&lt;em&gt;What should I check when my server&amp;rsquo;s CPU usage exceeds 80%?&lt;/em&gt;&amp;rdquo; and the assistant retrieves the relevant sections from the various runbooks and assembles a coherent and concrete response.&lt;/p&gt;</description></item><item><title>Building an AI-Powered Operations Assistant with Spring AI and MongoDB Atlas — Part 1: RAG Foundation</title><link>https://foojayio.github.io/website/today/building-an-ai-powered-operations-assistant-with-spring-ai-and-mongodb-atlas-part-1-rag-foundation/</link><pubDate>Thu, 07 May 2026 19:22:11 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-an-ai-powered-operations-assistant-with-spring-ai-and-mongodb-atlas-part-1-rag-foundation/</guid><description>&lt;p&gt;This is the first article in a three-part series. Part 2 covers short-term and long-term memory; Part 3 introduces stateful workflow checkpointing with pause/resume.&lt;/p&gt;
&lt;h2 id="h2-0-the-problem"&gt;The problem&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s 2 a.m. Suddenly, an alert pops up indicating abnormal CPU usage on the payment services. The on-call engineer opens their laptop, logs into the monitoring dashboards, and begins the hunt. One by one, he searches the runbooks on Confluence, checks the Slack chats, and opens the GitHub wikis and documents shared during the design phase. By the time he finds any useful information, ten minutes have already passed.&lt;/p&gt;</description></item><item><title>Large-Scale ETL Pipeline Architecture</title><link>https://foojayio.github.io/website/today/large-scale-etl-pipeline-architecture/</link><pubDate>Fri, 01 May 2026 19:23:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/large-scale-etl-pipeline-architecture/</guid><description>&lt;p&gt;Modern data-driven systems. ETL pipelines are no longer simply scheduled background processes that run silently overnight, one after another. They are the backbone of real-time analytics, powering operational dashboards and recommendation systems. They enable machine learning workflows.&lt;/p&gt;
&lt;p&gt;This evolution, while creating enormous benefits, has&amp;mdash;with the increase in data volume and the decrease in latency tolerance&amp;mdash;called into question the traditional sequential ETL approach. A bottleneck for the speed is now required.&lt;/p&gt;</description></item><item><title>Distributed Cache Invalidation Patterns</title><link>https://foojayio.github.io/website/today/distributed-cache-invalidation-patterns/</link><pubDate>Tue, 21 Apr 2026 13:52:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/distributed-cache-invalidation-patterns/</guid><description>&lt;p&gt;Caching is one of the most powerful tools developers have at their disposal for optimizing application performance. Caching systems can significantly reduce latency and reduce the load on databases or external systems by storing frequently accessed data as close as possible to the application layer. The result? Improved responsiveness and overall system usability.&lt;/p&gt;
&lt;p&gt;In small monolithic applications, cache management is usually very simple. A service retrieves data from a database, stores it in memory, and fulfills subsequent requests by retrieving the data directly from the cache. When the data changes, the cache key is invalidated or updated.&lt;/p&gt;</description></item><item><title>Building Reactive Data Streams with Project Reactor</title><link>https://foojayio.github.io/website/today/building-reactive-data-streams-with-project-reactor/</link><pubDate>Thu, 19 Mar 2026 15:13:31 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-reactive-data-streams-with-project-reactor/</guid><description>&lt;h2 id="h2-0-creating-non-blocking-streaming-endpoints-for-high-throughput-applications"&gt;Creating Non-Blocking Streaming Endpoints for High-Throughput Applications&lt;/h2&gt;
&lt;p&gt;There are problems that only occur in production. Or rather, we only notice them in production.&lt;/p&gt;
&lt;p&gt;We have created an application that exposes clean APIs, according to all standards. You have modeled the domain elegantly and efficiently: all load tests show reassuring data. CPU usage is reasonable, to say the least. However, there is a problem: when traffic exceeds a threshold, the system slows down. Response time latency becomes inconsistent; threads stack up on top of each other. Response times increase unpredictably, and application customers begin to complain about this situation.&lt;/p&gt;</description></item><item><title>Role-Based Access Control in Java Applications</title><link>https://foojayio.github.io/website/today/role-based-access-control-in-java-applications/</link><pubDate>Thu, 05 Mar 2026 20:31:49 +0000</pubDate><guid>https://foojayio.github.io/website/today/role-based-access-control-in-java-applications/</guid><description>&lt;p&gt;We often work with Java applications where security begins and ends with authentication. The JWT token is validated, Spring Security is integrated, and an identity provider is added, thinking that this type of configuration is sufficiently secure.&lt;/p&gt;
&lt;p&gt;The real problem is that authentication only answers one question: who are you? In real applications, we also have to answer another question, which is often more complex and more dangerous to get wrong: what are you allowed to do?&lt;/p&gt;</description></item><item><title>Ports and Adapters in Java: Keeping Your Core Clean</title><link>https://foojayio.github.io/website/today/ports-and-adapters-in-java-keeping-your-core-clean/</link><pubDate>Thu, 19 Feb 2026 16:13:59 +0000</pubDate><guid>https://foojayio.github.io/website/today/ports-and-adapters-in-java-keeping-your-core-clean/</guid><description>&lt;h2 id="h2-0-introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;If we want to evolve our Java system over time, architecture is more important than the choice of framework. Very often, teams realize too late that what was supposed to be a simple persistence layer at the beginning ended up influencing and overwhelming the entire application design. MongoDB annotations end up in domain models, repository abstractions mirror collections, and business logic becomes an integral part of the infrastructure.&lt;/p&gt;
&lt;p&gt;Hexagonal architecture, also known as Ports and Adapters, offers an architectural model that aims to avoid this problem. It involves the correct attribution of responsibilities to the various application layers. It encourages us to consider external systems (databases, message brokers, HTTP APIs, MCP servers) as details rather than pillars at the center of our design.&lt;/p&gt;</description></item><item><title>Reactive Java with Project Reactor</title><link>https://foojayio.github.io/website/today/reactive-java-with-project-reactor/</link><pubDate>Tue, 10 Feb 2026 14:32:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/reactive-java-with-project-reactor/</guid><description>&lt;p&gt;&lt;strong&gt;Introduction: Why Reactive Java Still Matters&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Over the past decade, the Java ecosystem has gradually abandoned the idea that increasing the number of threads is the scalable solution to growing load. Cloud-native implementations, containerized workloads, and high-I/O applications have highlighted the inefficiencies of the traditional synchronous thread-per-request model.&lt;/p&gt;
&lt;p&gt;Reactive programming is not a panacea, a miracle solution. Certainly, it does not make applications &amp;ldquo;faster&amp;rdquo; by default. What it offers, when applied correctly, is the ability to predict behavior under load, better resource utilization, and explicit control over data flow. For systems that handle high concurrency, streaming data, or variable traffic patterns, these characteristics are hugely relevant.&lt;/p&gt;</description></item><item><title>GraphQL for Java Developers: Building a Flexible Data Layer</title><link>https://foojayio.github.io/website/today/graphql-for-java-developers-building-a-flexible-data-layer/</link><pubDate>Tue, 03 Feb 2026 15:43:07 +0000</pubDate><guid>https://foojayio.github.io/website/today/graphql-for-java-developers-building-a-flexible-data-layer/</guid><description>&lt;p&gt;For many years, REST has been the standard architectural style for creating APIs in the Java ecosystem. Frameworks such as Spring MVC and, more recently, Spring WebFlux make it easy to expose HTTP endpoints with the REST paradigm, supported by well-structured service layers. In many cases, this model works well and serves as the basis for numerous enterprise solutions.&lt;/p&gt;
&lt;p&gt;However, as applications grow and frontend requirements become more dynamic, REST-based APIs are beginning to show their limitations. Multiple endpoints that return rigid DTOs often lead to over-fetching, under-fetching, and a proliferation of specialised endpoints created to meet slightly different customer needs. Over time, APIs become more difficult to evolve without introducing radical changes.&lt;/p&gt;</description></item></channel></rss>