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

Список наших каналов: https://t.iss.one/proglibrary/9197

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

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

РКН: https://gosuslugi.ru/snet/67a5bbda1b17b35b6c1a55c4
Download Telegram
🔍 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
✔️ Concurrency-тест: Реализация Thread-Safe Cache

Напишите потокобезопасный кеш с TTL и размером 👇

📦 Задание


Реализуйте ExpiringCache<K, V> — thread-safe кеш с автоматическим удалением устаревших записей.
public class ExpiringCache<K, V> {
public void put(K key, V value, Duration ttl) { }
public Optional<V> get(K key) { }
public void remove(K key) { }
public int size() { }
}


📋 Требования

1. Функциональность

put() — добавить элемент с TTL (time-to-live)
get() — получить элемент, вернуть Optional.empty() если истёк
remove() — удалить элемент
size() — количество валидных (не истёкших) элементов

2. Потокобезопасность

→ Все операции должны быть thread-safe
→ Минимизировать блокировки (не использовать synchronized на весь объект)
→ Одновременное чтение не должно блокироваться
— Производительность
→ get() должен быть O(1) в среднем случае
→ Автоматическая очистка истёкших записей (passive + active eviction)
→ Не создавать отдельный поток для каждого элемента

3. Ограничения

→ Максимальный размер кеша — 1000 элементов
→ При превышении удалять самые старые записи (LRU)
→ Graceful shutdown при закрытии кеша

Бонус: Добавить метрики (cache hits/misses)

Ставьте → 🔥, если нравится формат. Если нет → 🤔

💬 Пишите решение в комментариях, главное прячьте под спойлер.

🐸 Библиотека собеса по Java

#practise
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21🤔3👍2👾1
Не лови StackOverflow в карьере

Enterprise-разработка не прощает пробелов в базе. Spring, Hibernate, Kafka — это круто, но без понимания алгоритмов и паттернов ты рискуешь писать код, который стыдно поддерживать.

Предложение 1 + 2:

Покупаешь один курс — получаешь три. Оплачивается только позиция с максимальным прайсом.

Must have для Java-дева:

— алгоритмы и структуры данных;
— архитектуры и шаблоны проектирования.

Deploy to Production

Действует до 31 декабря.

Менеджер бинов (и курсов): @manager_proglib
👑 Магия 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
👍8🔥31👏1
Какой паттерн позволяет добавлять новую функциональность объектам динамически, оборачивая их в объекты без изменения исходного кода?
Anonymous Quiz
28%
Proxy
52%
Decorator
12%
Adapter
4%
Composite
4%
Посмотреть ответ
👍6🤔3🔥1
😮 Топ-вакансий для джавистов за неделю

Java Developer (XWiki, Knowledge Base / FAQ) — удалёнка

Middle+ Java Engineer Keycloak (Medtech) — до 345 000 ₽ — удалёнка

TechLead / Senior Java-разработчик backend (монолит) — от 300 000 до 400 000 ₽ — гибрид (Москва)

➡️ Еще больше топовых вакансий — в нашем канале Java jobs
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1👏1