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
Чашечка Java
Развёрнутое пояснение:
1. Создаётся изменяемый список config, в который добавляется название профиля prod.
2. Collections.unmodifiableList возвращает представление этого списка с запретом изменений через само представление; отдельная копия элементов не создаётся.
3. Через config исходный элемент заменяется на test. Операция разрешена: исходный список остаётся изменяемым. Замена не добавляет второй элемент.
4. При печати view читает актуальное содержимое исходного списка, поэтому вывод содержит единственный элемент test. Исключения нет, поскольку изменение выполнялось через config.
Почему это важно
Задача проверяет понимание коллекций Java и общего изменяемого состояния. Запрет изменений через представление не гарантирует неизменность конфигурации: компонент, сохранивший исходный список, может менять данные, которые видят остальные. Если нужен стабильный снимок, следует сначала скопировать список.
2. Collections.unmodifiableList возвращает представление этого списка с запретом изменений через само представление; отдельная копия элементов не создаётся.
3. Через config исходный элемент заменяется на test. Операция разрешена: исходный список остаётся изменяемым. Замена не добавляет второй элемент.
4. При печати view читает актуальное содержимое исходного списка, поэтому вывод содержит единственный элемент test. Исключения нет, поскольку изменение выполнялось через config.
Почему это важно
Задача проверяет понимание коллекций Java и общего изменяемого состояния. Запрет изменений через представление не гарантирует неизменность конфигурации: компонент, сохранивший исходный список, может менять данные, которые видят остальные. Если нужен стабильный снимок, следует сначала скопировать список.
Аварийные отчёты HotSpot: чтение hs_err и удаление чувствительных данных
При падении JVM обычно оставляет файл hs_err с ошибкой и состоянием процесса. В заголовке можно найти место сбоя и версии JVM и ОС, в разделе потока — стек Java- и нативных вызовов.
Разбор отчёта на примерах показывает, где искать состояние памяти, события компиляции и сборки мусора, загрузку классов и библиотек, чтобы выяснить, что JVM делала перед падением.
Для подготовки файла к передаче коллегам автор предлагает jhserr: можно скрыть имена пользователей и хостов, пути и переменные окружения прямо в браузере. Есть и расширение для VSCode с подсветкой и навигацией по разделам отчёта.
#jvm #java
При падении JVM обычно оставляет файл hs_err с ошибкой и состоянием процесса. В заголовке можно найти место сбоя и версии JVM и ОС, в разделе потока — стек Java- и нативных вызовов.
Разбор отчёта на примерах показывает, где искать состояние памяти, события компиляции и сборки мусора, загрузку классов и библиотек, чтобы выяснить, что JVM делала перед падением.
Для подготовки файла к передаче коллегам автор предлагает jhserr: можно скрыть имена пользователей и хостов, пути и переменные окружения прямо в браузере. Есть и расширение для VSCode с подсветкой и навигацией по разделам отчёта.
#jvm #java
👍1
Forwarded from Типичный программист
🧑💻 Какие навыки помогают вам в разработке в 2026 году?
Что вы чаще используете в работе? В каких задачах помогает ИИ, а где проще справиться самостоятельно?
Мы решили собрать портрет современного разработчика — и приглашаем вас поделиться своим опытом. Расскажите, какие навыки вам пригодились и как вы используете ИИ. Если обходите его стороной, нам тоже интересно узнать почему.
Опрос анонимный и займёт около 5 минут. Результаты опубликуем в общем большом исследовании.
👉 Пройти опрос
Что вы чаще используете в работе? В каких задачах помогает ИИ, а где проще справиться самостоятельно?
Мы решили собрать портрет современного разработчика — и приглашаем вас поделиться своим опытом. Расскажите, какие навыки вам пригодились и как вы используете ИИ. Если обходите его стороной, нам тоже интересно узнать почему.
Опрос анонимный и займёт около 5 минут. Результаты опубликуем в общем большом исследовании.
👉 Пройти опрос
😭2👍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
В Spring сервис OrderService с областью singleton получает ReportBuilder с областью prototype через конструктор, без прокси. Два запроса последовательно вызывают этот сервис. Сколько экземпляров ReportBuilder он использует при этих вызовах?
Anonymous Quiz
18%
Два: каждый вызов сервиса получает новый экземпляр
67%
Один: оба вызова используют экземпляр, переданный в конструктор
7%
Три: один при создании сервиса и по одному на каждый вызов
9%
Возникнет исключение: нельзя внедрить prototype в singleton
Чашечка Java
В Spring сервис OrderService с областью singleton получает ReportBuilder с областью prototype через конструктор, без прокси. Два запроса последовательно вызывают этот сервис. Сколько экземпляров ReportBuilder он использует при этих вызовах?
Развёрнутое пояснение:
1. Spring создаёт OrderService с областью singleton: этот экземпляр сервиса будет обслуживать оба запроса.
2. Для вызова конструктора Spring разрешает зависимость ReportBuilder и создаёт её экземпляр с областью prototype.
3. OrderService сохраняет полученную зависимость; обычное внедрение через конструктор выполняется при создании сервиса.
4. Первый запрос вызывает сервис, который использует внедрённый ReportBuilder.
5. Второй запрос вызывает тот же сервис с той же зависимостью. Область prototype означает создание нового экземпляра при новом запросе зависимости у контейнера, а вызов метода сервиса такого запроса не выполняет. Поэтому сервис использует один экземпляр ReportBuilder при обоих вызовах.
Почему это важно
Задача проверяет понимание областей действия компонентов и момента разрешения зависимостей в Spring. Если ReportBuilder хранит промежуточные данные отчёта, они могут сохраняться между запросами, несмотря на область prototype. Когда нужен новый экземпляр для каждой операции, сервис может явно получать его через ObjectProvider.
2. Для вызова конструктора Spring разрешает зависимость ReportBuilder и создаёт её экземпляр с областью prototype.
3. OrderService сохраняет полученную зависимость; обычное внедрение через конструктор выполняется при создании сервиса.
4. Первый запрос вызывает сервис, который использует внедрённый ReportBuilder.
5. Второй запрос вызывает тот же сервис с той же зависимостью. Область prototype означает создание нового экземпляра при новом запросе зависимости у контейнера, а вызов метода сервиса такого запроса не выполняет. Поэтому сервис использует один экземпляр ReportBuilder при обоих вызовах.
Почему это важно
Задача проверяет понимание областей действия компонентов и момента разрешения зависимостей в Spring. Если ReportBuilder хранит промежуточные данные отчёта, они могут сохраняться между запросами, несмотря на область prototype. Когда нужен новый экземпляр для каждой операции, сервис может явно получать его через ObjectProvider.
Хаотичный планировщик помог найти ошибку в тесте JFR
В январском разборе Йоханнес Бехбергер исследовал JDK-8366486: тест CPU-time sampling обычно проходил, хотя после первой записи останавливал поток, создававший нагрузку.
Вторая запись могла получить событие от внутреннего потока
Автор использовал
Это конкретный кейс и экспериментальный инструмент, а не универсальный детектор гонок. В статье автор также объясняет, почему причина оказалась ошибкой проверки, а не просто проблемой синхронизации.
Разбор Бехбергера и устройство теста
#java #jvm
В январском разборе Йоханнес Бехбергер исследовал JDK-8366486: тест CPU-time sampling обычно проходил, хотя после первой записи останавливал поток, создававший нагрузку.
Вторая запись могла получить событие от внутреннего потока
JFR Periodic Tasks. Это маскировало ошибку самого теста. Успешный прогон ещё не означал, что проверяется нужный сценарий.Автор использовал
concurrency-fuzz-scheduler: написанный на Java прототип планировщика Linux меняет расписание потоков случайными паузами. С ним ошибочную ветку удалось воспроизвести быстрее, а исправленную — отдельно проверить повторными запусками.Это конкретный кейс и экспериментальный инструмент, а не универсальный детектор гонок. В статье автор также объясняет, почему причина оказалась ошибкой проверки, а не просто проблемой синхронизации.
Разбор Бехбергера и устройство теста
#java #jvm
👏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
Forwarded from Нейроканал
Showboat и Rodney помогают показать работу ИИ-агента
Саймон Уиллисон собирает демонстрации кода с помощью двух своих инструментов. Showboat выполняет команды и записывает их вывод в документ. Rodney управляет Chrome из командной строки и делает скриншоты интерфейса.
Эту команду автор предлагает дать агенту: в справке есть всё необходимое, чтобы тот создал документ с демонстрацией новой функции.
Уиллисон замечал и обход механизма: агент напрямую правит текст отчёта. Тогда записанный вывод может расходиться с реальным запуском. Содержимое демонстрации тоже требует проверки.
#ии #инструменты
Саймон Уиллисон собирает демонстрации кода с помощью двух своих инструментов. Showboat выполняет команды и записывает их вывод в документ. Rodney управляет Chrome из командной строки и делает скриншоты интерфейса.
uvx showboat --helpЭту команду автор предлагает дать агенту: в справке есть всё необходимое, чтобы тот создал документ с демонстрацией новой функции.
Уиллисон замечал и обход механизма: агент напрямую правит текст отчёта. Тогда записанный вывод может расходиться с реальным запуском. Содержимое демонстрации тоже требует проверки.
#ии #инструменты
Forwarded from Нейроканал
Нейроканал
Showboat и Rodney помогают показать работу ИИ-агента Саймон Уиллисон собирает демонстрации кода с помощью двух своих инструментов. Showboat выполняет команды и записывает их вывод в документ. Rodney управляет Chrome из командной строки и делает скриншоты…
Вспомните последний раз, когда ИИ сделал для вас рабочий результат: код, тесты, документацию или требования. Как вы его проверяли?
Anonymous Poll
15%
Внимательно разобрал сам
36%
Проверил на практике: тесты, запуск, реальные данные
26%
И разобрал, и проверил на практике
1%
Отдал на ревью коллеге
12%
Не проверял, сразу использовал
6%
Не было такого случая или не помню
3%
Другое (напишу в комментариях)