Illustrated TLS Connection
Думаю каждый Java разработчик сталкивался с вопросами криптографии. Как минимум времена "голого" HTTP давно прошли. Сегодня хочу с вами поделиться замечательным ресурсом на котором в очень наглядной форме описывается суть TLS 1.3.
Для перехвата пакетов и анализа трафика можно использовать Wireshark и\или tcpdump.
В Spring Boot можно добавить в конфигурацию
server.port=443
server.ssl.enabled=true
server.ssl.protocol=TLS
server.ssl.enabled-protocols=TLSv1.3
и добавить детали keystore (хранилища)
server.ssl.key-store-type=PKCS12
server.ssl.key-store=keystore.p12
server.ssl.key-store-password=password
В реальных приложениях лучше добавлять криптографию на уровне gateway\balancer, а не Spring Boot приложения. Например ставить nginx перед приложениями.
https://tls13.ulfheim.net
Думаю каждый Java разработчик сталкивался с вопросами криптографии. Как минимум времена "голого" HTTP давно прошли. Сегодня хочу с вами поделиться замечательным ресурсом на котором в очень наглядной форме описывается суть TLS 1.3.
Для перехвата пакетов и анализа трафика можно использовать Wireshark и\или tcpdump.
В Spring Boot можно добавить в конфигурацию
server.port=443
server.ssl.enabled=true
server.ssl.protocol=TLS
server.ssl.enabled-protocols=TLSv1.3
и добавить детали keystore (хранилища)
server.ssl.key-store-type=PKCS12
server.ssl.key-store=keystore.p12
server.ssl.key-store-password=password
В реальных приложениях лучше добавлять криптографию на уровне gateway\balancer, а не Spring Boot приложения. Например ставить nginx перед приложениями.
https://tls13.ulfheim.net
tls13.xargs.org
The Illustrated TLS 1.3 Connection
Every byte of a TLS connection explained and reproduced
NullAway: Fast Annotation-Based Null Checking for Java
Многим разработчикам в Kotlin нравятся такие фичи как null-safety и sealed-классы.
В 15 версии Java появились sealed классы и в 14 версии NPE стали более информативными, но по факту мы как и раньше ловим NPE в рантайме.
Достаточно интересное решение предлагает Uber. Это плагин NullAway для статического анализа кода для Error Prone.
Надо пробовать плагин и надеяться, что в следующих версиях Java предложат решение борьбы с NPE не хуже чем в Kotlin.
Многим разработчикам в Kotlin нравятся такие фичи как null-safety и sealed-классы.
В 15 версии Java появились sealed классы и в 14 версии NPE стали более информативными, но по факту мы как и раньше ловим NPE в рантайме.
Достаточно интересное решение предлагает Uber. Это плагин NullAway для статического анализа кода для Error Prone.
Надо пробовать плагин и надеяться, что в следующих версиях Java предложат решение борьбы с NPE не хуже чем в Kotlin.
GitHub
GitHub - uber/NullAway: A tool to help eliminate NullPointerExceptions (NPEs) in your Java code with low build-time overhead
A tool to help eliminate NullPointerExceptions (NPEs) in your Java code with low build-time overhead - uber/NullAway
Migrating From JDK 8 to Later JDK Releases
На данный момент еще много проектов используют JDK 8 и многим только предстоит миграция на новую версию. В Java стараются по возможности сохранять обратную совместимость, но скорость изменений все нарастает и не для всех изменений это можно обеспечить.
Если вы уже столкнулись с задачей миграции или вам это только предстоит, то я рекомендую ознакомиться с документом подготовленным специалистами Oracle:
https://docs.oracle.com/en/java/javase/17/migrate/migrating-jdk-8-later-jdk-releases.html#GUID-7744EF96-5899-4FB2-B34E-86D49B2E89B6
На данный момент еще много проектов используют JDK 8 и многим только предстоит миграция на новую версию. В Java стараются по возможности сохранять обратную совместимость, но скорость изменений все нарастает и не для всех изменений это можно обеспечить.
Если вы уже столкнулись с задачей миграции или вам это только предстоит, то я рекомендую ознакомиться с документом подготовленным специалистами Oracle:
https://docs.oracle.com/en/java/javase/17/migrate/migrating-jdk-8-later-jdk-releases.html#GUID-7744EF96-5899-4FB2-B34E-86D49B2E89B6
Oracle Help Center
Oracle JDK Migration Guide
There were significant changes made between the JDK 8 and later JDK releases.
Выпущен Quarkus 2.7.1. Почему именно Quarkus?
Quarkus, платформа Java для микросервисов, первоначально выпущенная RedHat в марте 2019 года, достигла версии 2.7.1
Довольно интересный анализ проведен в статье
https://shly.link/LvM7C
Quarkus, платформа Java для микросервисов, первоначально выпущенная RedHat в марте 2019 года, достигла версии 2.7.1
Довольно интересный анализ проведен в статье
https://shly.link/LvM7C
www.i-programmer.info
Quarkus 2.7.1 Released - Why Quarkus?
Programming book reviews, programming tutorials,programming news, C#, Ruby, Python,C, C++, PHP, Visual Basic, Computer book reviews, computer history, programming history, joomla, theory, spreadsheets and more.
Вышел Hibernate 6.0 Final.
Новая версия фреймворка не является полностью совместимой с предыдущей версией 5.x. Для тех, кто использует Hibernate исключительно через Jakarta Persistence API, переход должен быть полностью совместимым. Для остальных был написан подробный гид по миграции.
1. Базовая версия Java для него теперь 11.
2. Java Persistence больше не поддерживается. Hibernate 6.0 можно использовать только с пространством имён
3. Теперь используется Read-by-position вместо Read-by-name при чтении из JDBC
Новая версия фреймворка не является полностью совместимой с предыдущей версией 5.x. Для тех, кто использует Hibernate исключительно через Jakarta Persistence API, переход должен быть полностью совместимым. Для остальных был написан подробный гид по миграции.
1. Базовая версия Java для него теперь 11.
2. Java Persistence больше не поддерживается. Hibernate 6.0 можно использовать только с пространством имён
jakarta.persistence.
3. Теперь используется Read-by-position вместо Read-by-name при чтении из JDBC
ResultSet. Это приводит к улучшению производительности, а также к более компактным и читаемым сгенерированным SQL-запросам.
In Relation To
Hibernate 6.0 Final - In Relation To
It has been years in the making, but ORM 6.0 Final has finally been released!
This announcement will discuss the major changes, as well as give insight into why
certain choices were made.
We will also be following up with a series of more focused posts…
This announcement will discuss the major changes, as well as give insight into why
certain choices were made.
We will also be following up with a series of more focused posts…
Кент Бек
Кент Бек, создатель методологии "Разработка через тестирование" (TDD), как-то написал:
"Мне платят за работающий код, а не за тесты, поэтому моя философия заключается в том, чтобы тестировать настолько мало, насколько это возможно, чтобы достичь заданного уровня уверенности".
(источник)
Люди в комментариях к этому высказыванию Бека были в шоке, они думали, что он всегда пропагандировал 100% покрытие кода:
Невероятно, что Кент Бек мог такое сказать! Легионы разработчиков добросовестно добиваются 100% покрытия, потому что они думают, что именно так поступил бы Кент Бек! Я говорил многим, что вы сказали в своей книге по XP, что не всегда религиозно придерживаетесь Test First. Но я тоже удивлен!
https://habr.com/ru/company/karuna/blog/663906/
Кент Бек, создатель методологии "Разработка через тестирование" (TDD), как-то написал:
"Мне платят за работающий код, а не за тесты, поэтому моя философия заключается в том, чтобы тестировать настолько мало, насколько это возможно, чтобы достичь заданного уровня уверенности".
(источник)
Люди в комментариях к этому высказыванию Бека были в шоке, они думали, что он всегда пропагандировал 100% покрытие кода:
Невероятно, что Кент Бек мог такое сказать! Легионы разработчиков добросовестно добиваются 100% покрытия, потому что они думают, что именно так поступил бы Кент Бек! Я говорил многим, что вы сказали в своей книге по XP, что не всегда религиозно придерживаетесь Test First. Но я тоже удивлен!
https://habr.com/ru/company/karuna/blog/663906/
Stack Overflow
How deep are your unit tests?
The thing I've found about TDD is that its takes time to get your tests set up and being naturally lazy I always want to write as little code as possible. The first thing I seem do is test my const...
Sampler. Visualization for any shell command.
Я недавно наткнулся на довольно интересный инструмент визуализации в терминале. Он написан на Go и прямого отношения к Java не имеет, но при помощи него можно очень красиво в терминале отображать результаты работы разных приложений.
Для Java приложений можно организовать например опрос через JMX и отображение результатов в консоле.
Да, я знаю про различные промышленные системы мониторинга "монструозного" размера, но я всегда с особой любовью относился к "миру в консоле". Sampler просто порадовал своим функционалом и визуальными эффектами. На проме такое наврятли будете использовать, но иметь в своем арсенале такой инструмент полезно. Можно будет найти и ему применение. Любителям консоли однозначно стоит попробовать ))
https://github.com/sqshq/sampler
Я недавно наткнулся на довольно интересный инструмент визуализации в терминале. Он написан на Go и прямого отношения к Java не имеет, но при помощи него можно очень красиво в терминале отображать результаты работы разных приложений.
Для Java приложений можно организовать например опрос через JMX и отображение результатов в консоле.
Да, я знаю про различные промышленные системы мониторинга "монструозного" размера, но я всегда с особой любовью относился к "миру в консоле". Sampler просто порадовал своим функционалом и визуальными эффектами. На проме такое наврятли будете использовать, но иметь в своем арсенале такой инструмент полезно. Можно будет найти и ему применение. Любителям консоли однозначно стоит попробовать ))
https://github.com/sqshq/sampler
GitHub
GitHub - sqshq/sampler: Tool for shell commands execution, visualization and alerting. Configured with a simple YAML file.
Tool for shell commands execution, visualization and alerting. Configured with a simple YAML file. - sqshq/sampler
Из Oracle в Java
Сейчас наблюдается тенденция перехода Oracle разработчиков в Java-висты. Недавно я натолкнулся на довольно интересную статью в которой автор делится своими ощущениями от перехода на Java.
Статья будет интересна и преподавателям Java и тем кто планирует только перейти на Java.
https://habr.com/ru/company/custis/blog/568032/
Сейчас наблюдается тенденция перехода Oracle разработчиков в Java-висты. Недавно я натолкнулся на довольно интересную статью в которой автор делится своими ощущениями от перехода на Java.
Статья будет интересна и преподавателям Java и тем кто планирует только перейти на Java.
https://habr.com/ru/company/custis/blog/568032/
Хабр
Из Oracle в Java. Личный опыт
К написанию статьи меня побудил интерес разработчиков Oracle к изучению Java. Статья не носит обучающий характер и не является инструкцией для перехода с одной технологии на другую. Цель —...
Шпаргалка по коллекциям в Java
Отличная шпаргалка по Java коллекциям. Там сравнивают коллекции Java по следующим параметрам:
1. На чем основана — какая структура данных или коллекция используется под капотом.
2. Дубли — разрешены или нет в коллекции повторяющиеся значения.
3. Null — позволяет ли коллекция вставлять null.
4. Синхронизированность — все ли методы коллекции синхронизированы.
5. Потокобезопасность — безопасно ли использовать коллекцию в многопоточной среде.
6. Тип итератора — поведение итератора в многопоточной среде.
https://habr.com/ru/company/otus/blog/660959/
Отличная шпаргалка по Java коллекциям. Там сравнивают коллекции Java по следующим параметрам:
1. На чем основана — какая структура данных или коллекция используется под капотом.
2. Дубли — разрешены или нет в коллекции повторяющиеся значения.
3. Null — позволяет ли коллекция вставлять null.
4. Синхронизированность — все ли методы коллекции синхронизированы.
5. Потокобезопасность — безопасно ли использовать коллекцию в многопоточной среде.
6. Тип итератора — поведение итератора в многопоточной среде.
https://habr.com/ru/company/otus/blog/660959/
Хабр
Шпаргалка по коллекциям в Java
Сравним коллекции Java по следующим параметрам: На чем основана — какая структура данных или коллекция используется под капотом. Дубли — разрешены или нет в коллекции повторяющиеся значения. Null —...
Связь логов через correlation id в многопоточных\многопользовательских системах.
В многопоточных\многопользовательских системах часто возникает задача ввести атрибут по которому можно будет находить логически связанные между собой записи логов. Например: записи относящиеся к сессии конкретного пользователя.
В Log4j для этой задачи есть класс MDC https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/MDC.html
На старте обработки можно сохранить уникальный идентификатор. В качестве уникального идентификатора можно взять значение либо прикладного поля либо сгенерировать суррогатное UUID.randomUUID().toString()
MDC.put(CORRELATION_ID_LOG_VAR_NAME, correlationId);
CORRELATION_ID_LOG_VAR_NAME можно определить как
private static final String CORRELATION_ID_LOG_VAR_NAME = "correlationId";
Если по мере исполнения потребуется его извлечь, то можно вызвать Object correlationId = MDC.get(CORRELATION_ID_LOG_VAR_NAME);
В конце нужно обязательно почистить за собой
MDC.remove(CORRELATION_ID_LOG_VAR_NAME);
Для вывода в лог нужно добавить в log4j.xml значение %X{correlationId}
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %p [%c] %X{correlationId} - <%m>%n"/>
</layout>
</appender>
В многопоточных\многопользовательских системах часто возникает задача ввести атрибут по которому можно будет находить логически связанные между собой записи логов. Например: записи относящиеся к сессии конкретного пользователя.
В Log4j для этой задачи есть класс MDC https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/MDC.html
На старте обработки можно сохранить уникальный идентификатор. В качестве уникального идентификатора можно взять значение либо прикладного поля либо сгенерировать суррогатное UUID.randomUUID().toString()
MDC.put(CORRELATION_ID_LOG_VAR_NAME, correlationId);
CORRELATION_ID_LOG_VAR_NAME можно определить как
private static final String CORRELATION_ID_LOG_VAR_NAME = "correlationId";
Если по мере исполнения потребуется его извлечь, то можно вызвать Object correlationId = MDC.get(CORRELATION_ID_LOG_VAR_NAME);
В конце нужно обязательно почистить за собой
MDC.remove(CORRELATION_ID_LOG_VAR_NAME);
Для вывода в лог нужно добавить в log4j.xml значение %X{correlationId}
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %p [%c] %X{correlationId} - <%m>%n"/>
</layout>
</appender>
Какой алгоритм хеширования паролей лучше?
Согласно фонду OWASP, для современного хеширования паролей следует рассматривать лишь несколько алгоритмов.
1. Лучший алгоритм для использования на данный момент (в 2022 году) — Argon2id.
2. Если вы по какой-либо причине не можете использовать Argon2id, scrypt — хороший второй вариант.
3. Если Argon2id и scrypt недоступны, другим хорошим выбором является BCrypt.
В статье приводится краткое описание этих алгоритмов и способов их использования.
https://foojay.io/today/how-to-do-password-hashing-in-java-applications-the-right-way/
Согласно фонду OWASP, для современного хеширования паролей следует рассматривать лишь несколько алгоритмов.
1. Лучший алгоритм для использования на данный момент (в 2022 году) — Argon2id.
2. Если вы по какой-либо причине не можете использовать Argon2id, scrypt — хороший второй вариант.
3. Если Argon2id и scrypt недоступны, другим хорошим выбором является BCrypt.
В статье приводится краткое описание этих алгоритмов и способов их использования.
https://foojay.io/today/how-to-do-password-hashing-in-java-applications-the-right-way/
foojay
How to do password hashing in Java applications the right way
The first rule of password hashing algorithms is: Don't write your own password hashing algorithm! Let's learn how we do password hashing.
JetBrains планирует полностью поменять интерфейс IntelliJ IDEA и других своих IDE. Как утверждается в блоге JetBrains, "тренды графического интерфейса эволюционировали, и многие из наших пользователей говорят нам, что текущий интерфейс кажется тяжеловесным и устаревшим". Поэтому в компании было принято решение разработать абсолютно новый look-and-feel, который будет чистым, современным и мощным.
Новый графический интерфейс будет внедряться постепенно. Сначала ограниченный круг пользователей сможет принять участие в программе раннего доступа, где сможет попробовать новый интерфейс и поделиться обратной связью с командой JetBrains. Позже в этом году новый интерфейс станет общедоступным, а в следующем году он станет интерфейсом по умолчанию, сначала для новых пользователей, а потом для всех остальных. После этого старый интерфейс будет всё ещё доступен как минимум в течение года.
Новый графический интерфейс будет внедряться постепенно. Сначала ограниченный круг пользователей сможет принять участие в программе раннего доступа, где сможет попробовать новый интерфейс и поделиться обратной связью с командой JetBrains. Позже в этом году новый интерфейс станет общедоступным, а в следующем году он станет интерфейсом по умолчанию, сначала для новых пользователей, а потом для всех остальных. После этого старый интерфейс будет всё ещё доступен как минимум в течение года.
The JetBrains Blog
Take Part in the New UI Preview for Your JetBrains IDE | The IntelliJ IDEA Blog
Update: The beta version of the new UI is available to all users in the 2022.3 release. Go to Settings | Appearance & Behavior | New UI to enable it. Last year IntelliJ IDEA celebrated its 20th
Сегодня паттерн Посетитель в Java уже не нужен – лучше использовать переключатели паттернов.
В современном языке Java паттерн Посетитель (Visitor) уже не нужен. Он отлично компенсируется использованием запечатанных типов и переключателей, использующих сопоставление с шаблоном – в таком случае те же цели достигаются проще и меньшим объемом кода.
https://habr.com/ru/company/piter/blog/668646/
В современном языке Java паттерн Посетитель (Visitor) уже не нужен. Он отлично компенсируется использованием запечатанных типов и переключателей, использующих сопоставление с шаблоном – в таком случае те же цели достигаются проще и меньшим объемом кода.
https://habr.com/ru/company/piter/blog/668646/
Хабр
Сегодня паттерн Посетитель в Java уже не нужен – лучше использовать переключатели паттернов
В современном языке Java паттерн Посетитель (Visitor) уже не нужен. Он отлично компенсируется использованием запечатанных типов и переключателей, использующих сопоставление с шаблоном – в таком...
Сравнение объектов в Java
Недавно мне попалась на глаза довольно занимательная статья про сравнение объектов. Как это не парадоксально, но периодически на собеседованиях бывают соискатели даже уровня Senior, которые "плавают" в этой теме.
В этой статье еще не затронута тема сравнения Enum. Возможно автор исходит из соображений, что все знают как это работает.
В моей практике меня больше всего поразил код одного джуна. Он повторял как мантру, что все нужно сравнивать через equals и как следствие даже приводил int к Integer для того чтобы сравнивать через equals (((
Статья интересна еще и тем, что там дают обзор по функционалу в разных библиотеках.
https://habr.com/ru/company/otus/blog/670630/
Недавно мне попалась на глаза довольно занимательная статья про сравнение объектов. Как это не парадоксально, но периодически на собеседованиях бывают соискатели даже уровня Senior, которые "плавают" в этой теме.
В этой статье еще не затронута тема сравнения Enum. Возможно автор исходит из соображений, что все знают как это работает.
В моей практике меня больше всего поразил код одного джуна. Он повторял как мантру, что все нужно сравнивать через equals и как следствие даже приводил int к Integer для того чтобы сравнивать через equals (((
Статья интересна еще и тем, что там дают обзор по функционалу в разных библиотеках.
https://habr.com/ru/company/otus/blog/670630/
Хабр
Сравнение объектов в Java
Вступление Сравнение объектов является важной функцией объектно-ориентированных языков программирования. В этом руководстве мы рассмотрим некоторые функции языка Java, которые позволяют нам сравнивать...
Вопросы для собеседования на Java Developer
Многие часто сталкиваются либо с задачей подготовки к собеседованиям либо самостоятельно проводят собеседования. Хочу поделиться с вами неплохой подборкой вопросов для собеседования.
Можно и самому пробежаться по ним и освежить знания ))
https://github.com/enhorse/java-interview
Многие часто сталкиваются либо с задачей подготовки к собеседованиям либо самостоятельно проводят собеседования. Хочу поделиться с вами неплохой подборкой вопросов для собеседования.
Можно и самому пробежаться по ним и освежить знания ))
https://github.com/enhorse/java-interview
GitHub
GitHub - enhorse/java-interview: Вопросы и ответы к интервью Java разработчика
Вопросы и ответы к интервью Java разработчика. Contribute to enhorse/java-interview development by creating an account on GitHub.
Micronaut. Краткое руководство о том, как создавать микросервисы с помощью этого JVM-фреймворка
Работа многих JVM-фреймворков с инверсией управления (IoC frameworks) базируется на применении рефлексии (reflection-based). Это означает, что, для функционирования, таким фреймворкам требуется загружать и кэшировать данные рефлексии для каждого бина (bean) внутри контекста приложения.
Micronaut, в отличии от них, не использует эту технологию. Это благотворно влияет на производительность разработки и последующую работу программ. Приложения, создаваемые с помощью Micronaut, быстро стартуют, быстро работают и потребляют минимально возможное количество памяти. И эти характеристики практически не ухудшаются с увеличением размера кодовой базы приложений.
https://www.tune-it.ru/web/romo/blog/-/blogs/micronaut-microservices-part1
Работа многих JVM-фреймворков с инверсией управления (IoC frameworks) базируется на применении рефлексии (reflection-based). Это означает, что, для функционирования, таким фреймворкам требуется загружать и кэшировать данные рефлексии для каждого бина (bean) внутри контекста приложения.
Micronaut, в отличии от них, не использует эту технологию. Это благотворно влияет на производительность разработки и последующую работу программ. Приложения, создаваемые с помощью Micronaut, быстро стартуют, быстро работают и потребляют минимально возможное количество памяти. И эти характеристики практически не ухудшаются с увеличением размера кодовой базы приложений.
https://www.tune-it.ru/web/romo/blog/-/blogs/micronaut-microservices-part1
Romo Fedoroff
- Micronaut. Краткое руководство о том, как создавать микросервисы с помощью этого JVM-фреймворка - Romo Fedoroff - Tune IT
В статье рассматривается Micronaut - современный полнофункциональный фреймворк, позволяющий создавать модульные, легко тестируемые микросервисные приложения. Прочитав статью, Вы узнаете, как построить связанные микросервисы, разработанные на разных языках…
Зачем нужен Thread.UncaughtExceptionHandler?
Ваше приложение выполняется в потоках. При необходимости можно создавать дополнительные потоки. Поток, в котором было выброшено и не обработано исключение, остановится, и распечатает стектрейс в вывод System.err. Если это был последний пользовательский поток, приложение начнет завершение работы.
Для изменения логики обработки непойманных исключений в Java существует функциональный интерфейс Thread.UncaughtExceptionHandler.
Обработчик упущенных исключений может быть установлен (в порядке возрастания приоритета):
• глобально на всё приложение, статическим методом Thread.setDefaultUncaughtExceptionHandler();
• для группы потоков, переопределением метода uncaughtException() в реализации объекта подкласса ThreadGroup (т.к. ThreadGroup сам является наследником UncaughtExceptionHandler);
• для отдельного потока, методом setUncaughtExceptionHandler().
Естественно, установка нестандартного обработчика не имеет обратной силы. Используя его, нужно убедиться, что он установлен достаточно рано, до выброса какого-либо исключения.
Хорошей практикой считается обрабатывать исключение настолько близко к месту его выброса, насколько возможно. Следовательно, использование глобальных обработчиков – самый плохой вариант.
Так же как в случае различных финализаций, несмотря на все её недостатки, глобальная обработка иногда лучше, чем ничего. Она может, например, дать последний шанс освободить внешние ресурсы, или уведомить о некорректной работе программы более эффективно, чем через логи.
Когда код с исключением выполняет ExecutorService, мы не имеем прямого доступа к объектам потока. Но в этом случае результатом выполнения будет объект типа Future. Такой отложенный объект при попытке прочитать значение перевыбросит полученное исключение, завернув его в ExecutionException. Новое исключение-обертка уже пойдет по обычному пути обработки текущего потока. Исключение как бы перекочует из внутреннего потока пулла во внешний, который использует этот пулл.
Если же пользовательский код не станет дожидаться результатов, исключение будет потеряно, не оставив даже стектрейса в потоке вывода. Для предотвращения такой ситуации стоит снабдить поток обработчиком сразу после создания, определив для сервиса собственную ThreadFactory.
Обычно, если фреймворк скрывает от пользователя детали работы с потоками, он также скрывает и детали работы с исключениями, оставляя свой специальный способ назначить обработчик. И этот специальный обработчик – более специфичный, а значит более правильный подход, чем стандартная глобальная обработка исключений Java. Так, например, в Spring MVC применяется аннотация @ExceptionHandler.
Ваше приложение выполняется в потоках. При необходимости можно создавать дополнительные потоки. Поток, в котором было выброшено и не обработано исключение, остановится, и распечатает стектрейс в вывод System.err. Если это был последний пользовательский поток, приложение начнет завершение работы.
Для изменения логики обработки непойманных исключений в Java существует функциональный интерфейс Thread.UncaughtExceptionHandler.
Обработчик упущенных исключений может быть установлен (в порядке возрастания приоритета):
• глобально на всё приложение, статическим методом Thread.setDefaultUncaughtExceptionHandler();
• для группы потоков, переопределением метода uncaughtException() в реализации объекта подкласса ThreadGroup (т.к. ThreadGroup сам является наследником UncaughtExceptionHandler);
• для отдельного потока, методом setUncaughtExceptionHandler().
Естественно, установка нестандартного обработчика не имеет обратной силы. Используя его, нужно убедиться, что он установлен достаточно рано, до выброса какого-либо исключения.
Хорошей практикой считается обрабатывать исключение настолько близко к месту его выброса, насколько возможно. Следовательно, использование глобальных обработчиков – самый плохой вариант.
Так же как в случае различных финализаций, несмотря на все её недостатки, глобальная обработка иногда лучше, чем ничего. Она может, например, дать последний шанс освободить внешние ресурсы, или уведомить о некорректной работе программы более эффективно, чем через логи.
Когда код с исключением выполняет ExecutorService, мы не имеем прямого доступа к объектам потока. Но в этом случае результатом выполнения будет объект типа Future. Такой отложенный объект при попытке прочитать значение перевыбросит полученное исключение, завернув его в ExecutionException. Новое исключение-обертка уже пойдет по обычному пути обработки текущего потока. Исключение как бы перекочует из внутреннего потока пулла во внешний, который использует этот пулл.
Если же пользовательский код не станет дожидаться результатов, исключение будет потеряно, не оставив даже стектрейса в потоке вывода. Для предотвращения такой ситуации стоит снабдить поток обработчиком сразу после создания, определив для сервиса собственную ThreadFactory.
Обычно, если фреймворк скрывает от пользователя детали работы с потоками, он также скрывает и детали работы с исключениями, оставляя свой специальный способ назначить обработчик. И этот специальный обработчик – более специфичный, а значит более правильный подход, чем стандартная глобальная обработка исключений Java. Так, например, в Spring MVC применяется аннотация @ExceptionHandler.
Организация SFC призвала открытые проекты прекратить использовать GitHub
Правозащитная организация Software Freedom Conservancy (SFC), предоставляющая юридическую защиту свободным проектам и отстаивающая необходимость соблюдения лицензии GPL, объявила о прекращении любого использования платформы для совместной разработки кода GitHub и призвала разработчиков других открытых проектов последовать своему примеру. Организация также запустила инициативу, нацеленную на упрощение миграции проектов с GitHub на более открытые альтернативы, например, CodeBerg (на базе Gitea) и SourceHut, или внедрение на своих серверах собственных сервисов разработки, основанных на открытых платформах, таких как Gitea или GitLab Community Edition.
К созданию инициативы организацию SFC подтолкнуло нежелание GitHub и Microsoft разбираться в этических и юридических тонкостях использование исходных текстов свободного ПО в качестве основы для построения модели машинного обучения в коммерческом сервисе GitHub Copilot. Представители SFC попытались разобраться в том, является ли созданная модель машинного обучения объектом авторских прав и если да, то кому принадлежат эти права и как они соотносятся с правами на код, на основе которого построена модель. Также пока непонятно, может ли считаться производной работой блок кода, сгенерированный в GitHub Copilot и повторяющий код из используемых при построении модели проектов, и может ли рассматриваться включение таких блоков в проприетарное ПО как нарушение копилефт лицензий.
https://sfconservancy.org/blog/2022/jun/30/give-up-github-launch/
Правозащитная организация Software Freedom Conservancy (SFC), предоставляющая юридическую защиту свободным проектам и отстаивающая необходимость соблюдения лицензии GPL, объявила о прекращении любого использования платформы для совместной разработки кода GitHub и призвала разработчиков других открытых проектов последовать своему примеру. Организация также запустила инициативу, нацеленную на упрощение миграции проектов с GitHub на более открытые альтернативы, например, CodeBerg (на базе Gitea) и SourceHut, или внедрение на своих серверах собственных сервисов разработки, основанных на открытых платформах, таких как Gitea или GitLab Community Edition.
К созданию инициативы организацию SFC подтолкнуло нежелание GitHub и Microsoft разбираться в этических и юридических тонкостях использование исходных текстов свободного ПО в качестве основы для построения модели машинного обучения в коммерческом сервисе GitHub Copilot. Представители SFC попытались разобраться в том, является ли созданная модель машинного обучения объектом авторских прав и если да, то кому принадлежат эти права и как они соотносятся с правами на код, на основе которого построена модель. Также пока непонятно, может ли считаться производной работой блок кода, сгенерированный в GitHub Copilot и повторяющий код из используемых при построении модели проектов, и может ли рассматриваться включение таких блоков в проприетарное ПО как нарушение копилефт лицензий.
https://sfconservancy.org/blog/2022/jun/30/give-up-github-launch/
Software Freedom Conservancy
Give Up GitHub: The Time Has Come!
Those who forget history often inadvertently repeat it. Some of us recall that twenty-one years ago, the most popular code hosting site, a fully Free and Open Source (FOSS)
site called SourceForge, proprietarized all their code — never to make it FOSS again.…
site called SourceForge, proprietarized all their code — never to make it FOSS again.…