Jenesis: сборка Java-проекта из module-info.java
Имя модуля и его зависимости уже описаны в Java-коде. Рафаэль Винтерхальтер, автор Byte Buddy, предлагает использовать эту информацию и для сборки.
В знакомстве с Jenesis основным описанием проекта становится
Команда pin фиксирует версии зависимостей и контрольные суммы. Шаги сборки кешируются по входным данным, а для тестов инструмент определяет, какие из них затрагивает изменение.
Для знакомства не обязательно сразу переводить проект на модули: Jenesis умеет читать и pom.xml. В статье есть примеры многомодульной сборки, общего кеша и генерации кода. Перед переходом остаётся проверить, как инструмент справляется с особыми шагами именно вашей сборки.
#java #сборка
Имя модуля и его зависимости уже описаны в Java-коде. Рафаэль Винтерхальтер, автор Byte Buddy, предлагает использовать эту информацию и для сборки.
В знакомстве с Jenesis основным описанием проекта становится
module-info.java. Дополнительные сведения, например главный класс, задаются тегами в Javadoc. Сам инструмент хранится в репозитории как Java-исходники и запускается на JDK 25+:java build/jenesis/Make.java
Команда pin фиксирует версии зависимостей и контрольные суммы. Шаги сборки кешируются по входным данным, а для тестов инструмент определяет, какие из них затрагивает изменение.
Для знакомства не обязательно сразу переводить проект на модули: Jenesis умеет читать и pom.xml. В статье есть примеры многомодульной сборки, общего кеша и генерации кода. Перед переходом остаётся проверить, как инструмент справляется с особыми шагами именно вашей сборки.
#java #сборка
Мониторинг Spring Boot на небольшом VPS
Для нескольких сервисов бывает достаточно видеть задержки, ошибки, память и перезапуски. В руководстве по StatLite показана панель, которая собирает эти данные из Spring Boot Actuator.
StatLite запускается одним Go-бинарником и хранит историю в SQLite. На стороне приложения нужны Actuator, Micrometer с prometheus-registry и доступные сборщику endpoints health и prometheus. Отдельный сервер Prometheus для этого варианта не требуется.
В конфигурации задаются адрес приложения, интервал опроса и тайм-аут. Панель по умолчанию привязана к localhost; доступ к Actuator тоже стоит ограничить сетью и аутентификацией.
Решение рассчитано на небольшой набор приложений. Для распределённых трассировок, централизованных журналов, сложных запросов к метрикам и маршрутизации оповещений понадобится более широкая система. В статье есть готовый демонстрационный Spring Boot-сервис с генератором трафика.
#spring #мониторинг
Для нескольких сервисов бывает достаточно видеть задержки, ошибки, память и перезапуски. В руководстве по StatLite показана панель, которая собирает эти данные из Spring Boot Actuator.
StatLite запускается одним Go-бинарником и хранит историю в SQLite. На стороне приложения нужны Actuator, Micrometer с prometheus-registry и доступные сборщику endpoints health и prometheus. Отдельный сервер Prometheus для этого варианта не требуется.
В конфигурации задаются адрес приложения, интервал опроса и тайм-аут. Панель по умолчанию привязана к localhost; доступ к Actuator тоже стоит ограничить сетью и аутентификацией.
Решение рассчитано на небольшой набор приложений. Для распределённых трассировок, централизованных журналов, сложных запросов к метрикам и маршрутизации оповещений понадобится более широкая система. В статье есть готовый демонстрационный Spring Boot-сервис с генератором трафика.
#spring #мониторинг
❤1
Hibernate 8: проверки версий при конкурентных обновлениях
Оптимистическая блокировка должна обнаружить, что между чтением и записью сущность уже изменил другой запрос. Детали реализации и поведение базы здесь имеют значение.
В разборе изменений Hibernate 8 Beta2 команда описывает усиленные проверки версий: они учитывают ситуации, в которых конкурентное изменение раньше могло остаться незамеченным. Поддержку блокировки по версии получили StatelessSession и EntityAgent из Jakarta Persistence.
Ещё одно изменение касается параллельных upsert в StatelessSession: обработка учитывает гонку вставки. Для разделения данных по арендаторам их идентификаторы последовательно включаются в SQL изменения данных.
Это повод добавить к проверке миграции сценарии с одновременными обновлениями и вставками. Ветка Hibernate 8 пока тестовая; после описанной Beta2 уже вышла Beta3. Возможности из заметки полезно оценивать вместе с актуальным руководством по миграции.
#java #hibernate
Оптимистическая блокировка должна обнаружить, что между чтением и записью сущность уже изменил другой запрос. Детали реализации и поведение базы здесь имеют значение.
В разборе изменений Hibernate 8 Beta2 команда описывает усиленные проверки версий: они учитывают ситуации, в которых конкурентное изменение раньше могло остаться незамеченным. Поддержку блокировки по версии получили StatelessSession и EntityAgent из Jakarta Persistence.
Ещё одно изменение касается параллельных upsert в StatelessSession: обработка учитывает гонку вставки. Для разделения данных по арендаторам их идентификаторы последовательно включаются в SQL изменения данных.
Это повод добавить к проверке миграции сценарии с одновременными обновлениями и вставками. Ветка Hibernate 8 пока тестовая; после описанной Beta2 уже вышла Beta3. Возможности из заметки полезно оценивать вместе с актуальным руководством по миграции.
#java #hibernate
Как HotSpot ускоряет криптографию внутри JDK
Реализация алгоритма написана на Java, но некоторые часто выполняемые операции JVM может заменить машинным кодом под конкретный процессор. Такой механизм называется intrinsic.
В статье команды Java он разобран на постквантовых ML-KEM, ML-DSA и HSS/LMS. У первых двух много повторяющихся операций с коэффициентами полиномов — подходящая работа для векторных инструкций. Проверка подписей HSS/LMS выигрывает от ускорения SHA-256.
Аннотация
В статье приведены замеры JDK 28 на Linux/AArch64. Они сравнивают отдельные алгоритмы с включёнными intrinsics и без них. При оценке результата важны набор параметров алгоритма и возможности CPU: ускорение криптографической операции само по себе не определяет скорость всего сервиса.
#java #jvm
Реализация алгоритма написана на Java, но некоторые часто выполняемые операции JVM может заменить машинным кодом под конкретный процессор. Такой механизм называется intrinsic.
В статье команды Java он разобран на постквантовых ML-KEM, ML-DSA и HSS/LMS. У первых двух много повторяющихся операций с коэффициентами полиномов — подходящая работа для векторных инструкций. Проверка подписей HSS/LMS выигрывает от ускорения SHA-256.
Аннотация
@IntrinsicCandidate отмечает методы, для которых HotSpot может применить такую замену. Java-реализация остаётся запасным вариантом, если подходящего ускорения на платформе нет.В статье приведены замеры JDK 28 на Linux/AArch64. Они сравнивают отдельные алгоритмы с включёнными intrinsics и без них. При оценке результата важны набор параметров алгоритма и возможности CPU: ускорение криптографической операции само по себе не определяет скорость всего сервиса.
#java #jvm
❤1
Quarkus 4: что проверить перед миграцией
Первая бета Quarkus 4 меняет базовые зависимости сразу в нескольких частях приложения. Минимальная версия Java теперь 21, сетевой стек переходит на Netty 4.2 и Vert.x 5.
В обзоре команды также перечислены Hibernate ORM 8, Jackson 3, CDI 5.0 и Jakarta REST 4. Поэтому обновление стоит начинать с проверки расширений, сериализации и работы с базой. Для перехода подготовлено отдельное руководство.
Из новых возможностей — HTTP/3, который включается явно, и Observation API: аннотация
Релиз пока тестовый. Команда просит разработчиков расширений проверять совместимость, а пользователей — прогонять приложения и сообщать о проблемах. Хорошая задача для отдельной ветки: пройти миграцию и посмотреть на поведение интеграционных тестов.
#java #quarkus
Первая бета Quarkus 4 меняет базовые зависимости сразу в нескольких частях приложения. Минимальная версия Java теперь 21, сетевой стек переходит на Netty 4.2 и Vert.x 5.
В обзоре команды также перечислены Hibernate ORM 8, Jackson 3, CDI 5.0 и Jakarta REST 4. Поэтому обновление стоит начинать с проверки расширений, сериализации и работы с базой. Для перехода подготовлено отдельное руководство.
Из новых возможностей — HTTP/3, который включается явно, и Observation API: аннотация
@Observed или программный интерфейс создают метрики и трассировки через Micrometer и OpenTelemetry. В Dev UI появилась встроенная панель наблюдения.Релиз пока тестовый. Команда просит разработчиков расширений проверять совместимость, а пользователей — прогонять приложения и сообщать о проблемах. Хорошая задача для отдельной ветки: пройти миграцию и посмотреть на поведение интеграционных тестов.
#java #quarkus
❤1
Spring AI: похожий документ ещё не содержит ответа
Векторный поиск нашёл текст по теме, но в ответ модели снова попала справочная информация вместо нужного факта. Для такого случая в примере Spring AI Modular RAG поиск разделён на несколько этапов.
Сначала модель переписывает вопрос для поиска и создаёт несколько его вариантов. Найденные фрагменты объединяются, после чего JevDocumentFilter отсеивает неподходящие, а JevDocumentReranker меняет порядок и оставляет лучшие.
Компоненты реализуют интерфейс DocumentPostProcessor и подключаются к RetrievalAugmentationAdvisor. Их можно менять отдельно от хранилища и модели, которая формирует ответ.
Есть полезная деталь: фильтрация и формирование контекста используют исходный вопрос пользователя. Переписанный запрос нужен только для поиска. В статье рядом лежат простая и модульная версии примера — удобно сравнить, какие фрагменты дошли до модели и почему часть была исключена.
#spring #java #rag
Векторный поиск нашёл текст по теме, но в ответ модели снова попала справочная информация вместо нужного факта. Для такого случая в примере Spring AI Modular RAG поиск разделён на несколько этапов.
Сначала модель переписывает вопрос для поиска и создаёт несколько его вариантов. Найденные фрагменты объединяются, после чего JevDocumentFilter отсеивает неподходящие, а JevDocumentReranker меняет порядок и оставляет лучшие.
Компоненты реализуют интерфейс DocumentPostProcessor и подключаются к RetrievalAugmentationAdvisor. Их можно менять отдельно от хранилища и модели, которая формирует ответ.
Есть полезная деталь: фильтрация и формирование контекста используют исходный вопрос пользователя. Переписанный запрос нужен только для поиска. В статье рядом лежат простая и модульная версии примера — удобно сравнить, какие фрагменты дошли до модели и почему часть была исключена.
#spring #java #rag
❤1👍1
Java-сервер с генерацией зависимостей при сборке
Маршруты HTTP и создание компонентов можно подготовить до запуска приложения. В разборе Codename One Backend показано, как аннотации превращаются в обычные Java-классы для маршрутизации и внедрения зависимостей.
Сгенерированный код создаёт объекты прямыми вызовами конструкторов. Отсутствующие зависимости, неоднозначный выбор компонента и циклы конструкторов приводят к ошибке сборки. Затем ParparVM переводит байткод в C для нативной компиляции.
Названия аннотаций напоминают Spring, но находятся в собственном пакете com.codename1.backend.annotations. Это отдельный развивающийся проект со своим набором возможностей.
В статье есть сравнение старта и памяти с Spring Boot, однако замеры сделаны на двух простых HTTP-обработчиках без базы, TLS и авторизации. Интереснее начать с устройства сгенерированного кода, а показатели своего сервиса проверить с его реальными зависимостями.
#java #производительность
Маршруты HTTP и создание компонентов можно подготовить до запуска приложения. В разборе Codename One Backend показано, как аннотации превращаются в обычные Java-классы для маршрутизации и внедрения зависимостей.
Сгенерированный код создаёт объекты прямыми вызовами конструкторов. Отсутствующие зависимости, неоднозначный выбор компонента и циклы конструкторов приводят к ошибке сборки. Затем ParparVM переводит байткод в C для нативной компиляции.
Названия аннотаций напоминают Spring, но находятся в собственном пакете com.codename1.backend.annotations. Это отдельный развивающийся проект со своим набором возможностей.
В статье есть сравнение старта и памяти с Spring Boot, однако замеры сделаны на двух простых HTTP-обработчиках без базы, TLS и авторизации. Интереснее начать с устройства сгенерированного кода, а показатели своего сервиса проверить с его реальными зависимостями.
#java #производительность
Gradle 9.8 использует настройки зеркал репозиториев из Maven
В компании есть внутреннее зеркало зависимостей, а проекты собираются и Maven, и Gradle? В ветке Gradle 9.8 настройки зеркал можно брать из Maven вместо отдельного описания в каждой сборке.
Включается в
По умолчанию опция выключена. После включения Gradle заменяет адреса подходящих HTTP/HTTPS Maven-репозиториев по правилам зеркал. Это касается и репозиториев сборочных скриптов, и репозиториев в настройках и проектах.
На Ivy, Maven Local, каталоги с JAR-файлами и репозитории через S3/GCS механизм не распространяется.
При обновлении выбирайте патч 9.8.1: он исправляет уязвимости и регрессии первоначального релиза.
#java #gradle
В компании есть внутреннее зеркало зависимостей, а проекты собираются и Maven, и Gradle? В ветке Gradle 9.8 настройки зеркал можно брать из Maven вместо отдельного описания в каждой сборке.
Включается в
gradle.properties:org.gradle.mirror.maven.settings=true
По умолчанию опция выключена. После включения Gradle заменяет адреса подходящих HTTP/HTTPS Maven-репозиториев по правилам зеркал. Это касается и репозиториев сборочных скриптов, и репозиториев в настройках и проектах.
На Ivy, Maven Local, каталоги с JAR-файлами и репозитории через S3/GCS механизм не распространяется.
При обновлении выбирайте патч 9.8.1: он исправляет уязвимости и регрессии первоначального релиза.
#java #gradle
Spring Batch отсекает несовместимые настройки builder ещё при компиляции
Раньше некоторые взаимоисключающие настройки можно было записать в одной цепочке, а ошибку получить только на
В Spring Batch 6.1.0-M2 для нескольких builder-классов ввели поэтапный DSL. После выбора одной стратегии тип возвращаемого объекта ограничивает доступные следующие методы. Некорректную комбинацию теперь отвергает компилятор.
Изменение затрагивает
При миграции проверьте код, который сохраняет промежуточный результат вызова в переменную с типом builder-класса: для него есть несовместимые изменения. Непрерывным цепочкам вызовов, по описанию команды, достаточно перекомпиляции.
M2 — предварительная версия. Хороший повод проверить совместимость до финального релиза.
#java #spring #batch
Раньше некоторые взаимоисключающие настройки можно было записать в одной цепочке, а ошибку получить только на
build().В Spring Batch 6.1.0-M2 для нескольких builder-классов ввели поэтапный DSL. После выбора одной стратегии тип возвращаемого объекта ограничивает доступные следующие методы. Некорректную комбинацию теперь отвергает компилятор.
Изменение затрагивает
FlatFileItemReaderBuilder, FlatFileItemWriterBuilder и JdbcBatchItemWriterBuilder.При миграции проверьте код, который сохраняет промежуточный результат вызова в переменную с типом builder-класса: для него есть несовместимые изменения. Непрерывным цепочкам вызовов, по описанию команды, достаточно перекомпиляции.
M2 — предварительная версия. Хороший повод проверить совместимость до финального релиза.
#java #spring #batch
ИИ-ревьюер на Spring Boot превращает ответ модели в замечания к коду
Отправить diff модели — только начало. Чтобы результат оказался полезен на ревью, нужно связать каждое замечание с файлом, местом в коде и объяснением проблемы.
Автор CodeGuard AI описывает такой процесс на Java и Spring Boot: получить данные PR и изменения, собрать контекст, добавить правила проверки, разобрать ответ модели и подготовить ревью в GitHub.
Замечания хранятся в структурированном виде: что найдено, где, насколько серьёзно и насколько уверена модель. Провайдер вынесен за отдельную абстракцию — можно переключаться между OpenAI, Gemini и Ollama.
Полезная часть статьи — устройство всей цепочки вокруг модели. Структурированный ответ проще фильтровать и проверять, но оценка уверенности сама по себе не подтверждает, что найденная ошибка реальна.
#java #springboot #codereview
Отправить diff модели — только начало. Чтобы результат оказался полезен на ревью, нужно связать каждое замечание с файлом, местом в коде и объяснением проблемы.
Автор CodeGuard AI описывает такой процесс на Java и Spring Boot: получить данные PR и изменения, собрать контекст, добавить правила проверки, разобрать ответ модели и подготовить ревью в GitHub.
Замечания хранятся в структурированном виде: что найдено, где, насколько серьёзно и насколько уверена модель. Провайдер вынесен за отдельную абстракцию — можно переключаться между OpenAI, Gemini и Ollama.
Полезная часть статьи — устройство всей цепочки вокруг модели. Структурированный ответ проще фильтровать и проверять, но оценка уверенности сама по себе не подтверждает, что найденная ошибка реальна.
#java #springboot #codereview
❤1
Helidon 27 переносит контекст с ThreadLocal на ScopedValue
Идентификатор запроса и другие данные контекста нужны в разных слоях приложения. При передаче через
В Helidon 27 активный контекст фреймворка перенесли на
Использовать более новые механизмы Java позволило повышение базовой версии: Helidon 27 требует JDK 27.
Одновременно проект разделяет две линии развития. Helidon 27 — актуальная ветка с новыми возможностями, а Helidon 4.5 остаётся LTS-веткой для команд с более длинным циклом проверки и обновления.
Поэтому переход стоит планировать вместе с обновлением JDK и проверкой зависимостей сервиса.
#java #helidon #jvm
Идентификатор запроса и другие данные контекста нужны в разных слоях приложения. При передаче через
ThreadLocal важно правильно задать и завершить их жизненный цикл.В Helidon 27 активный контекст фреймворка перенесли на
ScopedValue. Значение привязано к ограниченной области выполнения, что помогает согласовать время жизни контекста с работой, для которой он нужен.Использовать более новые механизмы Java позволило повышение базовой версии: Helidon 27 требует JDK 27.
Одновременно проект разделяет две линии развития. Helidon 27 — актуальная ветка с новыми возможностями, а Helidon 4.5 остаётся LTS-веткой для команд с более длинным циклом проверки и обновления.
Поэтому переход стоит планировать вместе с обновлением JDK и проверкой зависимостей сервиса.
#java #helidon #jvm
В JDK 28 готовят простой JSON API для небольших задач
Прочитать JSON-конфигурацию, достать вложенное значение и сформировать небольшой документ — для таких случаев в JDK готовят собственный API разбора, навигации и генерации JSON.
В докладе Everyday JSON in Java Алан Бейтман и Виктор Кланг объясняют, какие задачи он должен закрыть и как подход с ориентацией на данные повлиял на устройство API.
Основной сценарий — простая работа с документом без подключения внешней библиотеки. Авторы отдельно подчёркивают: заменять существующие JSON-библиотеки целиком не планируют.
Для проекта с настройками сериализации, модулями Jackson и преобразованием сложных объектных моделей появление нового API ещё не означает готовой замены.
Для JDK 28 API готовится в статусе incubator. Интерфейс ещё может меняться; стабильной возможностью JDK 27 он не является.
#java #json #jdk28
Прочитать JSON-конфигурацию, достать вложенное значение и сформировать небольшой документ — для таких случаев в JDK готовят собственный API разбора, навигации и генерации JSON.
В докладе Everyday JSON in Java Алан Бейтман и Виктор Кланг объясняют, какие задачи он должен закрыть и как подход с ориентацией на данные повлиял на устройство API.
Основной сценарий — простая работа с документом без подключения внешней библиотеки. Авторы отдельно подчёркивают: заменять существующие JSON-библиотеки целиком не планируют.
Для проекта с настройками сериализации, модулями Jackson и преобразованием сложных объектных моделей появление нового API ещё не означает готовой замены.
Для JDK 28 API готовится в статусе incubator. Интерфейс ещё может меняться; стабильной возможностью JDK 27 он не является.
#java #json #jdk28
🌚3
Pi4J 5 позволяет подменять оборудование при разработке на обычном компьютере
Код для GPIO и датчиков неудобно разрабатывать, если плата должна постоянно лежать рядом. В готовящейся Pi4J 5 добавили возможность использовать реальное оборудование, когда оно доступно, и переходить на заглушки на других системах.
Это помогает проверять логику приложения на рабочем компьютере. Физические подключения, временные характеристики и поведение датчика всё равно нужно проверять на плате.
Заодно команда упрощает API создания устройств: конфигурация собирается через
Pi4J 5 пока находится в разработке, доступны snapshot-сборки. Дата финального релиза не объявлена, поэтому изменения API стоит учитывать до переноса рабочего проекта.
#java #pi4j #iot
Код для GPIO и датчиков неудобно разрабатывать, если плата должна постоянно лежать рядом. В готовящейся Pi4J 5 добавили возможность использовать реальное оборудование, когда оно доступно, и переходить на заглушки на других системах.
Это помогает проверять логику приложения на рабочем компьютере. Физические подключения, временные характеристики и поведение датчика всё равно нужно проверять на плате.
Заодно команда упрощает API создания устройств: конфигурация собирается через
newConfigBuilder() соответствующего типа, затем передаётся в context.create(...). Завершение работы тоже сводят к одному close().Pi4J 5 пока находится в разработке, доступны snapshot-сборки. Дата финального релиза не объявлена, поэтому изменения API стоит учитывать до переноса рабочего проекта.
#java #pi4j #iot
❤1
Spring Tools 5.4 предлагает исправления для аннотаций контроллеров и тестов
Некоторые сочетания аннотаций Spring можно выразить короче и точнее. В Spring Tools 5.4.0 добавили проверки и быстрые исправления для перехода к
Такие подсказки помогают замечать подходящие преобразования прямо в редакторе, не разыскивая каждое сочетание вручную.
Команда также ускорила ряд быстрых исправлений и проверку версий по репозиториям, улучшила надёжность индексации исходников. Дистрибутив для Eclipse обновили до Eclipse 2026-09.
Пригодится при поддержке существующего Spring-проекта: можно пройтись по диагностике и проверить предложенные изменения небольшими порциями. Применять их стоит с просмотром diff и запуском тестов.
#java #spring #инструменты
Некоторые сочетания аннотаций Spring можно выразить короче и точнее. В Spring Tools 5.4.0 добавили проверки и быстрые исправления для перехода к
@RestController, @SpringJUnitConfig, @ApplicationModuleListener и специализированным аннотациям области видимости.Такие подсказки помогают замечать подходящие преобразования прямо в редакторе, не разыскивая каждое сочетание вручную.
Команда также ускорила ряд быстрых исправлений и проверку версий по репозиториям, улучшила надёжность индексации исходников. Дистрибутив для Eclipse обновили до Eclipse 2026-09.
Пригодится при поддержке существующего Spring-проекта: можно пройтись по диагностике и проверить предложенные изменения небольшими порциями. Применять их стоит с просмотром diff и запуском тестов.
#java #spring #инструменты
Payara Community убирает требование повышенных прав для SSH-узлов
В Payara Community 7.2026.10 управление SSH-узлами больше не требует повышенных прав. Для домена на нескольких хостах это упрощает настройку учётной записи, через которую сервер работает с удалённым узлом.
SSH-доступ и необходимые разрешения остаются нужны. Изменение убирает требование избыточных привилегий.
Ещё появились две команды
Ветка Community 7 остаётся на Jakarta EE 11 и MicroProfile 7.1. В статье отдельно перечислены обновления коммерческих веток Azul Payara — их исправления и возможности нужно сверять со своей редакцией.
#java #jakartaee #payara
В Payara Community 7.2026.10 управление SSH-узлами больше не требует повышенных прав. Для домена на нескольких хостах это упрощает настройку учётной записи, через которую сервер работает с удалённым узлом.
SSH-доступ и необходимые разрешения остаются нужны. Изменение убирает требование избыточных привилегий.
Ещё появились две команды
asadmin для управления конфигурацией: delete-jvm-option и delete-system-properties. Исправлены проблемы с конкурентным развёртыванием и запуском приложений после перезапуска домена.Ветка Community 7 остаётся на Jakarta EE 11 и MicroProfile 7.1. В статье отдельно перечислены обновления коммерческих веток Azul Payara — их исправления и возможности нужно сверять со своей редакцией.
#java #jakartaee #payara
Java-расширение Oracle разделяет JDK языкового сервера и проекта
Редактору может требоваться более новая Java, чем приложению. В Java Platform Extension от Oracle для VS Code эти настройки можно разделить.
Например, в настройках рабочего пространства:
Пути замените на свои. Самому расширению нужен JDK 21 или новее, при этом поддерживаются проекты на JDK 8 и выше.
Это пригодится, когда обновить инструменты уже можно, а приложение остаётся на прежней версии Java. Настройки Maven или Gradle при этом тоже нужно согласовать с выбранным JDK проекта.
#java #vscode #jdk
Редактору может требоваться более новая Java, чем приложению. В Java Platform Extension от Oracle для VS Code эти настройки можно разделить.
jdk.jdkhome задаёт JDK языкового сервера и используется для проекта по умолчанию. А jdk.project.jdkhome позволяет выбрать отдельный JDK для сборки и запуска проекта.Например, в настройках рабочего пространства:
{
"jdk.jdkhome": "/opt/jdk-27",
"jdk.project.jdkhome": "/opt/jdk-21"
}Пути замените на свои. Самому расширению нужен JDK 21 или новее, при этом поддерживаются проекты на JDK 8 и выше.
Это пригодится, когда обновить инструменты уже можно, а приложение остаётся на прежней версии Java. Настройки Maven или Gradle при этом тоже нужно согласовать с выбранным JDK проекта.
#java #vscode #jdk
😁1
Testcontainers: одного withReuse(true) мало
Режим Reusable Containers оставляет контейнер работающим после тестов, чтобы следующий запуск мог использовать его снова. Но одного
Нужно разрешить reuse и в окружении: через
Контейнер запускают вручную через
В руководстве Testcontainers режим помечен как экспериментальный и неподходящий для CI. Очистка ресурсов и сеть могут работать не полностью. А сохранённый контейнер с базой ещё не означает чистые данные перед новым тестом: это отдельная задача тестового окружения.
Режим Reusable Containers оставляет контейнер работающим после тестов, чтобы следующий запуск мог использовать его снова. Но одного
withReuse(true) в описании контейнера недостаточно.Нужно разрешить reuse и в окружении: через
TESTCONTAINERS_REUSE_ENABLE=true либо запись testcontainers.reuse.enable=true в пользовательском ~/.testcontainers.properties. Файл свойств в classpath для этого не подходит.Контейнер запускают вручную через
start(). Останавливать его нельзя ни прямым stop(), ни через try-with-resources или JUnit-интеграцию, которая завершит его за вас. При следующем запуске конфигурация должна совпадать.В руководстве Testcontainers режим помечен как экспериментальный и неподходящий для CI. Очистка ресурсов и сеть могут работать не полностью. А сохранённый контейнер с базой ещё не означает чистые данные перед новым тестом: это отдельная задача тестового окружения.
☃1
Spring Boot: 20 секунд на фазу остановки
В настройке
Согласно справочнику Spring Boot 4.1.1, graceful shutdown включён по умолчанию для встроенных Jetty, Reactor Netty и Tomcat, в servlet- и reactive-приложениях. При закрытии контекста уже принятым HTTP-запросам дают время завершиться. Новые запросы эти серверы перестают принимать на сетевом уровне. При постоянных соединениях детали поведения могут отличаться.
Есть ловушка при проверке из IDE: кнопка Stop может оборвать процесс сразу, если среда не отправляет корректный
В настройке
spring.lifecycle.timeout-per-shutdown-phase=20s легко прочитать обещание «приложение завершится за 20 секунд». Но это таймаут отдельной фазы остановки, а не общий лимит завершения процесса. Значение 20 секунд приведено в документации как пример.Согласно справочнику Spring Boot 4.1.1, graceful shutdown включён по умолчанию для встроенных Jetty, Reactor Netty и Tomcat, в servlet- и reactive-приложениях. При закрытии контекста уже принятым HTTP-запросам дают время завершиться. Новые запросы эти серверы перестают принимать на сетевом уровне. При постоянных соединениях детали поведения могут отличаться.
Есть ловушка при проверке из IDE: кнопка Stop может оборвать процесс сразу, если среда не отправляет корректный
SIGTERM. Поэтому сначала проверьте, какой сигнал получает приложение. Иначе принудительное завершение легко принять за ошибку в настройке graceful shutdown.👍2
Bulkhead в Resilience4j: семафор или отдельный пул
Если одна внешняя интеграция заняла все рабочие потоки, остальные запросы тоже могут застрять. Bulkhead позволяет ограничить число одновременных вызовов к выбранной зависимости. Но отдельный пул потоков появляется не в каждой реализации.
У
Такой лимит относится к конкурентным вызовам через конкретный bulkhead. Число запросов в секунду он не задаёт и пропускную способность внешнего сервиса не увеличивает.
Если одна внешняя интеграция заняла все рабочие потоки, остальные запросы тоже могут застрять. Bulkhead позволяет ограничить число одновременных вызовов к выбранной зависимости. Но отдельный пул потоков появляется не в каждой реализации.
SemaphoreBulkhead использует семафор и собственного пула не создаёт. В документации Resilience4j 2.2.0 у maxConcurrentCalls значение по умолчанию 25, у maxWaitDuration — 0. Первый параметр ограничивает одновременные выполнения, второй задаёт, сколько поток может ждать допуска, когда лимит исчерпан.У
FixedThreadPoolBulkhead есть собственный пул и ограниченная очередь. Здесь нужно согласовать размеры пула и queueCapacity. У семафорного варианта размер рабочего пула остаётся вашей заботой.Такой лимит относится к конкурентным вызовам через конкретный bulkhead. Число запросов в секунду он не задаёт и пропускную способность внешнего сервиса не увеличивает.
Spring: событие опубликовано, обработчик не вызван
Событие опубликовано, исключений нет, а метод с
По умолчанию обработчик привязан к
Здесь речь об обычной транзакции, привязанной к потоку. Выбор фазы связывает обработчик с её исходом, но не обеспечивает гарантированную доставку во внешнюю систему.
Transaction-bound Events в Spring
#spring #java
Событие опубликовано, исключений нет, а метод с
@TransactionalEventListener не вызван. Сначала проверьте, была ли в момент публикации активная транзакция.По умолчанию обработчик привязан к
AFTER_COMMIT. При откате он не сработает. Если транзакции вообще нет, Spring пропустит вызов. Атрибут fallbackExecution=true явно разрешает обработку и в этом случае.Здесь речь об обычной транзакции, привязанной к потоку. Выбор фазы связывает обработчик с её исходом, но не обеспечивает гарантированную доставку во внешнюю систему.
Transaction-bound Events в Spring
#spring #java