1. Operational Context & Challenge
A high-throughput factory automation facility relied on an established monolithic Java application to orchestrate production lines, track work-in-progress components, and generate critical engineering audit reports. Over years of operation, accumulated undocumented domain rules and tight coupling with legacy SQL schemas had made updates high-risk and slowed releases.
2. Monolithic Architectural Vulnerabilities
- Tight Module Coupling: Modifications to reporting routines risked side-effects in real-time line control sequences.
- Absence of Automated Verification: Releases required exhaustive manual floor verification against physical hardware.
- Environmental Inconsistencies: Local developer build environments suffered from drift relative to factory servers.
3. Incremental Modernization Strategy
Rather than attempting a complete rewrite, Ugur followed an evolutionary Domain-Driven Design (DDD) modernization path:
- Characterization Test Coverage: Wrote automated integration tests to lock down and verify existing complex calculation routines before altering code.
- Bounded Context Isolation: Separated Order Processing, Floor Monitoring, and Reporting contexts away from database details.
- Spring Boot & OpenAPI Migration: Transitioned monolithic routines into modular Spring Boot services with OpenAPI documentation.
- Docker Containerization: Implemented standardized Docker images, eliminating environment discrepancies across staging and plant servers.
Components and boundaries
The starting point was a Java monolith connected to MS SQL Server. The work separated order processing, floor monitoring and reporting logic from persistence details, moving routines towards Spring Boot modules with documented APIs. Docker supplied reproducible environment images. Defining a module boundary preceded moving it: changing frameworks without clarifying those boundaries would retain the coupling.
4. Technical changes and monitoring
What the Naples-to-Turin ping measured
Monitoring used a ping command from Naples to a PC in Turin, observing response latency in milliseconds and network reachability. An ICMP response establishes that the destination responds to that check; it does not establish that reports are correct, transactions succeed or the production line is operating. Quantifying those outcomes requires application checks and production records with a defined observation window and failure criteria.
5. Engineering Takeaways
Modernizing legacy software that production depends on requires respect for existing business logic and disciplined architectural boundaries. Domain boundaries and tests help verify changes; operational continuity needs measurements suited to the actual process.
6. Frequently Asked Questions on This Project
What were the primary engineering constraints before modernizing this industrial software? ▾
The plant operated around the clock (24/7) on a monolithic Java backend tightly coupled to a legacy MS SQL relational database. Any production downtime would halt physical assembly lines, completely ruling out high-risk "Big Bang" rewrites.
How was operational continuity managed during the migration? ▾
Ugur documented I/O flows with characterization tests before changing the application. The new Spring Boot service and the monolith ran in parallel using the Strangler Fig pattern and Docker. Ping monitoring from Naples to a PC in Turin observed network reachability and latency; it does not establish application availability or production-line downtime.
Which technical changes does this project document? ▾
The project documents characterization tests, separation of business contexts, Spring Boot modules with documented APIs, and Docker images for reproducible environments. Ping latency is a network measurement; it cannot quantify report-development speed or production-line downtime.
Have a legacy Java system requiring modernization?
See our service for modernizing legacy Java applications, including assessment and incremental migration planning.