Spring Batch 6.1.0-RC1 (@JobParameter ve JdbcClient), Oracle JVM İlk Hata Teşhis Mimarisi (JFR/NMT) ve JetBrains PSI Tabanlı AI Ajanları
Spring Batch 6.1.0-RC1 ile gelen @JobParameter anotasyonu, MessageChannelPartitionHandler bellek optimizasyonu ve JdbcClient geçişi; Oracle JVM Area Lead Sandra Payne'in %1 altı ek yükle ilk üretim çöküşünü yakalayan JFR/NMT teşhis mimarisi ve Anton Arhipov'un açıkladığı JetBrains PSI semantik ajan altyapısı incelenmektedir.

Kurumsal Java Ekosisteminde Üç Kritik Güncelleme: Yığın İşleme, Üretim Kara Kutusu ve Semantik AI
Java ve Spring ekosisteminde 22–23 Ekim 2026 itibarıyla kurumsal üretim mimarilerini doğrudan ilgilendiren üç önemli gelişme yayımlanmıştır: Mahmoud Ben Hassine tarafından duyurulan ve Spring Framework 7.1 altyapısıyla hizalanan Spring Batch 6.1.0-RC1 (ve 6.0.6) sürümü; Oracle Java Platform Grubu JVM Alan Lideri Sandra Payne'in Inside.java üzerinde yayımladığı "İlk Hata Teşhisi" (First-Time Failure Diagnosis) üretim rehberi ve Java Champion Anton Arhipov ile Josh Long'un ele aldığı JetBrains IDE'lerinde PSI (Program Structure Interface) tabanlı otonom ajan mimarisi. Bu teknik bültende her üç gelişmenin mimari detayları ve üretim ortamı yapılandırmaları incelenmektedir.
1. Spring Batch 6.1.0-RC1 ve 6.0.6: @JobParameter, JdbcClient ve Bellek Optimizasyonu
Kurumsal finans, telekomünikasyon ve e-ticaret sistemlerinde milyonlarca kaydın yığın (batch) olarak işlenmesini üstlenen Spring Batch, 6.1.0-RC1 sürümüyle hem geliştirici ergonomisinde hem de dağıtık koordinatör düğümlerinin bellek tüketiminde köklü iyileştirmeler sunmaktadır.
A. @JobParameter ile Tip Güvenli Parametre Enjeksiyonu
Önceki sürümlerde @StepScope veya @JobScope bileşenlerine iş parametrelerini aktarmak için @Value("#{jobParameters['inputFile']}") gibi hataya açık ve çalışma zamanında çözümlenen SpEL (Spring Expression Language) ifadeleri kullanılmaktaydı. Spring Batch 6.1.0-RC1 ile gelen @JobParameter anotasyonu, SpEL zorunluluğunu ortadan kaldırarak parametre adını doğrudan metot parametresi veya sınıf alanı adından çıkarmakta ve tip dönüşümünü otomatik gerçekleştirmektedir.
B. MessageChannelPartitionHandler Bellek Şişmesi (Memory Bloat) Çözümü
Uzaktan bölümlendirilmiş (remote partitioned) yığın işlerinde yönetici (manager) düğüm, işçi (worker) düğümlerin durumunu periyodik olarak yoklarken (polling) veritabanından tüm JobExecution ve iç içe geçmiş StepExecution nesne grafiğini tekrar tekrar belleğe yüklemekteydi. Yüzlerce bölüm (partition) içeren işlerde koordinatör JVM'de OutOfMemoryError riskine yol açan bu darboğaz, Spring Batch 6.1.0-RC1'de yalnızca hedef adım durumlarını sorgulayan hafifletilmiş veri erişim katmanıyla giderilmiştir.
C. Yeni Okuyucu/İşleyici Bileşenleri ve JdbcClient Geçişi
JdbcClientAltyapısı: Spring Batch'in dahili meta-veri tablosu (BATCH_JOB_INSTANCE,BATCH_STEP_EXECUTIONvb.) DAO sınıfları klasikJdbcTemplateyerine modern, akıcı (fluent)JdbcClientAPI'sine taşınmıştır.DefaultChunkProcessor: Kullanımdan kaldırılan (deprecated)SimpleChunkProcessorsınıfının yerini almak üzere, standart adım (step) kapsamı dışındaki uzak yığın işçileri (remote chunking workers) için minimalDefaultChunkProcessoreklenmiştir.PageableItemReader& Kütüphaneden Bağımsız JSON Desteği: Sayfalı veri kaynaklarını okumayı basitleştirenPageableItemReader, uzak yığın yapılandırması içinRemoteChunkingManagerBuilderve belirli bir JSON kütüphanesine (Jackson/Gson) sıkı bağımlılık duymayanJsonLineMapperileJsonLineAggregatorbileşenleri kullanıma sunulmuştur.- Spring 2026 Ekosistem Hizalaması: Sürüm; Spring Framework 7.1.0-RC1, Spring Data 2026.1.0-RC1, Spring Integration 7.2.0-RC1, Spring Kafka 4.2.0-RC1, Spring AMQP 4.2.0-RC1 ve Micrometer 1.18.0-RC1 ile tam uyumlu hale getirilmiştir.
2. Oracle Inside.java: JVM’de "İlk Hata Teşhisi" (First-Time Failure Diagnosis) Mimarisi
Oracle JVM Alan Lideri Sandra Payne tarafından paylaşılan "What's Going Wrong with My JVM?! A Guide to First-Time Failure Diagnosis" çalışması, kurumsal yazılım mühendisliğindeki en maliyetli yanılgılardan birine odaklanmaktadır: Üretimde ilk kez karşılaşılan bir çöküş veya kilitlenme sonrasında hatayı test ortamında yeniden üretmeye (reproduce) çalışmak.
Üretim Verisi İkilemi (The Production Data Dilemma)
Dağıtık sistemlerde yarış durumları (race conditions), çekirdek seviyesindeki yerel bellek (off-heap/native memory) sızıntıları veya ani trafik sıçramaları altında oluşan GC duraksamaları test ortamında neredeyse hiçbir zaman birebir taklit edilememektedir. Geleneksel profilleyiciler ise yüksek CPU/bellek ek yükü nedeniyle üretimde kapalı tutulmakta; sonuçta ilk çöküş anında eldeki tek veri yetersiz uygulama günlükleri olmaktadır.
flowchart LR
subgraph ProdJVM["Üretim JVM Konteyneri (<%1 Ek Yükle Sürekli Açık Kara Kutu)"]
direction TB
JFR["JDK Flight Recorder (JFR)<br/>disk=true, maxage=24h, dumponexit=true"]
NMT["Native Memory Tracking (NMT)<br/>-XX:NativeMemoryTracking=summary"]
OOM["OOM & Çöküş Kancaları<br/>HeapDumpOnOutOfMemoryError & ErrorFile"]
end
Crash(["İlk Üretim Hatası / OOM / SIGSEGV"]) --> ProdJVM
ProdJVM --> Artifact["Otomatik Teşhis Paketi:<br/>1. flight_recording.jfr<br/>2. java_pid.hprof<br/>3. hs_err_pid.log + NMT Raporu"]
Artifact --> RootCause(["Yeniden Üretime Gerek Kalmadan<br/>Deterministik Kök Neden Analizi"])
Sıfıra Yakın Ek Yükle İlk Hatayı Yakalayan JVM Bayrak Seti
Oracle rehberi, her üretim JVM konteynerinde ilk günden itibaren standart olarak açık tutulması gereken dört temel "kara kutu" mekanizmasını tanımlamaktadır:
| Teşhis Katmanı | Önerilen Üretim JVM Bayrağı | CPU / Bellek Ek Yükü | Yakaladığı Kritik Kök Neden |
|---|---|---|---|
| Sürekli JFR Halka Tamponu | -XX:StartFlightRecording=disk=true,maxage=24h,maxsize=1g,dumponexit=true |
<%1 CPU | GC duraksamaları, kilit çekişmesi (lock contention), I/O darboğazları, CPU zirveleri |
| Yerel Bellek İzleme (NMT) | -XX:NativeMemoryTracking=summary (jcmd VM.native_memory ile okunur) |
~%1–2 Bellek | Yığın dışı (Off-Heap / DirectByteBuffer / JNI / Metaspace / Thread stack) sızıntıları |
| OOM Yığın Dökümü | -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/jvm/ |
%0 (Yalnızca OOM Anında) | Bellek sızıntısına yol açan baskın nesne ağaçları (Dominator Tree) |
| Birleşik GC ve Hata Günlüğü | -Xlog:gc*,safepoint:file=/var/log/jvm/gc.log:time,uptime:filecount=5,filesize=20M |
<%0,5 CPU | Safepoint gecikmeleri (Time-To-Safepoint), humongous tahsisatlar, ZGC/G1 döngüleri |
Bu yapılandırma sayesinde konteyner beklenmedik şekilde sonlandığında dahi kalıcı birime (/var/log/jvm) yazılan .jfr, .hprof ve hs_err_pid.log dosyaları, hatayı yeniden üretmeye gerek bırakmadan ilk seferde kök nedeni ortaya koymaktadır.
3. JetBrains IDE’lerinde AI Geliştirme: Program Structure Interface (PSI) vs. Saf RAG
A Bootiful Podcast yayınına konuk olan JetBrains Developer Advocate ve Java Champion Anton Arhipov, Josh Long ile gerçekleştirdiği teknik söyleşide kurumsal Java projelerinde kodlama ajanlarının (JetBrains Junie ve JetBrains Air) neden harici metin tabanlı RAG (Retrieval-Augmented Generation) araçlarından farklı bir mimariye ihtiyaç duyduğunu detaylandırmıştır.
Neden Saf Vektör RAG Büyük Java Monorepo’larında Yetersiz Kalır?
Standart AI kod asistanları kaynak dosyalarını sabit boyutlu metin parçalarına (chunking) bölerek vektör benzerliği (cosine similarity) ile arama yapmaktadır. Ancak yüzlerce modüllü bir Spring Boot projesinde bir arayüzün (interface) hangi @Service veya @Bean tarafından enjekte edildiğini, @Transactional sınırlarının nerede kırıldığını veya tip hiyerarşisini salt metin benzerliğiyle bulmak yüksek halüsinasyon üretmektedir.
JetBrains PSI (Program Structure Interface) Semantik Avantajı
- Deterministik AST ve Sembol Grafiği: IntelliJ IDEA'nın çekirdeğini oluşturan PSI, projenin tamamını canlı bir Soyut Sözdizimi Ağacı (AST) ve semantik indeks olarak bellekte tutmaktadır. Ajan, vektör araması yapmak yerine doğrudan IDE'nin "Find Usages", "Call Hierarchy" ve "Type Migration" motorlarını araç (tool) olarak çağırmaktadır.
- Anlık Statik Analiz Geri Beslemesi: Modelin ürettiği her kod yaması, diske yazıldığı anda IntelliJ'nin yerleşik denetçileri (inspections) ve derleyici modeli tarafından doğrulanmakta; kırılan referanslar kullanıcıya gösterilmeden önce ajan döngüsü içinde otomatik olarak onarılmaktadır.
4. Kurumsal Uygulama: Spring Batch 6.1 @JobParameter ve JFR Teşhis Entegrasyonu
Aşağıdaki örnek, Spring Batch 6.1.0-RC1'in yeni @JobParameter anotasyonunu, JsonLineMapper bileşenini ve adım tamamlandığında yüksek gecikme tespit edilirse otomatik JDK Flight Recorder (JFR) anlık görüntüsü (snapshot) alan teşhis dinleyicisini bir arada göstermektedir:
package com.tastutanlabs.batch;
import jdk.jfr.FlightRecorder;
import jdk.jfr.Recording;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.StepExecutionListener;
import org.springframework.batch.core.configuration.annotation.StepScope;
import org.springframework.batch.core.scope.context.JobParameter;
import org.springframework.batch.item.file.FlatFileItemReader;
import org.springframework.batch.item.file.builder.FlatFileItemReaderBuilder;
import org.springframework.batch.item.file.mapping.JsonLineMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.FileSystemResource;
import java.nio.file.Path;
import java.time.Duration;
import java.util.Map;
@Configuration
public class DiagnosticBatchConfig {
/**
* Spring Batch 6.1.0-RC1: SpEL (@Value) yerine doğrudan tip güvenli @JobParameter kullanımı.
* Parametre adı ('inputFile') ve ('chunkThresholdMs') otomatik olarak eşleştirilir.
*/
@Bean
@StepScope
public FlatFileItemReader<Map<String, Object>> telemetryJsonReader(
@JobParameter String inputFile) {
return new FlatFileItemReaderBuilder<Map<String, Object>>()
.name("telemetryJsonReader")
.resource(new FileSystemResource(inputFile))
.lineMapper(new JsonLineMapper())
.build();
}
/**
* Oracle İlk Hata Teşhisi Mimarisi: Adım süresi eşiği aşarsa veya hata oluşursa
* sürekli çalışan JFR halka tamponunun anlık dökümü diske kaydedilir.
*/
@Bean
@StepScope
public StepExecutionListener jfrFirstFailureDiagnosticListener(
@JobParameter Long maxAllowedDurationMs) {
return new StepExecutionListener() {
@Override
public org.springframework.batch.core.ExitStatus afterStep(StepExecution stepExecution) {
long elapsedMs = Duration.between(
stepExecution.getStartTime(),
stepExecution.getLastUpdated()).toMillis();
boolean failedOrSlow = !stepExecution.getFailureExceptions().isEmpty()
|| elapsedMs > maxAllowedDurationMs;
if (failedOrSlow && FlightRecorder.isInitialized()) {
try (Recording snapshot = FlightRecorder.getFlightRecorder().takeSnapshot()) {
Path dumpPath = Path.of("/var/log/jvm/batch-step-" + stepExecution.getId() + ".jfr");
snapshot.dump(dumpPath);
} catch (Exception ignored) {
// Teşhis dökümü ana iş akışını kesintiye uğratmaz
}
}
return stepExecution.getExitStatus();
}
};
}
}
Sonuç
Kurumsal Java mimarilerinde Spring Batch 6.1.0-RC1, @JobParameter ve MessageChannelPartitionHandler optimizasyonlarıyla dağıtık yığın işlemeyi sadeleştirirken; Oracle'ın JFR + NMT İlk Hata Teşhisi standardı üretimdeki belirsiz çökmeleri tek seferde çözülebilir hale getirmektedir. Geliştirme aşamasında ise JetBrains PSI tabanlı semantik ajanlar, büyük ölçekli Spring projelerinde güvenli ve derleyici doğrulamalı kod dönüşümünün temelini oluşturmaktadır.
Yazılım mimarisi, mikroservis ekosistemleri ve üretken yapay zeka uygulamaları üzerine çalışıyorum. TastutanLabs çatısı altında geliştirici araçları ve SaaS ürünleri inşa ediyorum.
Bu analizin 6 kartlık görsel özetini Instagram'da inceleyin ve kaydedin
Her gün yazılım mimarisi, Java/JVM ve yapay zeka gelişmelerini kendi başına okunabilen 6 slaytlık Mini-Blog serileri halinde paylaşıyoruz.
Yorumlar (0)
Düşüncelerinizi Paylaşın
Henüz yorum yapılmamış. İlk yorumu siz yapın!
Bu Kategorideki Diğer İncelemeler
JDK 28’de Resmileşen JEP 543 (Structured Concurrency), JEP 546 Otonom ZGC Yığın Ölçekleme ve Spring AI Yerel Model Mimarisi
Inside.java’da JDK 28 için resmileşen JEP 543 (StructuredTaskScope ve Joiner<T, R, R_X>), manuel -Xmx ayarını ortadan kaldıran JEP 546 Adaptive ZGC, Spring Office Hours S5E26 yerel AI orkestrasyonu ve Mise ile geliştirici ortamı yönetiminin teknik analizi.
Reflect, Transform, Accelerate ile Java’da cuBLAS Seviyesi GPU Hesaplama, JBang ile Derlemesiz Spring MCP Servisleri ve Spring Boot 4.1 SSRF Kalkanı
Inside.java'da yayınlanan Devoxx Belgium 'Reflect, Transform, Accelerate' sunumuyla Java'dan NVIDIA Nsight ve cuBLAS seviyesinde GPU programlama, JBang ile tek dosyada derlemesiz Spring AI MCP sunucuları, atomik iddia doğrulaması ve Spring Boot 4.1 SSRF korumasının teknik analizi.
Project Valhalla, Leyden AOT ve Loom Aynı Sürümde Buluştu: JDK 28’de Resmileşen JEP 401, JEP 544 ve JEP 543 Mimarisi
OpenJDK 28 yol haritasında resmi olarak hedeflenen JEP 401 (Value Objects), JEP 544 (Ahead-of-Time Code Compilation) ve JEP 543 (Structured Concurrency Final) ile Java sanal makinesinde bellek düzleştirme, yerel makine kodu önbellekleme ve hiyerarşik eşzamanlılık mimarisinin teknik analizi.