Şuayb'in BloguŞuayb'in Blogu
Ana Sayfa
Kategoriler
Oyunlar
MediumHakkındaİletişim
Dil
Tema
    1. Blog
    2. Programlama
    3. Spring Boot Sanal Thread’li Asenkron Görevler

Spring Boot Sanal Thread’li Asenkron Görevler

İlk yayın26 Nisan 2025
Son güncelleme27 Nisan 2025
Okuma süresi3 dk okuma
JavaKotlinSpring BootAsenkron GörevlerSanal Thread
XLinkedInFacebook
Spring Boot Sanal Thread’li Asenkron Görevler

Beğeni yükleniyor...

Spring Boot 3.2 ve üzeri sürümler, JDK 21’in sanal thread desteğini otomatik olarak yapılandırarak @Async anotasyonuyla basit ve yüksek performanslı asenkron işlemler yapmanıza imkan tanır.


Son güncelleme27 Nisan 2025

Toplam görüntülenmeGörüntülenme yükleniyor...

Önceki makaleSpring Boot AI EntegrasyonuSonraki makaleSpring Boot HTTP Interface Client
Şuayb Şimşek

Yazan

Şuayb Şimşek

Spring Boot, güvenlik, mikroservis ve cloud-native mimari konularında pratik teknik notlar paylaşan backend odaklı fullstack geliştirici.

Uzmanlık

  • Spring Boot
  • Go
  • Mikroservis
  • Next.js
  • Cloud Native

Bağlantılar

GitHubLinkedInMedium

Benzer yazılar

Spring Boot Asenkron Görevler
Programlama

Spring Boot Asenkron Görevler

Spring Boot ile @Async kullanarak görevleri ana threadi engellemeden asenkron olarak nasıl çalıştıracağınızı öğrenin.

20 Şubat 20253 dk okuma
JavaKotlinSpring BootAsenkron Görevler
Spring Boot Configuration Properties
Programlama

Spring Boot Configuration Properties

@ConfigurationProperties ile tip-güvenli yapılandırma tanımlamayı, @Validated ile ayarları doğrulamayı ve profile-specific application-{profile}.yml dosyalarıyla ortama göre değer yönetimini öğrenin.

4 Şubat 20263 dk okuma
JavaKotlinSpring BootYapılandırma
Spring Boot GraphQL JWE Kimlik Doğrulama
Programlama

Spring Boot GraphQL JWE Kimlik Doğrulama

Stateless şifreli JWT’ler (JWE) ile Spring Boot GraphQL API’lerinizi güvenli hale getirmeyi; kullanıcı kimliği ve rolleri JPA ile bir veritabanında saklamayı öğrenin.

17 Mayıs 20256 dk okuma
JavaKotlinSpring BootGüvenlikJWTJWEGraphQL

Hakkımda

Spring Boot, mikroservis, güvenlik ve daha fazlası hakkında yazılar.

İletişimYeni başladıysan

Son yazılar

  • Captain Tsubasa 2: World Fighters
  • Captain Tsubasa: Rise of New Champions
  • Spring Boot Configuration Properties
  • Spring Boot GraphQL JWE Kimlik Doğrulama
  • Spring Boot JPA ile JWE Kimlik Doğrulaması

Popüler konular

JavaKotlinSpring BootGüvenlikJWEJWT

Abone ol

Yeni yazılar yayınlandığında pratik backend ve fullstack notlarını al.

Sosyal

© 2024-2026 Şuayb'in Blogu. Tüm hakları saklıdır.

🌟 Neden Spring Boot'ta Sanal Thread Kullanmalıyız?

Bu bölümde Neden Spring Boot'ta Sanal Thread Kullanmalıyız? konusunu netleştirip uygulamada kullanacağınız temel noktaları özetliyoruz.

  • Hafif Maliyet: Sanal thread’ler, geleneksel platform thread’lere kıyasla çok daha az kaynak kullanır.
  • Bloklamasız: @Async ile işaretlenen metodlar ana thread’i meşgul etmeden çalışır.
  • Yüksek Ölçeklenebilirlik: Binlerce concurrent iş yükünü düşük bellek ayak iziyle yönetir.
  • Basit Konfigürasyon: Tek bir özellik (property) ekleyerek tüm executor ve scheduler’ları sanal thread’li yapar.

📋 Gereksinimler

Bu bölümde Gereksinimler konusunu netleştirip uygulamada kullanacağınız temel noktaları özetliyoruz.

  • ☕ Java Development Kit (JDK) 21 veya üzeri
  • 📦 Spring Boot 3.2+
  • 🔤 IDE (IntelliJ IDEA, Eclipse vb.)

🛠️ Adım 1: Bağımlılıkları Ekle

Asenkron işleme olanak tanıyan spring-boot-starter-web paketini projenize ekleyin.

Maven:

XMLpom.xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Gradle:

GROOVYbuild.gradle
implementation 'org.springframework.boot:spring-boot-starter-web'

🛠️ Adım 2: Sanal Thread’leri Aktifleştir

application.yml veya application.properties dosyanıza şu satırı ekleyin:

YAMLapplication.yml
spring:
  threads:
    virtual:
      enabled: true
PROPERTIESapplication.properties
spring.threads.virtual.enabled=true

Bu ayar, aşağıdakileri otomatik yapılandırır:

  • applicationTaskExecutor (Async)
  • Task scheduler (@Scheduled)
  • HTTP sunucu thread havuzları (Tomcat/Jetty)

🛠️ Adım 3: Asenkron Desteği Aktif Etme

Ana uygulama sınıfınıza @EnableAsync ekleyin:


🛠️ Adım 4: Asenkron Servis Tanımla

@Async anotasyonlu metodlar sanal thread üzerinde çalışır:


🛠️ Adım 5: REST Controller ile Tetikle

Aşağıdaki endpoint’leri kullanarak servis metodlarını tetikleyin:


▶️ Uygulamayı Çalıştır

BASH
./mvnw spring-boot:run
# veya
gradle bootRun

🧪 Endpointleri Test Et

Void görevi tetikle

BASH
curl http://localhost:8080/async/run

Sanal thread başlangıç/bitiş log’larını kontrol edin.

Sonuç döndüren görevi tetikle

BASH
curl http://localhost:8080/async/run-return
# dönen: "Tamamlandı"

🏁 Sonuç

Artık Spring Boot Sanal Thread’li Asenkron Görevler için üretim odaklı bir Spring Boot temeliniz var. Sonraki adımda ayarları kendi domainine uyarlayıp test ve gözlemlenebilirlik katmanını ekleyerek gerçek trafik altında doğrulayın.

JAVAAsyncVirtualApplication.java
package com.example.async;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;

@SpringBootApplication
@EnableAsync
public class AsyncVirtualApplication {
    public static void main(String[] args) {
        SpringApplication.run(AsyncVirtualApplication.class, args);
    }
}
KOTLINAsyncVirtualApplication.kt
package com.example.async

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import org.springframework.scheduling.annotation.EnableAsync

@SpringBootApplication
@EnableAsync
class AsyncVirtualApplication

fun main(args: Array<String>) {
    runApplication<AsyncVirtualApplication>(*args)
}
JAVAAsyncVirtualService.java
package com.example.async;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

import java.time.LocalTime;
import java.util.concurrent.CompletableFuture;

@Slf4j
@Service
public class AsyncVirtualService {

    @Async
    public void runTask() {
        log.info("[{}] Asenkron başlatıldı: {}", LocalTime.now(), Thread.currentThread());
        try { Thread.sleep(1000); } catch (InterruptedException ignored) {}
        log.info("[{}] Asenkron tamamlandı: {}", LocalTime.now(), Thread.currentThread());
    }

    @Async
    public CompletableFuture<String> runAndReturn() throws InterruptedException {
        Thread.sleep(500);
        return CompletableFuture.completedFuture("Tamamlandı");
    }
}
KOTLINAsyncVirtualService.kt
package com.example.async

import org.slf4j.LoggerFactory
import org.springframework.scheduling.annotation.Async
import org.springframework.stereotype.Service

import java.time.LocalTime
import java.util.concurrent.CompletableFuture

@Service
class AsyncVirtualService {
    private val log = LoggerFactory.getLogger(AsyncVirtualService::class.java)

    @Async
    fun runTask() {
        log.info("[{}] Asenkron başlatıldı: {}", LocalTime.now(), Thread.currentThread())
        try { Thread.sleep(1000) } catch (_: InterruptedException) {}
        log.info("[{}] Asenkron tamamlandı: {}", LocalTime.now(), Thread.currentThread())
    }

    @Async
    fun runAndReturn(): CompletableFuture<String> {
        Thread.sleep(500)
        return CompletableFuture.completedFuture("Tamamlandı")
    }
}
JAVAAsyncVirtualController.java
package com.example.async;

import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/async")
@RequiredArgsConstructor
public class AsyncVirtualController {

    private final AsyncVirtualService service;

    @GetMapping("/run")
    public String triggerRun() {
        service.runTask();
        return "Asenkron sanal thread görevi tetiklendi";
    }

    @GetMapping("/run-return")
    public String triggerRunAndReturn() throws Exception {
        var future = service.runAndReturn();
        return future.get();
    }
}
KOTLINAsyncVirtualController.kt
package com.example.async

import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController

import lombok.RequiredArgsConstructor

@RestController
@RequestMapping("/async")
@RequiredArgsConstructor
class AsyncVirtualController(private val service: AsyncVirtualService) {

    @GetMapping("/run")
    fun triggerRun(): String {
        service.runTask()
        return "Asenkron sanal thread görevi tetiklendi"
    }

    @GetMapping("/run-return")
    @Throws(Exception::class)
    fun triggerRunAndReturn(): String {
        val future = service.runAndReturn()
        return future.get()
    }
}