Traces, Tempo and the LGTM stack
Auto-instrumenting Spring Batch 6 with OpenTelemetry — four silent failures
Wiring Spring Boot 4 + Spring Batch 6 to emit job/step traces into Tempo and spring_batch_* metrics into Prometheus — and the four config traps that each failed the same way: green build, zero errors, nothing exported.
26 Aug 2026
·
5 min read
From Java to Python
Learning Python as a Java Dev: My On-Ramp to AI
I'm a Spring/Kafka backend engineer who could read Python but never wrote it. The AI world pulled me in, so I learned it by building a 10-lesson course that maps every concept back to Java, then built the tutor agent that taught me.
19 Aug 2026
·
4 min read
Spring and Java mechanics
Four phases, and the one that never runs at all
What @TransactionalEventListener actually fires on commit, on rollback, and on neither -- plus a write inside AFTER_COMMIT that survives or vanishes depending on your connection pool. Measured in a playground, not quoted from the Javadoc.
4 Aug 2026
·
7 min read
Spring and Java mechanics
publishEvent() is a method call, not a queue
Spring's plain @EventListener runs on your thread, inside your transaction, before your next line — and a chained event is fully handled before the original finishes. Everything here was verified by running it, not by reading the reference page.
3 Aug 2026
·
7 min read
Spring and Java mechanics
Spring events that survive a crash
A fire-and-forget @Async listener turns every SMTP hiccup into a lost message. Here is how @TransactionalEventListener plus an event publication table makes it durable — and the four ways that setup silently does nothing.
2 Aug 2026
·
7 min read
Building agents on the JVM with Embabel
·
Part 10
One mistake, three failures: named bindings in Embabel
When an Embabel action needs two objects of the same type, binding becomes two declarations that must agree — and nothing cross-checks them. Get them out of step and you get a startup exception, an unreachable goal, or a confident wrong answer, depending on which half you forgot.
31 Jul 2026
·
5 min read
Building agents on the JVM with Embabel
·
Part 9
The second run is cheaper: what an Embabel Context actually buys you
Ask the same question twice in one session and the planner drops a step. Not a cache — a consequence of A* refusing to schedule an action whose output is already on the blackboard, for better and for worse.
31 Jul 2026
·
6 min read
Building agents on the JVM with Embabel
·
Part 7
The condition nothing could satisfy: custom @Condition gates in Embabel
My agent refused to run a single action. The @Condition gate was FALSE and nothing in the agent could ever make it TRUE, because Embabel builds an action's effects from what you declare, not from what your condition reads.
28 Jul 2026
·
7 min read
Building agents on the JVM with Embabel
·
Part 6
The Silent No-Op: Exposing Embabel Agents Over MCP
Turning my JVM agents into MCP tools took one dependency and one annotation. It also took three silent failures -- a starter that suppresses the web server, a shell that eats your CLI flags, and an annotation default that publishes exactly zero tools without telling you.
26 Jul 2026
·
7 min read
Building agents on the JVM with Embabel
·
Part 3
Give the Agent Hands: Tools in Embabel
An LLM cannot know a live account balance, and in banking a confidently hallucinated number is a disaster. The fix is a tool. Here's how @LlmTool works in Embabel on the JVM, plus the one API gotcha that cost me a compile.
25 Jul 2026
·
5 min read