Маршрутизатор запросов к моделям на Spring AI TypeSafe
Spring Boot 4.1.1 и стартер Spring AI TypeSafe 0.1.0: в туториале запрос сначала получает оценку сложности, затем направляется к выбранной модели. Приветствие и задача по проектированию архитектуры могут требовать разных моделей.
В разборе сборки маршрутизатора с нуля четыре уровня моделей описаны в enum. Jev, модель для структурированных решений, получает запрос и выбирает уровень по этим описаниям. Вместе с выбором возвращаются оценка уверенности и вероятности для каждого уровня: по ним можно смотреть, как изменения описаний влияют на решение.
Для маршрутизатора достаточно стартера. Без свойства spring.ai.typesafe.api-key он не создаст бин TypeSafeClient. Проект пока находится в Spring AI Community и не входит в основной репозиторий Spring AI.
#spring #java
Spring Boot 4.1.1 и стартер Spring AI TypeSafe 0.1.0: в туториале запрос сначала получает оценку сложности, затем направляется к выбранной модели. Приветствие и задача по проектированию архитектуры могут требовать разных моделей.
В разборе сборки маршрутизатора с нуля четыре уровня моделей описаны в enum. Jev, модель для структурированных решений, получает запрос и выбирает уровень по этим описаниям. Вместе с выбором возвращаются оценка уверенности и вероятности для каждого уровня: по ним можно смотреть, как изменения описаний влияют на решение.
Для маршрутизатора достаточно стартера. Без свойства spring.ai.typesafe.api-key он не создаст бин TypeSafeClient. Проект пока находится в Spring AI Community и не входит в основной репозиторий Spring AI.
#spring #java
Регистрация плагинов по списку через BeanRegistrar в Spring Framework 7
Spring Framework 7 и Spring Boot 4 позволяют программно регистрировать бины через
Регистратор читает свойства
Автор отмечает, что для большинства случаев условной регистрации бинов, по его мнению, достаточно аннотаций семейства
#spring #java
Spring Framework 7 и Spring Boot 4 позволяют программно регистрировать бины через
BeanRegistrar. В руководстве по подключению плагинов разобран пример приложения, где набор плагинов задаётся списком в настройках.Регистратор читает свойства
app.plugins[0], app.plugins[1] и далее через Environment, пока не встретит отсутствующее значение. Затем сопоставляет имена плагинов с классами и регистрирует их через BeanRegistry. Подключение самого регистратора показано через @Import.Автор отмечает, что для большинства случаев условной регистрации бинов, по его мнению, достаточно аннотаций семейства
@ConditionalOn….#spring #java
Вызов диагностических команд JVM из Java без запуска jcmd
Каждый запуск jcmd создаёт новую JVM. Если вы встраиваете диагностику в собственный Java-инструмент, команды можно вызывать через JMX, встроенный механизм управления JVM.
В руководстве по вызову DiagnosticCommand разобрано подключение к работающей JVM через Attach API: запуск локального агента управления, получение MBeanServerConnection и вызов команды через
Имена команд нужно преобразовать:
#java #jvm
Каждый запуск jcmd создаёт новую JVM. Если вы встраиваете диагностику в собственный Java-инструмент, команды можно вызывать через JMX, встроенный механизм управления JVM.
В руководстве по вызову DiagnosticCommand разобрано подключение к работающей JVM через Attach API: запуск локального агента управления, получение MBeanServerConnection и вызов команды через
invoke. Пример получает параметры JVM и команду запуска Java-приложения.Имена команд нужно преобразовать:
VM.command_line становится vmCommandLine. В статье есть функция преобразования и полный код вызова. Пример пока не поддерживает аргументы диагностических команд.#java #jvm
👍1
Spring Framework 7: настройка повторов при сбоях
В Spring Framework 7 и Spring Boot 4 повторы доступны без отдельной зависимости spring-retry. В разборе настройки повторов показаны два способа: аннотация
При миграции
В примерах множитель задержки 2 увеличивает паузы до 1, 2, 4, 8 и 16 секунд, а jitter добавляет случайное отклонение. Для программного варианта показана сборка
#spring #java
В Spring Framework 7 и Spring Boot 4 повторы доступны без отдельной зависимости spring-retry. В разборе настройки повторов показаны два способа: аннотация
@Retryable на методе и программный вызов через RetryTemplate.При миграции
@EnableRetry заменяется на @EnableResilientMethods. Меняется и подсчёт вызовов: прежний maxAttempts = 6 включал первую попытку, а новый maxRetries = 5 задаёт только повторы. Общее число попыток остаётся тем же.В примерах множитель задержки 2 увеличивает паузы до 1, 2, 4, 8 и 16 секунд, а jitter добавляет случайное отклонение. Для программного варианта показана сборка
RetryPolicy и выполнение вызова через RetryTemplate.execute(). Повторы не заменяют поиск причины сбоя.#spring #java
😁2
Аварийные отчёты HotSpot: чтение hs_err и удаление чувствительных данных
При падении JVM обычно оставляет файл hs_err с ошибкой и состоянием процесса. В заголовке можно найти место сбоя и версии JVM и ОС, в разделе потока — стек Java- и нативных вызовов.
Разбор отчёта на примерах показывает, где искать состояние памяти, события компиляции и сборки мусора, загрузку классов и библиотек, чтобы выяснить, что JVM делала перед падением.
Для подготовки файла к передаче коллегам автор предлагает jhserr: можно скрыть имена пользователей и хостов, пути и переменные окружения прямо в браузере. Есть и расширение для VSCode с подсветкой и навигацией по разделам отчёта.
#jvm #java
При падении JVM обычно оставляет файл hs_err с ошибкой и состоянием процесса. В заголовке можно найти место сбоя и версии JVM и ОС, в разделе потока — стек Java- и нативных вызовов.
Разбор отчёта на примерах показывает, где искать состояние памяти, события компиляции и сборки мусора, загрузку классов и библиотек, чтобы выяснить, что JVM делала перед падением.
Для подготовки файла к передаче коллегам автор предлагает jhserr: можно скрыть имена пользователей и хостов, пути и переменные окружения прямо в браузере. Есть и расширение для VSCode с подсветкой и навигацией по разделам отчёта.
#jvm #java
👍1
Переход на Jackson 3 в Spring Boot 4: настройка JsonMapper и изменения JSON
Spring Boot 4 использует Jackson 3. При миграции меняются пакеты и настройки по умолчанию: ObjectMapper переехал в
В разборе миграции на JsonMapper есть примеры конфигурации через Builder и JsonMapperBuilderCustomizer. Новый mapper поддерживает Optional и LocalDateTime без отдельных модулей, а вместо проверяемых исключений выбрасывает непроверяемые JacksonException.
Отдельно разобраны изменения поведения: null для примитивов теперь вызывает ошибку, даты по умолчанию сериализуются без Unix-меток времени, а поля JSON сортируются по алфавиту. Последнее может затронуть тесты, которые зависят от порядка полей.
#spring #java
Spring Boot 4 использует Jackson 3. При миграции меняются пакеты и настройки по умолчанию: ObjectMapper переехал в
tools.jackson, но аннотации вроде @JsonProperty остались в com.fasterxml ради совместимости.В разборе миграции на JsonMapper есть примеры конфигурации через Builder и JsonMapperBuilderCustomizer. Новый mapper поддерживает Optional и LocalDateTime без отдельных модулей, а вместо проверяемых исключений выбрасывает непроверяемые JacksonException.
Отдельно разобраны изменения поведения: null для примитивов теперь вызывает ошибку, даты по умолчанию сериализуются без Unix-меток времени, а поля JSON сортируются по алфавиту. Последнее может затронуть тесты, которые зависят от порядка полей.
#spring #java
❤1
Хаотичный планировщик помог найти ошибку в тесте JFR
В январском разборе Йоханнес Бехбергер исследовал JDK-8366486: тест CPU-time sampling обычно проходил, хотя после первой записи останавливал поток, создававший нагрузку.
Вторая запись могла получить событие от внутреннего потока
Автор использовал
Это конкретный кейс и экспериментальный инструмент, а не универсальный детектор гонок. В статье автор также объясняет, почему причина оказалась ошибкой проверки, а не просто проблемой синхронизации.
Разбор Бехбергера и устройство теста
#java #jvm
В январском разборе Йоханнес Бехбергер исследовал JDK-8366486: тест CPU-time sampling обычно проходил, хотя после первой записи останавливал поток, создававший нагрузку.
Вторая запись могла получить событие от внутреннего потока
JFR Periodic Tasks. Это маскировало ошибку самого теста. Успешный прогон ещё не означал, что проверяется нужный сценарий.Автор использовал
concurrency-fuzz-scheduler: написанный на Java прототип планировщика Linux меняет расписание потоков случайными паузами. С ним ошибочную ветку удалось воспроизвести быстрее, а исправленную — отдельно проверить повторными запусками.Это конкретный кейс и экспериментальный инструмент, а не универсальный детектор гонок. В статье автор также объясняет, почему причина оказалась ошибкой проверки, а не просто проблемой синхронизации.
Разбор Бехбергера и устройство теста
#java #jvm
🔥1👏1
Spring Boot Actuator: свои проверки здоровья и доступ к диагностике
В Spring Boot 4 проверки liveness и readiness включены по умолчанию. Первая показывает, нужен ли приложению перезапуск; вторая определяет, готово ли оно принимать трафик. По умолчанию они учитывают состояние запуска и остановки приложения, а дополнительные проверки можно включить в их группы.
В руководстве по настройке Actuator показано, как создать свой HealthIndicator, объединить проверки в группу и разрешить просмотр деталей только пользователям с ролью admin. Случайный статус в примере служит учебной демонстрацией, а не проверкой для рабочего сервиса.
Детали проверок могут раскрывать чувствительные сведения, например название используемой СУБД. Автор показывает, как скрыть их или ограничить доступ авторизованными пользователями.
#spring #java
В Spring Boot 4 проверки liveness и readiness включены по умолчанию. Первая показывает, нужен ли приложению перезапуск; вторая определяет, готово ли оно принимать трафик. По умолчанию они учитывают состояние запуска и остановки приложения, а дополнительные проверки можно включить в их группы.
В руководстве по настройке Actuator показано, как создать свой HealthIndicator, объединить проверки в группу и разрешить просмотр деталей только пользователям с ролью admin. Случайный статус в примере служит учебной демонстрацией, а не проверкой для рабочего сервиса.
Детали проверок могут раскрывать чувствительные сведения, например название используемой СУБД. Автор показывает, как скрыть их или ограничить доступ авторизованными пользователями.
#spring #java
❤2👏1
Spring Boot и PostgreSQL: дедлок может быть в транзакциях
Приложение получило ошибку
Достаточно двух строк: транзакция A обновила первую и ждёт вторую, B — наоборот. Такие дедлоки возможны даже без явного
PostgreSQL прервёт одну транзакцию, чтобы остальные продолжили работу. Какая станет жертвой, заранее полагаться нельзя. В локальной проверке двух сессий получен именно
Базовый способ избежать цикла — брать блокировки в согласованном порядке во всех путях приложения. Если всё же повторяете запрос после дедлока, повторять нужно транзакцию целиком, а не только последнюю упавшую команду.
Дедлоки и порядок блокировок
#spring #java
Приложение получило ошибку
40P01? Это PostgreSQL обнаружил цикл ожидания блокировок, а не доказательство взаимной блокировки Java-потоков.Достаточно двух строк: транзакция A обновила первую и ждёт вторую, B — наоборот. Такие дедлоки возможны даже без явного
LOCK TABLE, потому что обновление строки тоже берёт блокировку.PostgreSQL прервёт одну транзакцию, чтобы остальные продолжили работу. Какая станет жертвой, заранее полагаться нельзя. В локальной проверке двух сессий получен именно
deadlock detected с SQLSTATE 40P01.Базовый способ избежать цикла — брать блокировки в согласованном порядке во всех путях приложения. Если всё же повторяете запрос после дедлока, повторять нужно транзакцию целиком, а не только последнюю упавшую команду.
Дедлоки и порядок блокировок
#spring #java
👍1
Почему копирование HashMap стало быстрее в JDK 27
При вызове
В JDK 27 добавили отдельный путь для источника, который является именно HashMap, и для неизменяемой обёртки над такой картой. Реализация обходит внутреннюю таблицу напрямую и использует хеш, уже сохранённый в узле. Это касается и конструктора
В разборе оптимизаций JDK 27 приведены JMH-замеры на AWS Graviton: в выбранных сценариях время операции сократилось на 61–86%. Это результаты конкретных микробенчмарков.
Для других типов исходной Map остаётся общий путь. При обновлении сервиса полезно проверить копирование карт на своих данных: размеры коллекций и типы источников влияют на результат.
#java #производительность
При вызове
putAll() карта раньше читала элементы источника через интерфейс Map: создавала итератор, получала ключи и значения, снова вычисляла хеши. Несколько реализаций Map в одном месте вызова усложняли оптимизацию для JIT.В JDK 27 добавили отдельный путь для источника, который является именно HashMap, и для неизменяемой обёртки над такой картой. Реализация обходит внутреннюю таблицу напрямую и использует хеш, уже сохранённый в узле. Это касается и конструктора
HashMap(Map).В разборе оптимизаций JDK 27 приведены JMH-замеры на AWS Graviton: в выбранных сценариях время операции сократилось на 61–86%. Это результаты конкретных микробенчмарков.
Для других типов исходной Map остаётся общий путь. При обновлении сервиса полезно проверить копирование карт на своих данных: размеры коллекций и типы источников влияют на результат.
#java #производительность
Java в браузере: редактировать, компилировать, запускать
В учебном примере удобно поменять строку Java и сразу увидеть результат. Petr Pravda показывает приложение на React и Vite, в котором компиляция выполняется на устройстве читателя.
TeaVM преобразует Java-байткод в JavaScript или WebAssembly. Чтобы пользователь мог менять исходник, автор добавляет teavm-javac: Java-компилятор тоже работает в браузере. Web Worker получает код, компилирует его и возвращает результат странице, сохраняя отзывчивость редактора.
В демо есть отдельные кнопки Compile Java и Run Java. Программа считает простые числа, рисует небольшой фрактал и показывает доступные системные свойства. Запрос к серверу для компиляции не нужен.
Среда отличается от обычной JVM: доступна часть стандартной библиотеки, а код с JNI, динамической загрузкой классов и произвольной рефлексией потребует изменений. Доступа к файлам и переменным оболочки посетителя тоже нет.
#java #webassembly
В учебном примере удобно поменять строку Java и сразу увидеть результат. Petr Pravda показывает приложение на React и Vite, в котором компиляция выполняется на устройстве читателя.
TeaVM преобразует Java-байткод в JavaScript или WebAssembly. Чтобы пользователь мог менять исходник, автор добавляет teavm-javac: Java-компилятор тоже работает в браузере. Web Worker получает код, компилирует его и возвращает результат странице, сохраняя отзывчивость редактора.
В демо есть отдельные кнопки Compile Java и Run Java. Программа считает простые числа, рисует небольшой фрактал и показывает доступные системные свойства. Запрос к серверу для компиляции не нужен.
Среда отличается от обычной JVM: доступна часть стандартной библиотеки, а код с JNI, динамической загрузкой классов и произвольной рефлексией потребует изменений. Доступа к файлам и переменным оболочки посетителя тоже нет.
#java #webassembly
🔥1
Как собрать Swing-приложение без JVM у пользователя
Quarkus Desktop помогает собрать приложение на AWT или Swing в нативный исполняемый файл. Расширение регистрирует необходимые классы, ресурсы и JNI-вызовы для GraalVM, а библиотеки JDK размещает рядом с бинарником.
В руководстве автора окно становится CDI-компонентом. Оно получает зависимости через
Долгие операции выполняют в фоновом executor, а обновление интерфейса возвращают на EDT через
Нативная сборка выполняется под целевую ОС. Для macOS нужны Quarkus 4.0 и GraalVM 25.1 или новее; на Windows arm64 доступен режим JVM. Динамически загружать неизвестные при сборке классы в нативном приложении нельзя.
#java #swing
Quarkus Desktop помогает собрать приложение на AWT или Swing в нативный исполняемый файл. Расширение регистрирует необходимые классы, ресурсы и JNI-вызовы для GraalVM, а библиотеки JDK размещает рядом с бинарником.
В руководстве автора окно становится CDI-компонентом. Оно получает зависимости через
@Inject и открывается по DesktopStartupEvent в потоке обработки событий Swing — EDT.Долгие операции выполняют в фоновом executor, а обновление интерфейса возвращают на EDT через
EdtExecutor. Для окон подходят области @Singleton и @Dependent: обычный CDI-прокси для Swing-компонента создаёт проблемы.Нативная сборка выполняется под целевую ОС. Для macOS нужны Quarkus 4.0 и GraalVM 25.1 или новее; на Windows arm64 доступен режим JVM. Динамически загружать неизвестные при сборке классы в нативном приложении нельзя.
#java #swing
Lathe: конфигурация редактора из реальной Maven-сборки
Maven собирает проект, а редактор подчёркивает рабочий код как ошибочный. Причина может быть в разных представлениях о module path, зависимостях или обработчиках аннотаций.
Alexey Gavrilov предлагает Java language server Lathe. Расширение Maven записывает параметры компиляции и тестов из самой сборки. Сервер читает этот снимок, чтобы настроить подсказки, диагностику, запуск и отладку. Следующая сборка обновляет конфигурацию.
Для первого захвата после подключения расширения используется:
Папку
Нужны Java 21+ и Maven 3.x. Проект пока молодой: наиболее полный клиент есть для Neovim, Emacs работает через Eglot, поддержка VS Code находится в планах.
#java #maven
Maven собирает проект, а редактор подчёркивает рабочий код как ошибочный. Причина может быть в разных представлениях о module path, зависимостях или обработчиках аннотаций.
Alexey Gavrilov предлагает Java language server Lathe. Расширение Maven записывает параметры компиляции и тестов из самой сборки. Сервер читает этот снимок, чтобы настроить подсказки, диагностику, запуск и отладку. Следующая сборка обновляет конфигурацию.
Для первого захвата после подключения расширения используется:
mvn clean test -Dlathe.capture.only=true
Папку
.lathe/ автор рекомендует добавить в .gitignore. Запуски и тесты затем воспроизводятся по сохранённым настройкам без нового вызова Maven.Нужны Java 21+ и Maven 3.x. Проект пока молодой: наиболее полный клиент есть для Neovim, Emacs работает через Eglot, поддержка VS Code находится в планах.
#java #maven
❤1👍1
Что меняется в TLS 1.3 с JDK 27
JDK 27 поддерживает гибридный обмен ключами: группа
В обзоре Java Security Sean Mullan объясняет и другие изменения TLS. Цепочки сертификатов теперь могут передаваться со сжатием zlib, а редко используемые группы
Для настройки групп есть свойство
При переходе стоит проверить соединения с реальными клиентами и серверами. Поддержка новой группы в JDK ещё не означает, что каждое соединение её согласует: результат зависит и от возможностей второй стороны.
#java #tls
JDK 27 поддерживает гибридный обмен ключами: группа
X25519MLKEM768 объединяет классическую кривую X25519 и постквантовый алгоритм ML-KEM. Она включена по умолчанию, но для её использования поддержку должны иметь обе стороны соединения.В обзоре Java Security Sean Mullan объясняет и другие изменения TLS. Цепочки сертификатов теперь могут передаваться со сжатием zlib, а редко используемые группы
ffdhe6144 и ffdhe8192 убраны из списка по умолчанию.Для настройки групп есть свойство
jdk.tls.namedGroups и метод SSLParameters.setNamedGroups(). Удалённые из стандартного списка группы можно явно включить, если они нужны для совместимости.При переходе стоит проверить соединения с реальными клиентами и серверами. Поддержка новой группы в JDK ещё не означает, что каждое соединение её согласует: результат зависит и от возможностей второй стороны.
#java #tls
В JavaDoc предлагают отдельный тег для предупреждений
Совет по использованию метода или важное ограничение легко потерять внутри длинного описания. Для JDK 28 предлагают тег
В заметке OpenJDK Quality Outreach показаны два варианта: встроенная заметка с вертикальной полосой и блочная с отдельным заголовком. Заголовок можно изменить, например на Caution:
Атрибуты
Пока это предлагаемые изменения для JDK 28. Пример полезен для знакомства с будущим форматом; использовать его как поддерживаемый синтаксис в документации проекта на JDK 27 рано.
#java #документация
Совет по использованию метода или важное ограничение легко потерять внутри длинного описания. Для JDK 28 предлагают тег
@note, который выделяет такие фрагменты при генерации документации.В заметке OpenJDK Quality Outreach показаны два варианта: встроенная заметка с вертикальной полосой и блочная с отдельным заголовком. Заголовок можно изменить, например на Caution:
/**
* {@note (header='Caution:') Verify untrusted input!}
*/
Атрибуты
kind и id позволяют добавить CSS-класс и идентификатор HTML-элемента. Предложение также предусматривает настройку собственных тегов через параметры javadoc.Пока это предлагаемые изменения для JDK 28. Пример полезен для знакомства с будущим форматом; использовать его как поддерживаемый синтаксис в документации проекта на JDK 27 рано.
#java #документация
Почему javac разрешает удалить Integer из Set<Short>
Метод
В последней строке
В разборе Error Prone показано, как находить подобные ошибки при компиляции. Инструмент подключается к javac и использует сведения о типах: проверка CollectionIncompatibleType замечает несовместимый аргумент коллекции.
Другой пример —
#java #инструменты
Метод
remove(Object) принимает любой объект. Поэтому такой код компилируется, но оставляет элемент в коллекции:Set<Short> values = new HashSet<>();
values.add((short) 1);
values.remove(1);
В последней строке
1 упаковывается в Integer. В наборе лежит Short, и равными эти объекты не считаются.В разборе Error Prone показано, как находить подобные ошибки при компиляции. Инструмент подключается к javac и использует сведения о типах: проверка CollectionIncompatibleType замечает несовместимый аргумент коллекции.
Другой пример —
YYYY вместо yyyy в формате даты: год недели может отличаться от календарного в конце декабря. Проверка MisusedWeekYear помогает поймать и эту ошибку. Для правил своей команды можно написать BugChecker, а повторяющиеся замены описать Java-шаблонами Refaster.#java #инструменты
😁1
Hibernate Validator 9.2: проверки паролей через аннотации
В первой бете Hibernate Validator 9.2 появились
В описании релиза есть важная подробность: готового оценщика стойкости и сервиса проверки утечек библиотека не предоставляет. Приложение подключает свои реализации PasswordStrengthEstimator и CompromisedPasswordChecker.
Все три ограничения считают null допустимым значением. Обязательное поле нужно дополнительно пометить
PasswordPolicy объединяет правила в повторно используемый класс. Каждое нарушенное правило создаёт собственную ошибку валидации, поэтому можно показать, какие требования не выполнены.
Это бета; многие новые API ещё экспериментальные. Примеры подключения сервисов в статье стоит рассматривать как основу для знакомства с интерфейсами.
#java #hibernate
В первой бете Hibernate Validator 9.2 появились
@PasswordStrength, @NotCompromised и @PasswordPolicy. Они позволяют проверять стойкость пароля, наличие в известных утечках и соблюдение набора правил.В описании релиза есть важная подробность: готового оценщика стойкости и сервиса проверки утечек библиотека не предоставляет. Приложение подключает свои реализации PasswordStrengthEstimator и CompromisedPasswordChecker.
Все три ограничения считают null допустимым значением. Обязательное поле нужно дополнительно пометить
@NotNull или @NotBlank.PasswordPolicy объединяет правила в повторно используемый класс. Каждое нарушенное правило создаёт собственную ошибку валидации, поэтому можно показать, какие требования не выполнены.
Это бета; многие новые API ещё экспериментальные. Примеры подключения сервисов в статье стоит рассматривать как основу для знакомства с интерфейсами.
#java #hibernate
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 #сборка
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