Usare i virtual threads in Java e Spring Boot
Parecchio tempo fa scrissi un articolo sull'uso dei virtual threads in Java.
In questo articolo andremo ad usare, più o meno, quel codice per fare dei test in Spring Boot.
La prima cosa che dobbiamo fare è attivarli.
Dentro il nostro application.properties aggiungiamo queste due righe:
spring.threads.virtual.enabled=true
server.tomcat.threads.max=200
Poi dobbiamo modificare anche l'entry point; o volendo possiamo mettere questo codice in una classe apposita, questo dipende da voi:
package com.example.test_springboot_java;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.embedded.tomcat.TomcatProtocolHandlerCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.core.task.AsyncTaskExecutor;
import org.springframework.core.task.support.TaskExecutorAdapter;
import java.util.concurrent.Executors;
@SpringBootApplication
public class TestSpringbootJavaApplication {
public static void main(String[] args) {
SpringApplication.run(TestSpringbootJavaApplication.class, args);
}
@Bean
TomcatProtocolHandlerCustomizer<?> protocolHandlerVirtualThreadsCustomizer() {
return protocolHandler ->
protocolHandler.setExecutor(Executors.newVirtualThreadPerTaskExecutor());
}
@Bean
public AsyncTaskExecutor asyncTaskExecutor() {
return new TaskExecutorAdapter(Executors.newVirtualThreadPerTaskExecutor());
}
}
Infine il controller:
package com.example.test_springboot_java.controllers;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import java.util.Random;
@RestController
@RequestMapping(path = "/test")
public class TestController {
@GetMapping(path = "/", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(HttpStatus.OK)
public String index() {
long start = System.currentTimeMillis();
Random random = new Random();
Runnable runnable = () -> {
double d = random.nextDouble(1000) % random.nextDouble(1000);
};
for (int i = 0; i < 50000; i++) {
Thread.startVirtualThread(runnable);
}
long finish = System.currentTimeMillis();
long timeElapsed = finish - start;
return Thread.currentThread() + "n" + "TEMPO DI ESECUZIONE: " + timeElapsed;
}
}
Che sostanzialmente ci ritorna una stringa con:
- una prima parte che ci dice se i virtual threads sono attivi
- una seconda parte con il risultato delle operazioni
Enjoy!
java spring boot virtual threads
Commentami!