Чашечка 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👏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%
Проверил на практике: тесты, запуск, реальные данные
27%
И разобрал, и проверил на практике
1%
Отдал на ревью коллеге
12%
Не проверял, сразу использовал
5%
Не было такого случая или не помню
3%
Другое (напишу в комментариях)
Чашечка Java
Развёрнутое пояснение:
1. Создаётся session, реализующий AutoCloseable: при закрытии он выбрасывает исключение с сообщением close.
2. Внутри блока try возникает исключение с сообщением send, поэтому выполнение блока прерывается.
3. Перед переходом к catch конструкция try с ресурсами автоматически закрывает session; закрытие тоже завершается исключением.
4. Поскольку основное исключение уже возникло в теле try, исключение закрытия добавляется в список подавленных исключений основного. Оно не заменяет причину сбоя отправки.
5. Обработчик catch получает основное исключение: первая строка вывода — send, вторая — 1, поскольку список подавленных исключений содержит один элемент.
Почему это важно
Задача проверяет обработку исключений и управление ресурсами в Java SE. При работе с соединениями и потоками данных ошибка закрытия может сопровождать исходный сбой. Если журналировать только сообщение основного исключения, дополнительная причина останется незаметной; для диагностики нужно учитывать и подавленные исключения.
2. Внутри блока try возникает исключение с сообщением send, поэтому выполнение блока прерывается.
3. Перед переходом к catch конструкция try с ресурсами автоматически закрывает session; закрытие тоже завершается исключением.
4. Поскольку основное исключение уже возникло в теле try, исключение закрытия добавляется в список подавленных исключений основного. Оно не заменяет причину сбоя отправки.
5. Обработчик catch получает основное исключение: первая строка вывода — send, вторая — 1, поскольку список подавленных исключений содержит один элемент.
Почему это важно
Задача проверяет обработку исключений и управление ресурсами в Java SE. При работе с соединениями и потоками данных ошибка закрытия может сопровождать исходный сбой. Если журналировать только сообщение основного исключения, дополнительная причина останется незаметной; для диагностики нужно учитывать и подавленные исключения.
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
Как собрать 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