Java Digest # 8: Kafka 3.7, Java 17 для Maven 4, Parallel bean initialization, Scala 3.3.3 LTS

💡 Усі статті, обговорення, новини про Java — в одному місці. Приєднуйтесь до Java спільноти!

🙋 Алоха, друзі!

Березень вже несеться, лютий був як в тумані. Ми трохи здули з себе пилюку, зібрались докупи та підготували для вас наступний дайджест. Тож, вйо до новин!

Попередній дайджест можна прочитати тут.

Але пам’ятайте, що це стало можливим виключно завдяки ЗСУ і читати ви його зараз можете теж завдяки їм. Тому швидесенько перед прочитанням пішли міняти долари та кидати гривні на допомогу нашим Захисникам.

JEP 468: Derived Record Creation (Preview), було підвищено зі статусу JDK Draft 8321133 до статусу «Кандидата». Похідне створення (derived creation) спрощує код, дозволяючи створювати новий record з наявного, вказуючи лише компоненти, які відрізняються.

JEP 467: Markdown Documentation Comments, було підвищено зі статусу JDK Draft 8316039 до статусу «Кандидата». Цей JEP пропонує дозволити писати коментарі JavaDoc на Markdown, а не на коктейлі з HTML та JavaDoc @ тегів. Це дозволить мати коментарі, які легше писати та легше читати.

Paul Sandoz, архітектор Java в Oracle, подав JEP Draft 8326878: Vector API (Incubator). Після семи раундів інкубації, які були інтегровані з JDK 16 по JDK 22, цей JEP пропонує повторно інкубувати API в JDK 23 без змін API та без суттєвих змін у реалізації порівняно з JDK 22. Цей JEP передбачає надання інженерам API для «вираження векторних обчислень, які надійно компілюються в оптимальні векторні інструкції на підтримуваних архітектурах CPU, таким чином досягаючи продуктивності, кращої за еквівалентні скалярні обчислення».

Build 12 раннього доступу JDK 23 було випущено на останньому тижні лютого з оновленнями, які містять виправлення різних проблем. Більше деталей про цей реліз можна знайти тут.

Важливим апдейтом по подальшій долі JEP 459 (String Templates) поділився Brian Goetz.

З моменту публікації нашої попередньої статті екосистема продуктів Spring зазнала численних оновлень, а також з’явилося чимало інших захопливих новин. Не гаючи часу, перейдімо до детального розгляду останніх змін.

Spring Framework отримав одразу три версії. Найважливіше те, що нові версії Spring Framework 6.1.4, 6.0.17 та 5.3.32 отримали виправлення вразливості CVE-2024-22243 (Увага! Attention! Pozor!). Програми, що застосовують UriComponentsBuilder для обробки зовнішніх URL-адрес, можуть бути вразливими до цього типу вразливості. Основна небезпека в цьому разі — вразливість з відкритим перенаправленням та підробка запитів на стороні сервера. Ми наполегливо рекомендуємо оновитися, якщо UriComponentsBuilder використовується вами для вищевказаних завдань.

Крім того, всі версії містять багато виправлень помилок і змін у документації. А версія 6.1.4 пропонує багато цікавих змін, зокрема:

  • Додано SqlBinaryValue/SqlCharacterValue як альтернативи SqlLobValue, що дозволяє використання байтових потоків у JdbcClient.
  • Сканування JPA-об’єктів було покращено для забезпечення додаткового контролю. Відтепер існує можливість фільтрації за класами, а не лише за пакетами.
  • ConcurrencyThrottleSupport, що використовується в SimpleAsyncTaskExecutor, було змінено для кращої підтримки віртуальних потоків.
  • BeanPropertyRowMapper було розширено, забезпечивши підкласам можливість налаштування зіставлених імен.

Як і очікувалося, Spring Boot також отримав три нові версії. Версії Spring Boot 3.1.9, 3.2.3, та 3.3.0-M2 пропонують багато виправлень помилок та оновлень документації. Більше інформації про ці оновлення можна знайти за посиланнями тут, тут і тут. Усі ці версії використовують Hibernate 6.4.4.Final. Попри те, що ця версія містить важливі виправлення помилок, вона не функціонує коректно з «нативними імеджами» (Увага! Attention! Pozor!). У разі використання GraalVM, рекомендується знизити версію Hibernate до 6.4.2.Final, використовуючи параметр hibernate.version.

Spring Boot 3.3.0-M2 також пропонує низку нововведень, серед яких можна виділити такі:

  • Додано новий відправник Zipkin, який базується на JDK HttpClient.
  • Зʼявилася підтримка Docker Compose з контейнерними образами Bitnami.
  • Нова анотація @BatchTransactionManager, яка дозволяє легко налаштувати Spring Batch на використання власного менеджера транзакцій.
  • Підтримка Docker Compose розширена для Apache ActiveMQ Artemis, ActiveMQ Classic та LDAP. Детальніше тут, тут, і тут.

Spring Security 6.2.2, 6.1.7, та 5.8.10 є підтримуючими релізами, які містять виправлення помилок та оновлення версій залежностей.

Spring Data отримала три версії. Spring Data 2023.1.3 та 2023.0.9 слугують основою для Spring Boot 3.2.3 та 3.1.9 відповідно. Також, Spring Data 2024.0.0-M1 пропонує низку змін, на які варто звернути увагу:

  • Додано підтримку виразів значень (Value Expressions).
  • Зʼявилася підтримка драйверу MongoDB 5.0.
  • Spring Data Neo4j змінює схему роботи з транзакціями у межах Neo4jTemplate/ReactiveNeo4jTemplate. Якщо користувач не вказує транзакції через @Transactional або TransactionTemplate/TransactionalOperator, кожен запит виконуватиметься у своїй власній транзакції.

Також були випущені Spring Batch 5.0.5 та 5.1.1. Ці версії містять ряд виявлених помилок, покращень і оновлень залежностей.

Були випущені оновлення Spring LDAP 3.1.4 та 3.2.2. Окрім оновлень залежностей та виправлень дрібних помилок, суттєвих змін вони не містять.

Spring for Apache Kafka може похвалитися трьома версіями. Spring для Apache Kafka 3.0.14 містить низку виправлень помилок. Своєю чергою Spring for Apache Kafka 3.1.2 містить не лише виправлення помилок, але й низку нововведень, детальніше про них можна почитати тут. Spring for Apache Kafka 3.2.0-M1 теж може похвалитися змінами, зокрема, починаючи з версії 3.2:

  • Spring for Apache Kafka надає базові можливості, необхідні для інтерактивних запитів у Kafka Streams.
  • Методи @KafkaListener та @KafkaHandler можуть бути вказані з асинхронними типами повернення, що дозволяє надсилати відповіді асинхронно.
  • Було введено новий інтерфейс TransactionIdSuffixStrategy для управління суфіксом transactional.id.
  • Додано можливість перенаправляти повідомлення до користувацьких DLT на основі типу помилок, що виникли під час їхньої обробки.

Spring for Apache Pulsar отримав дві нові версії. Spring for Apache Pulsar 1.0.3 містить оновлення залежностей, а також виправлення однієї помилки. Більше інформації можна прочитати тут. Серед нововведень у Spring for Apache Pulsar 1.1.0-M1 можна виділити наступне:

  • Додано анотацію @PulsarMessage, яка дозволяє вказати топік за замовчуванням та/або інформацію про схему.
  • Якщо тип схеми топіка Pulsar невідомий заздалегідь, ви можете використовувати новий тип схеми AUTO_CONSUME для читання даних у форматі GenericRecord.
  • Додано підтримку схеми AUTO_PRODUCE.
  • Додано підтримку визначення топіків за допомогою SpEL в анотації @PulsarMessage.

Spring Authorization Server 1.1.5, 1.2.2 та 1.3.0-M2 доступні до завантаження. Детальніше тут, тут і тут.

Spring for GraphQL 1.2.5 містить важливі виправлення для підтримки @SubscriptionMapping, яка не працювала належним чином з версіями graphql-java 21.x+, а також для прокрутки з позиціями зміщення, які не відповідали специфікації Relay коректно. Команда GraphQL також опублікувала детальну статтю про нові зміни у Spring for GraphQL 1.3 M1, рекомендуємо ознайомитися.

Дізнатися про зміни в нових Spring Modulith 1.0.6, 1.1.3 та 1.2 M2 ви можете тут.

Також світ побачив нові версії Spring Shell 3.1.9 та 3.2.2 та Spring Tools 4.21.1. Детально про них тут і тут.

Команда Spring Cloud Dataflow випустила новий (старий) продукт Spring Functions Catalog 5.0.0‐M1. Spring Functions Catalog є ребрендингом (та наступним поколінням) підмодуля функцій проєкту Stream Applications. Ви можете дізнатися причини цього ребрендингу та чому було вирішено розпочати з версії 5.0.0, ознайомившись з наступною статтею.

Проєкт Spring AI отримав свою першу версію 0.8.0. Його було засновано на усвідомленні того, що створення ШІ-застосунків більше не є винятково прерогативою спеціалістів з машинного навчання чи штучного інтелекту. Зі стрімким зростанням популярності ChatGPT, який надає простий веб-API для доступу до попередньо навчених моделей, створення захопливих програм штучного інтелекту стало доступним для розробників програмного забезпечення на багатьох мовах програмування та їхніх екосистемах. У цій статті ви можете знайти основні можливості, які додані в цю першу версію.

Цим ми завершуємо огляд новинок в продуктах Spring. Наступним кроком пропонуємо ознайомитися з іншими цікавими новинами про Spring.


З часу нашого попереднього випуску Josh Long випустив шість відео із серії Spring Tips. Ознайомитися з ними можна нижче:

📹CQRS and Axon Framework:

📹 Spring AI:

📹 Spring Boot Testjars:

📹 The Spring Authorization Server:

📹 The Spring Authorization Server — securing SPAs and messaging flows:

📹 The Spring Authorization Server — durability of data:


Maciej Walkowiak повідомив, що стартуючи з версії 6.2 Spring Framework буде додано нову можливість конфігурації бінів — @Fallback.

@Fallback бін вказує, що бін кваліфікується як запасний кандидат для автоматичного зв’язування. Це доповнення та альтернатива анотації @Primary.


13 років цей тікет очікував ... І ось нарешті паралельне створення бінів в Spring буде!


Команда Spring повідомила, що останні випуски 6.0.x та 5.3.x вийдуть у серпні, а офіційна підтримка завершиться 31 серпня 2024 року. Про деталі їхнього рішення ви можете дізнатися з цієї статті.


Mistral AI — провідний розробник відкритих великих мовних моделей — оголосив про додавання підтримки виклику функцій до своїх передових моделей. Виклик функцій — це можливість, яка спрощує інтеграцію великих мовних моделей (LLM) з зовнішніми інструментами та API. Вона дозволяє мовній моделі запитувати виконання функцій на стороні клієнта, надаючи їй можливість доступу до необхідної інформації в реальному часі або динамічно виконувати завдання. Якщо ви зацікавлені, рекомендуємо вам прочитати наступну статтю.


The State of Spring опитувальник знову з нами. Пропонуємо пройти його тут.

☁️ AWS

  • Перетворення стандартної spring boot web tomcat програми на AWS lambda container описано у цій статті на AWS blogs. Tomcat виключається з білда і замість нього використовується спеціальний handler, а для подолання cold start пропонується або snap start, або деякі оптимізації, що обмежують кількість роботи яку Spring має виконати під час ініціалізації.
  • Ця стаття на AWS blogs описує що таке sbom і як його створювати за допомогою AWS Inspector SBOM Generator — засобу, який аналізує вкладені залежності в jar/war архівах і завантажує звіт на AWS Inspector, де можна переглянути знайдені безпекові вразливості, що є у цих залежностях.

☁️ Azure

  • На Azure Blogs з’явилася стаття про PublishTestResults task, який вміє інтегрувати результати тестів JUnit і Playwright в Azure DevOps Pipelines.
  • Що таке Event sourcing і як імплементувати цей патерн в CosmosDB використовуючи Change Feed, описано у статті на Azure Blogs.
  • Моніторинг Spring Boot native application з Azure Application Insights описаний у цій статті. Для цього використовується OpenTelemetry Spring Boot starter дистрибутив від Azure, який на момент написання має лише beta версії і готується до GA.
  • Оновлення інструментарію Java на Azure за січень 2024 року включає кілька ключових покращень:
    • Підтримка Azure Key Vault: тепер дозволяє безпечно зберігати та керувати секретами, ключами та сертифікатами безпосередньо у Toolkit для IntelliJ, підвищуючи безпеку Java-застосунків.
    • Створення проєктів на базі прикладів Azure: інтеграція прикладів Azure у тулкіт для спрощення створення проєктів та їхньої базової структури, допомагаючи розробникам економити час та використовувати наявні шаблони коду.
    • Покращення досвіду роботи з Azure Kubernetes: вдосконалене управління та взаємодія з ресурсами Azure Kubernetes безпосередньо з IntelliJ IDEA, оптимізуючи процес розробки та розгортання Java-застосунків на Azure Kubernetes.
  • Оновлення JakartaEE на Azure за лютий 2024 року містить:
    • Налаштування високої доступності та аварійного відновлення для WAS на VM: Доступний новий туторіал про налаштування мінімального часу відновлення та точки відновлення для додатків Jakarta EE на WebLogic Server.
    • How-to гайд з використання Azure Redis, як кешу сесій для WebSphere/Open Liberty: Настанови по інтеграції Azure Cache for Redis у Java-застосунках для підвищення швидкодії та масштабованості.
    • OpenJDK 11 та 17 для JBoss EAP доступні для VM PAYG на Marketplace: Забезпечує покращення продуктивності, безпеки та сумісності для розгортання JBoss EAP.
  • Оголошено про підтримку Tomcat в Azure Container Apps, що містить:
    • Підтримку Tomcat у процесі розробки в хмарі, полегшуючи міграцію наявних Java-вебзастосунків на Azure Container Apps без змін коду або конфігурації.
    • Підтримку змінних середовища для вказання версій інструментів і фреймворків, таких як Maven або Tomcat, необхідних для створення застосунку.
    • Включення Tomcat до збірки image, оптимізуючи розгортання Java-застосунків, що потребують вебсервера, без необхідності додаткових кроків.

☁️ GCP

  • Ще один спосіб зменшити cold start описується у цій статті на GCP Blogs, цього разу на прикладі Spring boot i k8s. Для цього використовується In-place Resource Resize, що дає можливість динамічно виділити додаткові ресурси для контейнера лише на деякий період часу. На прикладі Spring boot под отримує вдвічі більший cpu allocation на період startup, що і скорочує cold start. На жаль, цей механізм ще у стадії alpha.

  • З’явилася наукова стаття від інженерів Meta про TestGen-LLM — інструмент для генерації тестів (в цьому прикладі на Kotlin) за допомогою LLM, що не пише тести повністю сам, а доповнює тести написані людьми.
  • eBPF — механізм безпечного розширення Linux Kernel тепер можна спробувати на Java завдяки бібліотеці hello-ebpf, яка ще поки що знаходиться на early-access стадії і використовує Foreign Function & Memory API, реліз якого буде в Java 22. Автор блогу також веде серію блог постів з прикладами використання eBPF на Java.
  • До новин про eBPF також долучається і Netflix з релізом bpftop — засобу для моніторингу eBPF програм.
  • NATS — messaging system на кшталт Kafka/Rabbit/Redis/etc виклали нове відео. У ньому розповідають про одну з головних можливостей, що відрізняє їх від інших конкурентів, — JetStream API for consumers. Ця можливість, окрім іншого, дозволяє перенести фільтрування даних з клієнтів на сервери NATS. Окрім самого JetStream API в відео також є опис push/pull based consumers, durable/ephemeral consumers, декілька механізмів ack та декілька прикладів імплементації JetStream consumers.
  • Нещодавно вийшла нова major версія Javalin 6, а цього місяця вже з’явилася 6.1.x. Javalin це простий та легкий framework для створення вебпрограм, якщо вам цікаво — ось офіційний сайт з прикладами коду. Цікаво, що в Javalin 5 віртуальні потоки були ввімкнені за замовчуванням, а в Javalin 6 вирішили повернути прості потоки за замовчуванням. Можливі причини є у цьому github issue.
  • Про віртуальні потоки також говорить і Quarkus у новому відео Quarkus Insights #153. Окрім переваг, там також обговорюються і деякі потенційні недоліки — патерн створення дорогих ресурсів на кожен потік через threadLocal в деяких імплементаціях thread pool, а також блокування або монополізація carrier thread. Загалом, старе добре правило — Don’t Ever Block the Event Loop.
  • Освіжити знання про оптимізацію SQL-запитів можна з цією статтею, яка містить близько 20 варіантів для оптимізації select/insert/delete запитів.
  • Apache NiFi нещодавно додав підтримку OpenTelemetry Protocol (OTLP). Про деталі імплементації і вимоги до інтеграції з ListenOTLP Processor можна дізнатись у цій статті. Також Apache NiFi перебуває в процесі підготовки до нового major release 2.0 і минулого місяця з’явилася Version 2.0.0-M2.
  • Якщо вам кортіло розібратись в Bloom-фільтрах, можливо, ця стаття саме те, що ви шукали.
  • Світ побачили Scala 3.4.0 and 3.3.3 LTS.
  • Oracle Labs випустили версію 0.10.1 Native Build Tools, проєкту GraalVM, що складається з плагінів для взаємодії з GraalVM Native Image. Більш детально можна прочитати тут.
  • Kafka 3.7.0 вже доступна. Повний список змін та оновлень можна прочитати тут.
    • Підтримка JBOD (Just a Bunch of Disk) у KRaft доступна у ранньому доступі. JBOD дозволяє використовувати кілька дисків для зберігання журналів Kafka. Ця функція ще не готова до використання в продакшені, проте деталі про актуальний стан цієї можливості можна почитати тут.
    • Також у ранньому доступі доступний новий протокол балансування споживачів. Цей новий протокол переносить більшу частину логіки балансування на координатора, замість клієнтів. Він зберігає ті самі семантики для груп споживачів, але є більш ефективним і має працювати краще. Більше про поточний стан даної можливості ви можете знайти тут.
    • Відтепер клієнти можуть надсилати свої метрики брокерам. Це дозволяє легко збирати метрики клієнтів і спрощує моніторинг клієнтських додатків.
    • Apache Kafka тепер надає офіційний образ Docker на Dockerhub.
  • Docker випустив Docker Desktop версії 4.27. Ця версія переводить Docker Init в статус «загальнодоступний» (GA) з підтримкою Java, додає синхронізовані файлові сховища, включає підтримку TestContainers з покращеною ізоляцією контейнерів (ECI), Docker Build Cloud, Docker Debug та багато іншого.
    • Docker Init, спочатку випущений у бета-версії Docker 4.18, є CLI командою, призначеною для спрощення додавання ресурсів Docker. Docker 4.26 додав підтримку для PHP, а тепер Docker 4.27 додав підтримку для Java. Список підтримуваних мов наразі включає: Go, Node.js, Rust та ASP.NET. Для автоматичного створення активів достатньо запустити команду docker init у папці цільового проєкту і це автоматично створить dockerfiles, compose та .dockerignore-файли, базуючись на характеристиках проєкту.
    • Синхронізовані файлові сховища — це альтернативний механізм обміну файлами, спрямований на розвʼязання проблем використання великих кодових баз у контейнерах з віртуальними файловими системами. За словами Docker, ця функція збільшує швидкість операцій з файлами у 2-10 разів шляхом використання синхронізованих кешів файлових систем. Користувачі, які мають великі репозиторії, а також користувачі, які використовують віртуальні файлові системи, такі як: VirtioFS, gRPC FUSE та osxfs, або ті, хто відчуває обмеження продуктивності, можуть скористатися цією функцією.
    • Docker Desktop 4.27 вводить можливість використання TestContainers з покращеною ізоляцією контейнерів (ECI). ECI надає новий рівень безпеки для запобігання компрометації Docker Desktop або хост-машини шкідливими робочими навантаженнями, що виконуються в контейнерах шляхом запуску контейнерів без root доступу у віртуальній машині Docker Desktop.

Сподіваємось, ви вже додали у свій watch list відео із серії Spring Tips, про які ми писали в розділі Spring updates. Проте, рекомендуємо звернути увагу також на відео, що представлені нижче:

🔗 (Dirty?) Tricks in Java 22 — Inside Java Newscast #64

🔗 Project Leyden: Capturing Lightning in a Bottle

🔗 Java’s Virtual Threads — Next Steps

  • Гарна підказка від Maciej Walkowiak. Якщо ви часто використовуєте на рівні сервісів шаблон repository.findById(..).orElseThrow(..), розгляньте можливість додавання до інтерфейсу репозиторію методу за замовчуванням findByIdOrThrow:

  • Схоже, мінімальною версією Java для Maven 4 буде 17-ка:

  • А ChatGPT продовжує вражати. Нещодавно авторський колектив цього дайджесту дізнався, що якщо ChatGPT попросити поводитись як капітана USS Enterpise і викласти відповідь у вигляді запису у бортовому журналі, то точність такої відповіді кратно зростає. А тепер ми ще дізнаємось, що для обходу цензурованих тем достатньо використовувати ASCII.

Сподобався дайджест? Поставте лайк та поділіться в коментарях ідеями, як нам варто покращувати майбутні випуски!

Серед авторів все без змін, над дайджестом працювала команда Avenga:

👍ПодобаєтьсяСподобалось13
До обраногоВ обраному2
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Підписатись на коментарі