Proyecto completo de Spring Boot para testear y demostrar todas las funcionalidades nuevas de Java 21.
Hilos virtuales que permiten escalabilidad masiva con overhead mínimo.
Endpoints:
POST /api/virtual-threads/execute-tasks- Ejecuta múltiples tareas concurrentesGET /api/virtual-threads/benchmark- Compara rendimiento con platform threadsPOST /api/virtual-threads/simulate-blocking-io- Simula operaciones I/O bloqueantesGET /api/virtual-threads/current-thread-info- Información del thread actual
Coincidencia de patrones mejorada en switch statements con guards.
Endpoints:
POST /api/pattern-matching/calculate-area- Calcula área según tipo de formaPOST /api/pattern-matching/describe-shape- Describe formas con pattern matchingPOST /api/pattern-matching/validate-shape- Valida formas con guardsPOST /api/pattern-matching/categorize- Categoriza formas por tamañoPOST /api/pattern-matching/compare- Compara dos formas
Deconstrucción de records en pattern matching, incluyendo records anidados.
Endpoints:
POST /api/record-patterns/analyze-employee- Analiza empleado con record patternsPOST /api/record-patterns/extract-info- Extrae información anidadaPOST /api/record-patterns/filter-by-city- Filtra empleados por ciudadPOST /api/record-patterns/generate-report- Genera reporte detalladoPOST /api/record-patterns/compare- Compara dos empleados
Interpolación de strings mejorada (implementado con String.format).
Endpoints:
POST /api/string-templates/format-report- Genera reportes formateadosPOST /api/string-templates/sql-query- Genera queries SQLPOST /api/string-templates/json-builder- Construye JSON
Nuevas interfaces para colecciones ordenadas con métodos addFirst/addLast/getFirst/getLast/reversed.
Endpoints:
GET /api/sequenced/list- Demuestra SequencedCollection con ListGET /api/sequenced/set- Demuestra SequencedSetGET /api/sequenced/map- Demuestra SequencedMap
Uso de _ para valores ignorados en pattern matching y variables.
Endpoints:
GET /api/unnamed/exception- Demuestra unnamed en excepcionesGET /api/unnamed/loop- Demuestra unnamed en loopsPOST /api/unnamed/switch- Demuestra unnamed en switchPOST /api/unnamed/process-tuple- Procesa tuplas ignorando valores
Concurrencia estructurada para mejor manejo de tareas paralelas (implementado con ExecutorService).
Endpoints:
GET /api/structured-concurrency/fetch-parallel- Obtiene datos de múltiples fuentes en paralelo
Alternativa moderna a ThreadLocal para compartir datos (implementado con ThreadLocal).
Endpoints:
POST /api/scoped-values/process-request- Procesa request con contextoPOST /api/scoped-values/nested-scopes- Demuestra scopes anidados
- Java 21 (JDK 21 o superior)
- Maven 3.9+
- IDE compatible: IntelliJ IDEA 2023.2+, Eclipse 2023-09+, o VS Code con Extension Pack for Java
git clone <repository-url>
cd java21TestEste proyecto incluye un archivo .sdkmanrc que configura automáticamente Java 21.
# Si no tienes SDKMAN instalado, instálalo primero:
# curl -s "https://get.sdkman.io" | bash
# Instalar las versiones especificadas en .sdkmanrc
sdk env install
# Activar el entorno (se hace automáticamente al entrar al directorio)
sdk env
# Verificar la versión de Java
java -versionNota: Si usas SDKMAN, el proyecto cambiará automáticamente a Java 21 cuando entres al directorio.
mvn clean compilemvn testOpción 1: Usar script de arranque (recomendado)
./start.shOpción 2: Manualmente con Maven
mvn spring-boot:run -Dspring-boot.run.jvmArguments="--enable-preview"La aplicación estará disponible en: http://localhost:8080/api
Opción 1: Usar script de parada
./stop.shOpción 2: Ctrl+C en la terminal donde corre la aplicación
Opción 3: Matar el proceso manualmente
# Encontrar el PID
ps aux | grep java21test
# Matar el proceso
kill <PID>El proyecto incluye scripts para facilitar la gestión:
# Iniciar aplicación
./manage.sh start
# Detener aplicación
./manage.sh stop
# Reiniciar aplicación
./manage.sh restart
# Ver estado
./manage.sh status
# Ver logs en tiempo real
./manage.sh logs
# Ejecutar tests
./manage.sh test
# Compilar proyecto
./manage.sh compilestart.sh- Inicia la aplicación con Java 21 y preview featuresstop.sh- Detiene la aplicación gracefullymanage.sh- Script principal de gestión con múltiples comandos
Una vez iniciada la aplicación, accede a la documentación interactiva de la API:
URL: http://localhost:8080/api/swagger-ui.html
Desde Swagger UI puedes:
- Ver todos los endpoints disponibles
- Probar cada funcionalidad interactivamente
- Ver ejemplos de requests y responses
- Explorar los modelos de datos
Monitoreo y métricas de la aplicación:
URL: http://localhost:8080/api/actuator/health
Endpoints disponibles:
/actuator/health- Estado de salud de la aplicación/actuator/info- Información de la aplicación/actuator/metrics- Métricas de rendimiento/actuator/env- Variables de entorno
Algunas features de Java 21 están en preview y requieren habilitación especial:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<compilerArgs>
<arg>--enable-preview</arg>
</compilerArgs>
</configuration>
</plugin>java --enable-preview -jar target/java21test-1.0.0-SNAPSHOT.jarsrc/
├── main/
│ ├── java/com/monghit/java21test/
│ │ ├── Java21TestApplication.java # Clase principal
│ │ ├── config/
│ │ │ └── VirtualThreadConfig.java # Configuración de Virtual Threads
│ │ ├── common/
│ │ │ ├── dto/ApiResponse.java # DTO de respuesta estándar
│ │ │ └── exception/GlobalExceptionHandler.java
│ │ └── features/ # Cada feature en su paquete
│ │ ├── virtualthreads/
│ │ ├── patternmatching/
│ │ ├── recordpatterns/
│ │ ├── stringtemplates/
│ │ ├── sequencedcollections/
│ │ ├── unnamedpatterns/
│ │ ├── structuredconcurrency/
│ │ └── scopedvalues/
│ └── resources/
│ ├── application.properties # Configuración
│ └── banner.txt # Banner personalizado
└── test/
└── java/com/monghit/java21test/
├── Java21TestApplicationTests.java # Test principal
└── features/ # Tests por feature
curl -X POST http://localhost:8080/api/virtual-threads/execute-tasks?numberOfTasks=100curl -X POST http://localhost:8080/api/pattern-matching/calculate-area \
-H "Content-Type: application/json" \
-d '{"type": "circle", "radius": 5.0}'curl -X POST http://localhost:8080/api/record-patterns/analyze-employee \
-H "Content-Type: application/json" \
-d '{
"name": "John Doe",
"age": 30,
"street": "123 Main St",
"city": "New York",
"zipCode": "10001",
"country": "USA",
"departmentName": "Engineering",
"departmentCode": "ENG",
"manager": "Jane Manager",
"salary": 85000
}'curl -X GET http://localhost:8080/api/sequenced/list- Java 21 - Última versión LTS con todas las nuevas features
- Spring Boot 3.2.1 - Framework de aplicación
- Maven - Gestión de dependencias
- SpringDoc OpenAPI - Documentación automática de API
- JUnit 5 - Testing
- AssertJ - Assertions fluidas para tests
- SLF4J + Logback - Logging
Permite crear millones de threads con overhead mínimo. Ideal para aplicaciones I/O bound.
Código más limpio y expresivo al trabajar con jerarquías de tipos.
Deconstrucción directa de records en pattern matching, incluyendo records anidados.
API unificada para trabajar con colecciones ordenadas.
Ejecutar todos los tests:
mvn testEjecutar tests de una feature específica:
mvn test -Dtest=VirtualThreadServiceTest
mvn test -Dtest=PatternMatchingServiceTest
mvn test -Dtest=RecordPatternServiceTestEsto significa que Maven no está usando Java 21. Soluciones:
Opción 1: Usar SDKMAN (recomendado)
sdk env install # Instala Java 21
sdk env # Activa Java 21
java -version # Verifica que sea Java 21
mvn clean compileOpción 2: Cambiar JAVA_HOME manualmente
export JAVA_HOME=/path/to/java21
export PATH=$JAVA_HOME/bin:$PATHOpción 3: Ver versiones de Java disponibles en SDKMAN
sdk list java | grep 21
sdk install java 21.0.5-tem
sdk use java 21.0.5-temAsegúrate de que Maven esté usando Java 21 y que el plugin de compilación tenga --enable-preview:
java -version # Debe mostrar Java 21
mvn -version # Debe usar Java 21Verifica que estés usando JDK 21 (no JRE) y que todas las dependencias se hayan descargado:
mvn clean installEste es un proyecto educativo para demostrar las features de Java 21. Las contribuciones son bienvenidas para:
- Agregar más ejemplos de uso
- Mejorar la documentación
- Agregar tests adicionales
- Optimizar implementaciones
MIT License - Ver archivo LICENSE para más detalles.
Monghit - 2024
