🔹 RestTemplate
javaRestTemplate restTemplate = new RestTemplate();
ResponseEntity<User> response = restTemplate.getForEntity(
"https://api.example.com/users/{id}",
User.class,
userId
);
User user = response.getBody();
🔹 WebClient
javaWebClient webClient = WebClient.create("https://api.example.com");
Mono<User> userMono = webClient.get()
.uri("/users/{id}", userId)
.retrieve()
.bodyToMono(User.class);🔹 Технические нюансы
— Thread model: RestTemplate использует по потоку на запрос (blocking I/O). WebClient работает на event loop с малым числом потоков (по умолчанию CPU cores * 2).
— Performance: в синхронных сценариях разница минимальна. При параллельных запросах WebClient показывает x2-x5 прирост throughput за счёт эффективного использования потоков.
— Memory footprint: 1000 параллельных REST вызовов через RestTemplate = ~1000 МБ стека потоков. WebClient с той же нагрузкой — десятки МБ.
— Timeout configuration: RestTemplate требует настройки через ClientHttpRequestFactory. WebClient имеет встроенный .timeout(Duration) в цепочке вызовов.
— Error handling: RestTemplate выбрасывает исключения синхронно. WebClient возвращает Mono с ошибкой.
— Testing: RestTemplate легко мокается через MockRestServiceServer. WebClient требует понимания StepVerifier из reactor-test.
— Compatibility: RestTemplate работает везде. WebClient требует Spring WebFlux в classpath, даже если используешь его в обычном Spring MVC приложении.
WebClient если стартуешь новый проект, делаешь микросервисы с высокой нагрузкой, уже используешь reactive stack или планируешь масштабироваться. RestTemplate если поддерживаешь legacy код без реактивности, команда не знакома с Project Reactor, делаешь простой CRUD сервис с малой нагрузкой.
Главное помни: преждевременная оптимизация — корень зла. Если RestTemplate закрывает задачу, не усложняй. Но если упираешься в потоки на проде, время учить реактивщину.
══════ Навигация ══════
Вакансии • Задачи • Собесы
#CoreJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥3❤2👏1
Собираем фулл-хаус: 3 курса по цене 1
Хватит выбирать между «полезно», «модно» и «для души». Мы запустили механику, которая позволяет собрать кастомный стек навыков без удара по бюджету: покупаете один курс — два других забираете бесплатно.
Java-разработка немыслима без паттернов. Забирайте архитектуру и шаблоны проектирования, чтобы говорить на одном языке с сеньорами. Для прохождения фильтров в корпорации — алгоритмы и структуры данных.
Для тех, кто смотрит в сторону Data Engineering или ML — полный набор по AI: от математики и ML-старта до разработки автономных агентов.
Ну и классика: обновлённый Python как удобный инструмент для вспомогательных скриптов.
Собрать свой пак
Хватит выбирать между «полезно», «модно» и «для души». Мы запустили механику, которая позволяет собрать кастомный стек навыков без удара по бюджету: покупаете один курс — два других забираете бесплатно.
Java-разработка немыслима без паттернов. Забирайте архитектуру и шаблоны проектирования, чтобы говорить на одном языке с сеньорами. Для прохождения фильтров в корпорации — алгоритмы и структуры данных.
Для тех, кто смотрит в сторону Data Engineering или ML — полный набор по AI: от математики и ML-старта до разработки автономных агентов.
Ну и классика: обновлённый Python как удобный инструмент для вспомогательных скриптов.
Собрать свой пак
Начиная с Spring 4.2 (2015 год!), классы событий больше не обязаны наследовать ApplicationEvent.
🔹 До Spring 4.2:
public class UserCreatedEvent extends ApplicationEvent {
private final String username;
public UserCreatedEvent(String username) {
this.username = username;
}
public String getUsername() {
return username;
}
}🔹 Начиная с Spring 4.2+:
// Просто POJO
public class UserCreatedEvent {
private final String username;
public UserCreatedEvent(String username) {
this.username = username;
}
// getters...
}
🔹 Использование идентично:
@Service
public class UserService {
@Autowired
private ApplicationEventPublisher publisher;
public void createUser(String username) {
publisher.publishEvent(new UserCreatedEvent(username));
}
}
@EventListener
public void onUserCreated(UserCreatedEvent event) {
log.info("User created: {}", event.username());
}
Использование обычных POJO-классов в качестве событий делает код независимым от Spring Framework, что улучшает тестируемость и переносимость приложения.
══════ Навигация ══════
Вакансии • Задачи • Собесы
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍4❤2🤔2
Please open Telegram to view this post
VIEW IN TELEGRAM
😁24💯4🔥3
Forwarded from Библиотека собеса по Java | вопросы с собеседований
Напишите production-ready Spring компонент 👇
📦 Задание
Реализуйте кастомную аннотацию @RateLimit, которая ограничивает количество вызовов метода с использованием Spring AOP.
🔹 Требования
— Использовать Spring AOP
— Потокобезопасность
— Кэш лимитов
— Учитывать имя метода + параметры
— Custom exception при превышении
Ставьте → 🔥, если нравится формат. Если нет → 🤔
#practise
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥22❤2👍2👏1🤔1
Нужно изменить одинаковый код в 10 местах? Обычно делаешь Find & Replace или правишь вручную каждую строку. Есть способ быстрее — Multiple Cursors. Редактируешь несколько мест одновременно.
🔹 Что это
Несколько курсоров в редакторе. Печатаешь один раз — изменения применяются везде сразу. Как Vim visual block mode, но удобнее.
🔹 Как использовать
— Alt+J (Win/Linux) или Ctrl+G (Mac) — выделить следующее вхождение слова под курсором
— Alt+Shift+J — убрать последний курсор
— Ctrl+Alt+Shift+J — выделить ВСЕ вхождения сразу
— Alt+Shift+Click — поставить курсор мышью
— Alt+Shift+Insert → Column Selection Mode — выделение столбцом
🔹 Зачем это нужно
— Массовое редактирование без регулярок
— Быстрее Find & Replace для простых случаев
— Видишь изменения сразу, контролируешь процесс
══════ Навигация ══════
Вакансии • Задачи • Собесы
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥5❤1👏1😁1
This media is not supported in your browser
VIEW IN TELEGRAM
Платформа с реальными DevOps-задачами. Кейсы по Linux, Docker и Kubernetes — всё как в бою, но с читами:
══════ Навигация ══════
Вакансии • Задачи • Собесы
#CoreJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥4👏1
🔬 Правильный вопрос про AI
Все исследования AI-ассистентов меряют одно: насколько быстрее ты закрываешь задачу. Метрика удобная, но она игнорирует 70–80% реальных затрат — поддержку, рефакторинг, устранение дефектов.
Исследование «Echoes of AI» (arXiv, 2025) спросило другое:
«Что будет, когда другой разработчик возьмёт AI-код и попытается его развивать?»
151 участник, 95% практикующие разработчики (не студенты). Java/Spring Boot проект, две фазы, настоящее РКИ. Одна группа пишет с AI, другая без. Потом третья группа без AI поддерживает и тот, и другой код.
Результат оказался неожиданный.
👉 Читать
══════ Навигация ══════
Вакансии • Задачи • Собесы
🐸 Библиотека джависта
#CoreJava
Все исследования AI-ассистентов меряют одно: насколько быстрее ты закрываешь задачу. Метрика удобная, но она игнорирует 70–80% реальных затрат — поддержку, рефакторинг, устранение дефектов.
Исследование «Echoes of AI» (arXiv, 2025) спросило другое:
«Что будет, когда другой разработчик возьмёт AI-код и попытается его развивать?»
151 участник, 95% практикующие разработчики (не студенты). Java/Spring Boot проект, две фазы, настоящее РКИ. Одна группа пишет с AI, другая без. Потом третья группа без AI поддерживает и тот, и другой код.
Результат оказался неожиданный.
👉 Читать
══════ Навигация ══════
Вакансии • Задачи • Собесы
#CoreJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤1🔥1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁25👍3❤2💯1
Forwarded from Библиотека задач по Java | тесты, код, задания
В каком порядке выполнятся операции при создании Spring-бина?
Anonymous Quiz
32%
Constructor → @Autowired → @PostConstruct → InitializingBean.afterPropertiesSet()
23%
@Autowired → Constructor → @PostConstruct → InitializingBean.afterPropertiesSet()
28%
Constructor → @PostConstruct → @Autowired → InitializingBean.afterPropertiesSet()
8%
@PostConstruct → Constructor → @Autowired → InitializingBean.afterPropertiesSet()
9%
Посмотреть ответ
👍5🔥3❤2👏1
🧩 Просто о сложном: Saga Pattern
Когда пользователь оформляет заказ, нужно списать деньги, зарезервировать товар и уведомить склад. Всё в разных сервисах. Что делать, если один из них упал?
Обычная транзакция тут не поможет. Добро пожаловать в Saga.
Идея проста: разбиваем большую распределённую транзакцию на цепочку маленьких локальных. Каждый шаг — это своя транзакция в своём сервисе. Если что-то пошло не так, то запускаем компенсирующие транзакции в обратном порядке.
🔹 Два подхода
1. Choreography (хореография)
Сервисы общаются через события. Каждый сам знает, что делать дальше.
✔️ Просто, нет единой точки отказа
❌ Сложно отследить весь флоу, спагетти из событий
2. Orchestration (оркестрация)
Есть дирижёр — Saga Orchestrator. Он знает весь сценарий и командует сервисами.
✔️ Флоу виден в одном месте, легко дебажить
❌ Оркестратор может стать узким местом
⚠️ Важно понимать: компенсирующая транзакция ≠ откат БД. Это бизнес-операция. Если деньги уже списаны, то мы не откатываем строку в БД, мы делаем возврат.
В Java-экосистеме Saga используют вместе с:
→ Apache Kafka / RabbitMQ — для событий между сервисами
→ Axon Framework — встроенная поддержка Saga из коробки
→ Spring State Machine — для управления состоянием оркестратора
→ Temporal / Conductor — оркестрация workflow на уровне инфраструктуры
🔹 Когда использовать
✔️ Микросервисная архитектура
✔️ Несколько БД, нет возможности использовать 2PC
✔️ Долгоживущие бизнес-транзакции
❌ Монолит с одной БД — просто используй @Transactional
Saga — это не серебряная пуля, это компромисс. Ты жертвуешь изоляцией ради масштабируемости. Данные могут быть временно не консистентны и это нормально, если бизнес с этим согласен.
══════ Навигация ══════
Вакансии • Задачи • Собесы
🐸 Библиотека джависта
#CoreJava
Когда пользователь оформляет заказ, нужно списать деньги, зарезервировать товар и уведомить склад. Всё в разных сервисах. Что делать, если один из них упал?
Обычная транзакция тут не поможет. Добро пожаловать в Saga.
Идея проста: разбиваем большую распределённую транзакцию на цепочку маленьких локальных. Каждый шаг — это своя транзакция в своём сервисе. Если что-то пошло не так, то запускаем компенсирующие транзакции в обратном порядке.
🔹 Два подхода
1. Choreography (хореография)
Сервисы общаются через события. Каждый сам знает, что делать дальше.
OrderService → [OrderCreated] → PaymentService
PaymentService → [PaymentDone] → InventoryService
InventoryService → [Reserved] → NotificationService
2. Orchestration (оркестрация)
Есть дирижёр — Saga Orchestrator. Он знает весь сценарий и командует сервисами.
public class OrderSagaOrchestrator {
public void execute(Order order) {
try {
paymentService.charge(order);
inventoryService.reserve(order);
notificationService.notify(order);
} catch (PaymentException e) {
// компенсация не нужна — деньги не списаны
} catch (InventoryException e) {
paymentService.refund(order); // компенсируем
}
}
}В Java-экосистеме Saga используют вместе с:
→ Apache Kafka / RabbitMQ — для событий между сервисами
→ Axon Framework — встроенная поддержка Saga из коробки
→ Spring State Machine — для управления состоянием оркестратора
→ Temporal / Conductor — оркестрация workflow на уровне инфраструктуры
🔹 Когда использовать
Saga — это не серебряная пуля, это компромисс. Ты жертвуешь изоляцией ради масштабируемости. Данные могут быть временно не консистентны и это нормально, если бизнес с этим согласен.
══════ Навигация ══════
Вакансии • Задачи • Собесы
#CoreJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤2🔥2👏1👾1
Enterprise AI: когда MVP уже не прокатит
В корпоративном секторе требования к AI жёстче: безопасность, стабильность, работа с документами. Мы обновили курс «Разработка AI-агентов», добавив модули, критически важные для Enterprise-разработки.
Java-инженерам будет интересно:
🔹 Advanced RAG. Работа со сложной корпоративной документацией (сканы, таблицы), улучшение поиска и безопасности данных.
🔹 Legal Tech. Как внедрять агентов с соблюдением 152-ФЗ и юридических норм.
🔹 Надёжность. Внедрение
🔹 Legacy. Управление браузером и старыми интерфейсами через агентов.
Стартуй сейчас! Покупаешь курс — сразу получаешь материалы.
🎟 ПромокодAgent — скидка 10 000 ₽ (до 28 февраля).
👉 AI для Enterprise-задач
В корпоративном секторе требования к AI жёстче: безопасность, стабильность, работа с документами. Мы обновили курс «Разработка AI-агентов», добавив модули, критически важные для Enterprise-разработки.
Java-инженерам будет интересно:
🔹 Advanced RAG. Работа со сложной корпоративной документацией (сканы, таблицы), улучшение поиска и безопасности данных.
🔹 Legal Tech. Как внедрять агентов с соблюдением 152-ФЗ и юридических норм.
🔹 Надёжность. Внедрение
Human-in-the-loop для контроля, логирование, трассировка и предотвращение регрессий.🔹 Legacy. Управление браузером и старыми интерфейсами через агентов.
Стартуй сейчас! Покупаешь курс — сразу получаешь материалы.
🎟 Промокод
👉 AI для Enterprise-задач
Java-разработчик — Офис (Казань)
Java-разработчик — от 230 000 до 330 000 ₽ — удалёнка/гибрид (Москва)
Senior Java Developer (Kotlin) — от 400 000 ₽ — удалёнка
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤1🔥1
Наглядная шпаргалка с примерами и визуализацией SQL JOIN.
══════ Навигация ══════
Вакансии • Задачи • Собесы
#CoreJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤6⚡2🔥2
Please open Telegram to view this post
VIEW IN TELEGRAM
😁37👍6🔥4
ИИ-агенты в Enterprise: как подружить LLM и суровый продакшн
Интегрировать нейросеть в корпоративный бэкенд на Java — это не просто дёрнуть API. Бизнес требует предсказуемости, отказоустойчивости и строгих лимитов. Агенты не должны ложиться от кривых данных или сливать бюджет на бесконечные ретраи.
Мы полностью обновили курс по разработке AI-агентов. Теперь фокус на enterprise-подходе: логирование, трассировка, изоляция доменов и предсказуемое поведение систем.
Что в инженерном фокусе нового потока:
— промышленный RAG: извлечение данных из legacy-баз, сканов и сложных таблиц;
— архитектура агентов: внедрение human-in-the-loop для аппрува критичных транзакций;
— ресурсоёмкость: жёсткий контроль кэша, токенов и переключение режимов обработки;
— интеграции: учим агентов взаимодействовать с легаси-интерфейсами и браузерами;
— комплаенс: развёртывание решений с полным соблюдением 152-ФЗ.
Используйте промокод
Выбирайте акцию «3 курса по цене 1», чтобы забрать два дополнительных курса в подарок.
Внедрить AI в Enterprise
Интегрировать нейросеть в корпоративный бэкенд на Java — это не просто дёрнуть API. Бизнес требует предсказуемости, отказоустойчивости и строгих лимитов. Агенты не должны ложиться от кривых данных или сливать бюджет на бесконечные ретраи.
Мы полностью обновили курс по разработке AI-агентов. Теперь фокус на enterprise-подходе: логирование, трассировка, изоляция доменов и предсказуемое поведение систем.
Что в инженерном фокусе нового потока:
— промышленный RAG: извлечение данных из legacy-баз, сканов и сложных таблиц;
— архитектура агентов: внедрение human-in-the-loop для аппрува критичных транзакций;
— ресурсоёмкость: жёсткий контроль кэша, токенов и переключение режимов обработки;
— интеграции: учим агентов взаимодействовать с легаси-интерфейсами и браузерами;
— комплаенс: развёртывание решений с полным соблюдением 152-ФЗ.
Используйте промокод
Agent до 28 февраля, чтобы получить скидку 10 000 рублей.Выбирайте акцию «3 курса по цене 1», чтобы забрать два дополнительных курса в подарок.
Внедрить AI в Enterprise
Мне НЕ нужно разбираться с управлением памятью в Java, так как за меня всё делает GC
Garbage Collector (GC) действительно очищает неиспользуемые объекты, которые больше не имеют активных ссылок. Благодаря этому в Java не нужно вручную освобождать память, как в C++.
Несколько предпосылок к исходному тезису:
🔹 В других языках, где ручное управление памятью (C, C++), утечки очевидны — если забыл free(), память навсегда потеряна.
🔹 В Java GC работает автоматически, поэтому кажется, что он решает все проблемы сам.
🔹 "Ну раз GC есть, значит, про память можно не думать!" — типичная ошибка.
GC удаляет только те объекты, которые больше не имеют активных ссылок. Если же объект остаётся доступным, но фактически не используется, он будет занимать память до завершения работы приложения.
Если создать static List и постоянно добавлять в него объекты, они никогда не будут удалены GC, потому что статические поля живут весь срок жизни приложения.
public class MemoryLeak {
private static final List<byte[]> cache = new ArrayList<>();
public static void main(String[] args) {
while (true) {
cache.add(new byte[10 * 1024 * 1024]);
System.out.println("Добавили 10MB в кеш. Используемая память: " +
(Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (1024 * 1024) + "MB");
}
}
}Через пару минут — OutOfMemoryError
Объекты, хранящиеся в ThreadLocal, привязываются к потоку, а в пуле потоков они могут жить дольше, чем нужно.
public class ThreadLocalLeak {
private static final ThreadLocal<byte[]> threadLocalData = new ThreadLocal<>();
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {
executor.execute(() -> {
threadLocalData.set(new byte[10 * 1024 * 1024]); // 10MB на поток
System.out.println("Память занята потоком!");
});
}
executor.shutdown();
}
}Поток завершится, а память останется занята, потому что ThreadLocal не очищается автоматически.
Если анонимный класс или лямбда-ссылка ссылается на внешний объект, она может мешать GC очистить его.
public class InnerClassLeak {
private String data = "Очень важные данные";
public void createAnonymousClass() {
Runnable task = new Runnable() {
@Override
public void run() {
System.out.println("Используем: " + data);
}
};
new Thread(task).start();
}
}task ссылается на data, даже если InnerClassLeak больше не используется → GC не очистит объект.
══════ Навигация ══════
Вакансии • Задачи • Собесы
#CoreJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17❤5🔥3
Forwarded from Библиотека собеса по Java | вопросы с собеседований
Задача из реального интервью в Google 👇
📦 Задание
Google хочет проанализировать самые популярные категории поиска для оптимизации результатов.
Таблицы на картинке. Напишите запрос для подсчета общего количества поисков в каждой категории по месяцам за 2024 год.
Ставьте → 🔥, если нравится формат. Если нет → 🤔
#practise
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15❤1👍1
☕ AI-агенты в Enterprise: от прототипов на коленке к надёжным JVM-системам
Для Java-разработчика важна стабильность и предсказуемость. В новом курсе по AI-агентам мы учим строить системы, которые не «галлюцинируют» в продакшене, а работают по строгим инженерным метрикам и соблюдают законы РФ.
📚 В обновлённой программе:
— управляемый инжиниринг: трассировка ошибок, логирование и контроль производительности;
— правовое поле: развёртывание AI-решений с учётом
—
— продвинутый
Доступ к вводным материалам открывается сразу после покупки — начните погружение в архитектуру агентов 2026 года.
⏳ Специальные условия до 28 февраля:
— введите промокод
— участвуйте в **акции «3 курса по цене 1» — выберите два любых курса в дополнение к основному.
👉 Получить доступ к курсу и подаркам
Для Java-разработчика важна стабильность и предсказуемость. В новом курсе по AI-агентам мы учим строить системы, которые не «галлюцинируют» в продакшене, а работают по строгим инженерным метрикам и соблюдают законы РФ.
📚 В обновлённой программе:
— управляемый инжиниринг: трассировка ошибок, логирование и контроль производительности;
— правовое поле: развёртывание AI-решений с учётом
152-ФЗ и всей документации;—
LangGraph промышленного уровня: интеграция human-in-the-loop в бизнес-процессы;— продвинутый
RAG: работа с корпоративными данными, таблицами и сканами.Доступ к вводным материалам открывается сразу после покупки — начните погружение в архитектуру агентов 2026 года.
⏳ Специальные условия до 28 февраля:
— введите промокод
Agent для получения скидки 10 000 рублей**; — участвуйте в **акции «3 курса по цене 1» — выберите два любых курса в дополнение к основному.
👉 Получить доступ к курсу и подаркам
This media is not supported in your browser
VIEW IN TELEGRAM
Прямо в браузере можно посмотреть, что происходит под капотом кода: как создаются и взаимодействуют объекты, как данные перемещаются в памяти, и как работает стек вызовов. Всё это можно увидеть пошагово.
Если что-то непонятно, встроенный AI-помощник объяснит логику кода или поможет разобраться в чужом решении.
══════ Навигация ══════
Вакансии • Задачи • Собесы
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥3❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁28👍3🔥1