Ana Sayfa/Java & Kurumsal Mimari
Java & Kurumsal Mimari·23 Ekim 2026·7 dk okuma

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.

Spring Batch 6.1.0-RC1 (@JobParameter ve JdbcClient), Oracle JVM İlk Hata Teşhis Mimarisi (JFR/NMT) ve JetBrains PSI Tabanlı AI Ajanları

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

  • JdbcClient Altyapısı: Spring Batch'in dahili meta-veri tablosu (BATCH_JOB_INSTANCE, BATCH_STEP_EXECUTION vb.) DAO sınıfları klasik JdbcTemplate yerine modern, akıcı (fluent) JdbcClient API'sine taşınmıştır.
  • DefaultChunkProcessor: Kullanımdan kaldırılan (deprecated) SimpleChunkProcessor sınıfının yerini almak üzere, standart adım (step) kapsamı dışındaki uzak yığın işçileri (remote chunking workers) için minimal DefaultChunkProcessor eklenmiştir.
  • PageableItemReader & Kütüphaneden Bağımsız JSON Desteği: Sayfalı veri kaynaklarını okumayı basitleştiren PageableItemReader, uzak yığın yapılandırması için RemoteChunkingManagerBuilder ve belirli bir JSON kütüphanesine (Jackson/Gson) sıkı bağımlılık duymayan JsonLineMapper ile JsonLineAggregator bileş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.

mermaid
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:

java
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.

Konu Etiketleri
#Java#Spring Batch 6.1#JVM Diagnostics#JDK Flight Recorder#Spring Framework 7.1#JetBrains Junie#Enterprise Java#Observability
Emre Taştutan
Emre TaştutanGeliştirici & AI Meraklısı

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.

@tastutanlabs • Instagram Mini-Blog

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.

Instagram'da Takip Et →
Bu Yazıyı Paylaş:

Yorumlar (0)

Düşüncelerinizi Paylaşın

Henüz yorum yapılmamış. İlk yorumu siz yapın!

Bu Kategorideki Diğer İncelemeler