Spring Batch Nedir?

Ümit Sayın
folksdev
Published in
4 min readApr 8, 2023

Bazen işlemlerin otomatik olarak belirli bir sıraya göre gerçekleştirilmesi gereken durumlarla karşılaşabiliriz. Örneğin, bir veri seti üzerinde belirli aralıklarla işlem yapmak istiyor olabiliriz. Bu tür ihtiyaçlarımızda Batch yapısı bize büyük kolaylık sağlayabilir. Batch işlemleri, büyük ölçekte veri işleme ihtiyacı olan durumlarda sıklıkla kullanılır. Bir bankanın binlerce müşterisinin hesap hareketlerini işlemesi veya bir şirketin verilerini raporlaması için batch işlemleri uygulanabilir. Spring Batch, bu tarz işlemleri kolayca yapmamızı sağlayan bir framework’tür.
Bu yazıda, Spring Batch’in kullanımı ile ilgili detaylara değinerek, büyük ölçekte veri işleme işlemlerini nasıl kolaylaştırabileceğimizi anlatmaya çalıştım.

Spring Batch

Spring Batch, büyük veri işleme işlemlerini kolaylaştıran bir framework’tür. Batch işlemleri genellikle toplu işlemlerdir ve belirli zaman aralıklarıyla tekrarlanan işlemler olarak tanımlanabilirler. Spring Batch, bu işlemlerin yönetimini kolaylaştıran bir yapıya sahiptir.

Bir Spring Batch işi (Job), bir veya daha fazla adımdan (Step) oluşur. Her adım, verilerin okunması (Reader), işlenmesi (Processor) ve yazılması (Writer) için üç ana parçadan oluşur. Adımlar, bu üç parçacığı kullanarak verilerin işlenmesini hızlandırmak için bir araya getirilirler. Spring Batch, işlerin otomatik olarak yönetilmesi için JobRepository adında bir araç sağlar ve ayrıca hataları ve işlem durumlarını izlemek için güçlü raporlama araçları sunar. Ayrıca, Spring Batch, çeşitli kaynaklardan veri alma, farklı veri formatlarını destekleme ve paralel işlem yapabilme özelliklerine sahiptir.

Spring Batch için bazı anahtar kavramlar şunlardır :

  • Job: Bir işlemi temsil eden, bir veya daha fazla adımdan oluşan bir iş akışıdır.
  • Step: Bir iş akışındaki adımlardan biridir. Her adım, okuma, işleme ve yazma işlemlerini içerebilir.
  • Reader: Bir adımdaki verilerin okunmasını sağlayan yapıdır. Okuma kaynağına göre farklı türde readerlar kullanılabilir (e.g. JDBC, JPA, FlatFile vb.).
  • Processor: Okunan verileri işleyen, dönüştüren veya filtreleyen bir yapıdır.
  • Writer: Bir adımda işlenen verilerin kaydedilmesini sağlayan yapıdır. Verilerin kaydedileceği hedefe göre farklı türde writerlar kullanılabilir (e.g. JDBC, JPA, FlatFile vb.).
  • JobLauncher: Bir job’un başlatılmasını sağlayan arayüzdür.
  • JobRepository: Job ve step’lerin durumunu ve diğer ilgili bilgileri tutan veri tabanında tutan bir araçtır.

Yukarıdaki görselde, bir tetikleyici kullanarak JobLauncher ile Job başlatılır. Bu Job kendi içinde 2 Step’ten oluşuyor ve Stepler Job başlatıldığında sırayla çalıştırılır. Her Step’in bir okuma, işleme ve yazma yapısı bulunur. İşlem tamamlandığında, yapılan Job hakkındaki bilgiler JobRepository tarafından veritabanına kaydedilir ve Job’ların kayıtları burada tutulur. Bu kayıtlar sayesinde, yapılan Job’ların durumu, hata alınıp alınmadığı gibi raporlamalar yapılabilir.

Basit bir örnek üzerinden ilerleyelim :)

Bir alışveriş sitesi, o gün yapılan satışlar için Excel tabloları üzerinde otomatik raporlama yapmak istiyor. Bu amaçla, günlük faturaların oluşturulduğu anda müşterilerin faturalarının otomatik olarak raporlanmasını sağlayacak bir sistem yazılması gerekiyor. Bunun Spring Batch kullanılarak basit bir yapı oluşturalım. Örnekle ilgili tüm kodlara detaylı olarak bu linkten ulaşabilirsiniz 

Spring Batch’i projenizde kullanmak için öncelikle gerekli bağımlılıkları pom.xml veya gradle dosyasına yüklemeniz gerekmektedir. Proje içersinde Spring Batch’i aktifleştirmek istersek ise @EnableBatchProcessing anotasyonunu kullanmamız gerekir. Bu anotasyon Spring Batch’i aktifleştirir ve kullanmamızı sağlar.

Örneğin bu uygulama için faturaların excel dosyasına kaydedileceği Job ve Step adımlarına göz atalım.

Burada, gerekli parametreler eklenerek StepBuilder ile Step oluşturulur. Oluşturduğumuz Step’te, JPA ile veritabanından veri okuma işlemini yapmak için ItemReader sınıfını implement eden Reader sınıfı kullanılmaktadır. İkinci aşamada, her bir veri için veri işleme yapmak için bir ItemProcessor implement eden bir sınıf kullanılmaktadır.

Örneğin yukarıda, Invoice modelini InvoiceDto’ya dönüştürdüğümüz ItemProcessor sınıfını görülmektedir. Bu dönüşüm tamamlandığında veri ItemWriter’ı implement eden sınıfa yönlendirilir ve veriyi ile yaptırmak istenilen işi burada yaptırılır. Bizim örneğimizde bu sınıfın içinde gelen veri setini, bir Excell dosyası oluşturarak içerisine kaydetmektedir.

Step için gerekli parametreler tanımlandıktan sonra bir JobBuilder ile Job oluşturulmaktadır. Oluşturulan Job, JobLauncher ile çalıştırılır. Bu işlemi otomatikleştirmek için ise @Scheduled anotasyonu kullanarak belli zaman aralıkları ile bir Job’ın çalıştırılması tetiklenir. Spring projesinde tetikleyicileri aktifleştirmek için @EnableScheduling anotasyonu kullanılmalıdır.

Yukarıdaki kod parçasında @Scheduled ile bir Job’ı her gece yarısı çalıştıran kod görülmektedir. @Scheduled ile ilgili yeterli bilgiye sahip değilseniz bu linkten detaylı olarak inceleyebilirsiniz.

Bu yazıda, büyük ölçekteki veri işleme işlemlerini kolaylaştırmak için kullanabileceğiniz Spring Batch hakkında genel bir bilgi vermeye çalıştım. Umarım sizin için faydalı bir okuma olmuştur. Başka yazılarda tekrar görüşmek dileğiyle, sağlıklı günler dilerim 😊

--

--