Библиотека Java разработчика
11.2K subscribers
966 photos
433 videos
58 files
1.33K links
Библиотека Java разработчика. Java, Spring, Maven, Hibernate


По всем вопросам @evgenycarter
Download Telegram
Как используется метод Lock.newCondition()?

Если реализации интерфейса Lock представляют высокоуровневую альтернативу блока synchronized, то реализации его спутника, интерфейса Conditionальтернатива методам notify/wait. Оба этих интерфейса относятся к пакету java.util.concurrent.locks.

Как и ожидание на мониторе, Condition реализует примитив синхронизации «Условная переменная». Один или несколько потоков зависают на объекте-кондишне с помощью варианта метода await (ждут удовлетворения условия). Другой поток пробуждает их методами signal и signalAll (сигнализирует об удовлетворении условия).

Конкретные реализации Condition всегда решают те же задачи, что блокировка на мониторе, но в теории могут отличаться в нюансах поведения. Например, может не быть требования вызывать ожидание/сигнал только при захваченном локе (аналог требования, по которому notify/wait всегда вызываются в synchronized). Или может гарантироваться порядок получения сигнала ожидающими потоками.

Возвращаясь к поставленному вопросу, Condition всегда связан со своим объектом типа Lock, и метод Lock.newCondition() – единственный правильный способ создания кондишна.

👉@BookJava
Оплачиваемая стажировка и трудоустройство без опыта — ну ничего себе 😳

Все возможно с Добровольным квалификационным экзаменом! Это бесплатный проект Правительства Москвы, где ты можешь показать свои знания по специальности, запомниться потенциальным работодателям и получить оффер в престижные компании Москвы.

Тебя ждет всего три шага:
1️⃣ Пройди тест
После регистрации на сайте ДКЭ тебе будет доступно 70 профессий по 7 направлениям. Выбирай тест по своей специальности и проверь уровень своих знаний!
2️⃣ Реши кейс
Если ты успешно сдал тест, тебя пригласят на следующий этап, где ты с другими участниками в команде будешь решать реальный кейс одного из работодателей.
3️⃣ Стань победителем
Окажись в числе лучших по общему количеству баллов за оба этапа и получи шанс попасть на оплачиваемую стажировку с дальнейшим трудоустройством.

Готов проявить себя? Регистрируйся и начинай проходить тест — https://dke.moscow

Реклама. АНО "РАЗВИТИЕ ЧЕЛОВЕЧЕСКОГО КАПИТАЛА", АНО "РЧК". ИНН 7710364647. erid: LjN8KWtNV
Как из Java приложения запустить другую программу?

Самый простой и базовый способ – с помощью метода Runtime.getRuntime().exec(). В качестве параметра ему передается строка системной команды. Опциональные можно передать рабочую директорию, и переменные окружения в виде массива строк "имя=значение". Если команде нужны аргументы, они передаются либо массивом, либо в той же строке команды через пробелы.

Рекомендуемый, и более управляемый способ – использование класса ProcessBuilder. Он же применяется внутри метода exec. Билдер дает, например, средства для использования в команде пайплайнов и редиректов ввода-вывода.

В результате запуска команды создается объект класса Process. Его можно сконвертировать в более современный (Java 9+) и функциональный ProcessHandle. Через эти объекты идет работа с вводом-выводом процесса, его характеристиками и статусом.

Команда запускается в отдельном подпроцессе операционной системы. Это значит, что лозунг «Write once, run anywhere» перестает здесь работать – ваша программа становится платформо-зависимой. Обращение к ОС, а тем более выделение нового процесса обычно занимает немало ресурсов компьютера. Запуск внешних программ не считается плохой практикой, но всё-таки при возможности стоит его избегать.

👉@BookJava
Устойчивость микросервисных Spring приложений: роль аннотации Transactional в предотвращении утечки соединений

В любом микросервисе четкое управление взаимодействием с базой данных является ключевым фактором для поддержания производительности приложения и его надежности на должном уровне. Обычно мы натыкаемся на странные проблемы с подключением к базе данных во время тестирования производительности. Недавно мы обнаружили критическую проблему внутри слоя репозиториев в нашем микросервисном Spring приложении: неправильная обработка исключения приводила к неожиданным сбоям и нарушению работы сервиса во время тестирования производительности. Эта статья представляет собой анализ проблемы и рассказывает, как она была решена с помощью аннотации @Transactional.

Микросервисные Spring приложения сильно зависят от стабильного и эффективного взаимодействия с базой данных, которое часто осуществляется через Java Persistence API (JPA). Для поддержания высокой производительности важно правильно управлять пулом соединений и предотвращать утечки соединений, чтобы взаимодействие с базой данных не снижало производительность приложения.

https://habr.com/ru/companies/spring_aio/articles/827642/

👉@BookJava
👩‍💻 Интеграционные тесты контроллеров, интеграций с внешними API и безопасности.

Ждём вас на третьем занятии серии открытых практических уроков по тестированию Spring-приложений от OTUS, где мы:

- рассмотрим специфику тестирования классических и REST-контроллеров и интеграций с внешними API;
- уделим внимание тому, как проверить, что все конечные точки нашего приложения действительно защищены;
- ответим на все возникающие вопросы.

Спикер — Senior Software Engineer, опытный преподаватель и руководитель курса.

Встречаемся 16 июля в 20:00 мск в преддверии старта курса «Разработчик на Spring Framework».
Все участники вебинара получат специальную цену на обучение!

➡️ Регистрируйтесь прямо сейчас, чтобы не пропустить бесплатный урок и получить записи предыдущих вебинаров серии: https://vk.cc/cygmcP

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Please open Telegram to view this post
VIEW IN TELEGRAM
How-to Build Custom Java Runtimes with Jlink.

Видео о создании пользовательского образа среды выполнения с помощью инструмента командной строки jlink. Создается образ, который содержит только те модули, которые нужны приложению, что уменьшает размер приложения и повышает безопасность.

https://www.youtube.com/watch?v=mJKlxqQQeyI&t=52s

👉@BookJava
Зачем выбирать ReentrantLock вместо synchronized?

Объект класса ReentrantLock решает те же задачи, что и блок synchronized. Поток висит на вызове метода lock() в ожидании своей очереди занять этот объект. Владеть локом, как и находиться внутри блока synchronized может только один поток одновременно. unlock(), подобно выходу из блока синхронизации, освобождает объект-монитор для других потоков.

В отличие от блока синхронизации, ReentrantLock дает расширенный интерфейс для получения информации о состоянии блокировки. Методы лока позволяют еще до блокировки узнать, занят ли он сейчас, сколько потоков ждут его в очереди, сколько раз подряд текущий поток завладел им.

Шире и возможные режимы блокировки. Кроме обычного ожидающего lock(), вариант tryLock() с параметром ожидает своей очереди только заданное время, а без параметра – вообще не ждет, а только захватывает свободный лок.

Еще одно отличие – свойство fair. Лок с этим свойством обеспечивает «справедливость» очереди: пришедший раньше поток захватывает объект раньше. Блок synchronized не дает никаких гарантий порядка.

👉@BookJava
♨️ Хотите добиться максимальной производительности от своих Java-проектов?

Научитесь искусству измерения производительности и оптимизации кода на нашем увлекательном онлайн-уроке.

Забудьте о гадании и предположениях!
На этом вебинаре мы расскажем вам о мощном инструменте Java Microbenchmark Harness (JMH) и его области применения. Вместе мы разберем работу с производительными тестами и сравнением различных алгоритмов.

Вебинар будет полезен как Java-разработчикам, которые ищут лучшие практики для оптимизации кода, так и тестировщикам, специализирующимся на нагрузочном тестировании.

Спикер — Tech Lead в одном из крупнейших российских банков и кандидат технических наук.

Готовы стать мастером производительности в Java?

➡️ Регистрируйтесь прямо сейчас и откройте новый уровень эффективности в своих проектах: https://vk.cc/cykdYt

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Please open Telegram to view this post
VIEW IN TELEGRAM
Совет Spring Framework💡

Вы можете инжектировать (autowire) бины, которые могут отсутствовать, обернув их в java.util.Optional. Таким образом вы сообщаете, что этот бин является необязательным, избегаете исключения, если он не существует, и можете аккуратно обработать его отсутствие с помощью Optional API.

👉@BookJava
Курс по Kubernetes для разработчиков. Видеокурс по Docker в подарок ⤵️

Ваша компания решила мигрировать сервисы на Kubernetes?
Большая часть интересных вам вакансий требует навыков в K8s?
Вы не врубаетесь, где границы ответственности девопсов и разработчиков в работе с кубами?

Разбираемся с этим на курсе Слёрма «Kubernetes для разработчиков» 😎

Старт потока — 22 июля

ПРОГРАММА КУРСА

Вас ждут:
7 недель обучения 
112 часов практики + 26 часов теории
Общий чат со студентами, экспертами и куратором
Стенды для отработки практических навыков
Сдача сертификации
Итоговый проект

Эксперты — действующие devops-инженеры:
➡️ Марсель Ибраев, Senior System Engineer G42 Cloud
➡️ Павел Селиванов, архитектор Yandex Cloud

🎁 При оплате обучения до 22 июля — видеокурс по основам Docker в подарок🎁

🔗 ПРОЙТИ ПЕРВЫЕ ТРИ УРОКА БЕСПЛАТНО
Совет 💡

Если вы хотите получить сообщение о первопричине, вы можете легко и безопасно получить его с помощью Apache Commons ExceptionUtils. Методы getRootCauseMessage(Exception ex) выдают сообщение в виде {ClassNameWithoutPackage} {ThrowableMessage}

👉@BookJava
⚛️Росатом ищет разработчиков на позицию Backend Developer (Java) HR TECH в Гринатом (IT-интегратор Росатома)

Требования: опыт разработки и поддержки микросервисов на Java; опыт работы с реляционным базами данных (PostgreSQL); опыт проведения Сode Review; знание основных методологий разработки программного обеспечения, принципов OOП, шаблонов проектирования, принципов SOLID, DRY, KISS; практика использования Test Containers в интеграционных тестах; отличное знание Spring/Spring Boot (Core, MVC/Webflux, Data/Integration, Security, Actuator, Auto configuration, AOP); опыт работы с Kafka; хорошее знание Maven/Gradle и CI/CD систем(Gitlab/Jenkins); профилирование кода, анализ дампов памяти, анализ логов, метрик и трассировок, тонкая настройка JVM.

Мы предлагаем: полностью удалённую работу на территории РФ или рабочее место в уютном офисе; конкурентную ЗП и премии, оформление по ТК с удобным графиком, выбор между удалёнкой и офисом, карьерный рост, ДМС со стоматологией, собственную платформу для обучения, конференции и тренинги.

👉Узнать подробнее и откликнуться можно по ссылке.
Как отладить удаленное приложение?

Если приложение работает не в продакшне, его паузы допустимы, а у потенциального злоумышленника нет сетевого доступа к хосту, стандартный способ отладки – непосредственно remote debug. Для этого приложение запускается с включенным протоколом удаленной отладки JDWP. Приложение принимает на указанный порт подключения отладчика. Это может быть отдельная утилита jdb, или встроенная в IDE.

В JDK поставляется набор инструментов для мониторинга. Например Java Mission Control и JConsole позволяют подключиться к приложению и посмотреть множество показателей его здоровья. Полный список инструментов специфичен для конкретной JVM, для HotSpot можно посмотреть в документации.

Вне зависимости от обстоятельств, всегда необходимо заранее позаботиться о диагностической информации номер один – логах. Как минимум, ни один встроенный инструмент не покажет вам информацию о событиях, определяемых бизнес-логикой вашего приложения. Логироваться должен необходимый минимум, который позволит при любом инциденте понять, что произошло.

В стандартную поставку Java включен пакет для логгирования java.util.logging, позже остановимся на нём подробнее. Также существует ряд популярных библиотек: Log4j, SLF4J, Logback. Про техники и сложности логгирования современного энтерпрайза есть неплохой доклад.

👉@BookJava
Бывают ли в Java утечки памяти?


Сначала стоит сказать, что это такое. Утечка памяти (memory leak) в широком смысле – потеря доступа к некоторой сущности, которая при этом всё еще остается «живой» и расходует ресурсы компьютера.

Основное отличие Java от языков вроде C – автоматическое управление памятью. В общем случае вам не нужно думать об удалении объекта из памяти. Когда он перестал быть нужен, сборщик мусора сделает это за вас.

Но всё-таки бывают случаи, когда JVM не способна помочь, и прибираться за собой нужно вручную:

1. Объекты в статических полях. Обычно они живут пока живёт класслоадер, который обычно живет до конца работы приложения. В эту же группу риска попадают синглтоны, которые обычно базируются на статиках. Отдельного внимания заслуживает случай утечки ThreadLocal.

2. Взаимодействие с нативным кодом и ручное управление памятью. Когда вы решаетесь на ручное/внешнее управление, вся ответственность за сборку мусора переходит на вас. Это касается использования Unsafe и нативных библиотек. Сюда же попадают различные утечки внешних ресурсов: например соединений с базой через нативный драйвер.

3. Неправильное использование коллекций. Несогласованность методов equals-hashCode может позволить ключам теряться внутри HashMap/HashSet. Размер зарезервированной памяти часто не совпадает с размером содержимого: тот же HashMap, однажды раздувшись, не умеет уменьшаться.
4. Использование finalize. Вмешиваясь в нормальную работу GC, вы, естественно, можете её нарушить. Поток финализации имеет низкий приоритет – даже корректная реализация метода может не успеть выполниться и привести к OutOfMemoryError.

5. Утечка inner-класса. В отличие от nested, inner класс содержит неявную ссылку на своего хозяина. Так что экземпляр хозяина гарантированно будет жить пока живут экземпляры его inner-классов.

6. Интернированные строки. Вызовом String.intern() вы подписываетесь под тем, что осознаете что делаете. Ручное использование оптимизационных хитростей JVM не может не сопровождаться риском. Поведение этого метода зависит от версии Java и реализации JVM.

7. Паттерн Flyweight/object pool. И пул строк, и вся модель памяти реализуют его. Неправильная программная реализация паттерна также может привести к утечке объектов – зависанию их в пулле без реальных применений снаружи.

8. Всевозможные логические утечки. Нарушение консистентности модели бизнес-данных может приводить к забытым объектам. Технически это всё еще один из пунктов выше. Типичный пример такой утечки – утечка Activity в Android.

Так что ответ на вопрос – редко, но бывают.


👉@BookJava
Spring Boot Microservices проект электронной коммерции: пошаговое руководство

В этом уроке мы создадим простое приложение для электронной коммерции, используя архитектуру микросервисов с Spring Boot и Spring Cloud. Мы создадим следующие микросервисы:
⚫️Сервис продуктов: Управляет информацией о продукте.
⚫️Сервис заказов: Управляет заказами клиентов.
⚫️Inventory Service: Управляет инвентаризацией продукции.
⚫️Сервер Eureka Server: Обнаружение сервисов.
⚫️Шлюз API: Действует как единая точка входа в систему.


https://www.sourcecodeexamples.net/2024/05/spring-boot-microservices-e-commerce-project.html

👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
🤝 Не дай себя завязнуть в рутинных задачах!

🦾 Осваивай Spring и выходи на новый профессиональный уровень

Пройди тест по Java от OTUS

Проверь насколько хорошо ты знаешь Java и готов освоить Spring!

Ответишь — пройдешь на продвинутый курс "Разработчик на Spring Framework" от OTUS по специальной цене.

👉 ПРОЙТИ ТЕСТ: https://vk.cc/cysfVZ

🎫 Начни обучение со скидкой в 10%, действует до конца июля.

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Please open Telegram to view this post
VIEW IN TELEGRAM
Совет по Java ☕️

В Java 22 появился новый форматированный тип ListFormat. Он создает или разбирает список конкатенированных строк с учетом локальных особенностей. Предусмотрено 3 типа конкатенации: STANDARD, OR и UNIT, и 3 стиля для каждого типа: FULL, SHORT и NARROW.

👉@BookJava
Советы по Java 💡

Как инициализировать collections или map в Java? Конечно, вы можете использовать, например, статическую инициализацию фабрики (`List.of(...)` или `Map.of(...)`).
Но вы также можете воспользоваться функцией "инициализации двойной скобкой"

👉@BookJava