Java for Beginner
745 subscribers
733 photos
208 videos
12 files
1.2K links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Реактивное программирование

Горячие и холодные Publisher’ы в реактивном программировании

Publisher — это источник данных в Reactive Streams, который "толкает" элементы подписчикам (Subscriber). Но не все Publisher’ы одинаковы по поведению при множественных подписках. Это зависит от того, генерирует ли он данные независимо от подписчиков (горячий) или заново для каждого (холодный).

Холодный Publisher (Cold Publisher): Данные генерируются лениво — только при подписке, и для каждого подписчика отдельно. Это как видео по запросу: каждый зритель получает свою копию потока. Плюс: свежие данные каждый раз. Минус: если источник дорогой (запрос в БД, вычисления), повторяется зря.

Горячий Publisher (Hot Publisher): Данные генерируются независимо от подписчиков — поток "вещает" непрерывно. Подписчики "подключаются" к существующему потоку и получают данные с момента подписки. Это как живой эфир: все слушают одно и то же, но опоздавшие пропускают начало. Плюс: экономия ресурсов (один источник). Минус: данные могут быть "старыми" или пропущенными.


В Project Reactor большинство конструкторов — холодные (just, fromIterable, range), но есть горячие (interval, push). Поведение можно менять операторами (share, cache).


Примеры холодных Publisher’ов: ленивость и независимость

Холодные — default в Reactor: подписка запускает генерацию заново.


Пример с Mono (одиночный элемент, но принцип тот же):
Mono<String> coldMono = Mono.fromCallable(() -> {
System.out.println("Генерация данных...");
return "Данные";
});

coldMono.subscribe(System.out::println); // Вывод: "Генерация данных..." и "Данные"
coldMono.subscribe(System.out::println); // Снова: "Генерация данных..." и "Данные"
Каждый subscribe() вызывает fromCallable заново — данные свежие, но если это запрос в API, будет два вызова.


С Flux:
   Flux<Integer> coldFlux = Flux.range(1, 3).doOnSubscribe(sub -> System.out.println("Новая подписка!"));
coldFlux.subscribe(val -> System.out.println("Подписчик 1: " + val));
coldFlux.subscribe(val -> System.out.println("Подписчик 2: " + val));
// Вывод: "Новая подписка!" + 1,2,3 для первого; "Новая подписка!" + 1,2,3 для второго

Каждый подписчик получает полный поток независимо. Полезно для idempotent операций (без side-effects), как чтение статичных данных.
Асинхронный пример: coldFlux = Flux.interval(Duration.ofSeconds(1)).take(3); // Каждый subscribe() запускает свой таймер.


Примеры горячих Publisher’ов: общий поток и вещание

Горячие — генерируют данные один раз, подписчики "присоединяются".


Пример с Flux.push (горячий по дизайну):
ConnectableFlux<Integer> hotFlux = Flux.push(sink -> {
// Симулируем внешний источник
new Thread(() -> {
for (int i = 1; i <= 3; i++) {
try { Thread.sleep(1000); } catch (InterruptedException e) {}
sink.next(i);
}
sink.complete();
}).start();
});

hotFlux.subscribe(val -> System.out.println("Подписчик 1: " + val));
Thread.sleep(1500); // Ждём, чтобы пропустить начало
hotFlux.subscribe(val -> System.out.println("Подписчик 2: " + val));
hotFlux.connect(); // Запуск горячего

// Вывод примерно: Подписчик 1: 1 (1с), 2 (2с), 3 (3с); Подписчик 2: 2 (присоединился после 1), 3

Второй пропустил 1 — поток общий. Connect() — триггер для ConnectableFlux (обёртка для горячих).


Другой горячий:
Flux.interval(Duration.ofSeconds(1)) — бесконечный таймер, вещает независимо.
Оператор share(): Делает холодный горячим.
Flux<Integer> shared = coldFlux.share();
shared.subscribe(...); // Запускает
shared.subscribe(...); // Присоединяется к существующему



#Java #middle #Reactor #WebFlux #Mono #Flux
👍2
Переключение типов: операторы для контроля

Из холодного в горячий: share() (для Flux), cache() (кэширует элементы для повторов), publish() (ConnectableFlux с backpressure).

Пример cache:
coldMono.cache() — первый subscribe генерирует, последующие — из кэша.
Из горячего в холодный: Редко нужно, но replay() на ConnectableFlux кэширует историю для новых подписчиков.


Сценарии:
Холодный: Запросы к БД (каждый клиент — свежие данные).
Горячий: Мониторинг (один сенсор — всем подписчикам), стриминг событий (Kafka topic).


Практические советы и подводные камни


Диагностика: doOnSubscribe(() -> log("Subscribe")) — увидите, сколько раз запускается.
Камень: Холодный с side-effects (мутации) — непредсказуемо при множественных подписках; используйте defer() для ленивости.
Камень: Горячий бесконечный без take() — утечки; добавьте refCount() на publish() для авто-отписки при 0 подписчиках.
Совет: В WebFlux — Flux из БД (R2DBC, пост 17) холодный по умолчанию; share() для кэширования результатов.
Тестирование: StepVerifier с .publish() для симуляции горячих.



#Java #middle #Reactor #WebFlux #Mono #Flux
👍2
Что выведет код?

import java.util.concurrent.*;

public class Task241025 {
public static void main(String[] args) throws InterruptedException {
BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(2);

System.out.print(queue.offer(1) + " ");
System.out.print(queue.offer(2) + " ");
System.out.print(queue.offer(3, 100, TimeUnit.MILLISECONDS) + " ");

System.out.print(queue.poll() + " ");
System.out.print(queue.offer(3) + " ");
System.out.print(queue.poll() + " ");
System.out.print(queue.poll() + " ");
}
}


#Tasks
👍1
Вопрос с собеседований

Чем отличается checked cast от instanceof + cast? 🤓


Ответ:

Checked cast
((String) obj) может выбросить ClassCastException.

Использование instanceof позволяет сначала проверить тип, а затем безопасно привести объект.

Это предотвращает ошибки в рантайме.



#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
История IT-технологий сегодня — 25 октября


ℹ️ Кто родился в этот день

Петер Наур (дат. Peter Naur; 25 октября 1928, Фредериксберг — 3 января 2016, Херлев) — датский учёный-информатик, один из разработчиков ALGOL 60 и соавтор нотации Бэкуса–Наура (BNF), оказавшей огромное влияние на синтаксический анализ языков программирования.

Венди Холл, DBE FRS FREng MAE FIET (родилась 25 октября 1952 года) — британский исследователь в области Web Science и семантических веб-технологий; одна из ведущих фигур в развитии исследований Всемирной паутины и академического CS в Великобритании.


🌐 Знаковые события

2001 — выпущена система Microsoft Windows XP.


#Biography #Birth_Date #Events #25Октября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
История IT-технологий сегодня — 26 октября


ℹ️ Кто родился в этот день

Брендан Дэмиен Маккей (родился 26 октября 1951 года) — австралийский учёный (компьютерные науки и комбинаторика), внес значимый вклад в вычислительную теорию графов и алгоритмическую комбинаторику; автор множества алгоритмов и программ для исчерпывающего поиска в графах.


🌐 Знаковые события

1861 — немецкий изобретатель Филипп Рейс во Франкфурте продемонстрировал своё изобретение, которое он назвал телефоном.

2012 — выпуск операционной системы Windows 8.


#Biography #Birth_Date #Events #26Октября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
💸 Измерим твою цену в рублях?


Вот о чём думают каждый вкатун и джун в начале пути?

Наверно:
“Вот бы мне знать весь Spring, Quarkus и написать свой компилятор.”
“Удалёнка, спать до обеда и лавандовый раф на завтрак.”

Да ладно...
Вспомни себя, когда ты только думал о начале обучения 😏

Все как один думают о зарплате.

О том, как быстро смогут подрасти по грейду, по цифрам и по лайкам под постом о первом оффере.



🫰 Мир, где деньги = значимость

Так уж устроено — мы живём в обществе, где сумма на счёте практически определяет, кто ты.
Купил айфон — молодец.
Ходишь пешком — лох.

А теперь добавь сюда программистов, где каждый второй гордо пишет “Middle 250k” в профиле и считает, что это уже характеристика личности.


Но вот вопрос: зарплата — это действительно твоя ценность, или просто временная рыночная оценка твоего труда?


🧑‍💻 Везунчики на старте.

Иногда некоторым просто везет. 🤷‍♀️

Компания в моменте расширяется, стартап получил инвестиции, или программист угадал хайповый стек.
И вот неожиданно он — “молодец”. Хотя внутри всё тот же растерянный джун, просто с хорошим прайсом.

А бывает и наоборот: человек пашет, реально шарит, но получает меньше, потому что не умеет себя продавать, живёт не в столице или просто не хочет прыгать по вакансиям ради пары тысяч.

И кто из них лучше?

Тот, кто умнее?
Или тот, кто просто дороже стоит на hh?



⛔️ Проблема начинается, когда ты меришь себя чужим оффером

“Он получает больше. Значит, он лучше.”

Вот так и начинается внутренний диссонанс, который выжигает уверенность, мотивацию и любовь к делу.

А потом приходят выгорание, обида и мысли вроде:
“Да пошло оно всё, если рынок не ценит”.

Но рынок никого не ценит.
Он просто платит столько, сколько сейчас может.
Он не меряет твою душу, потенциал и умение учиться. Только ту выгоду, которую ты можешь в итоге принести.



🤫 Как жить, если твой сосед зарабатывает больше?

Пойми:
Деньги — не показатель личности, ума, знаний и опыта.


Развивайся, а не сравнивай.
Зарплата может упасть, проект может закрыться, а вот навыки и адекватность останутся при тебе.
Настоящий уровень — это не оффер, а то, что ты можешь, когда оффера нет.
Делай ставку на свое ежедневное развитие, а не на 3-х месячный оффер сеньора, откуда тебя с треском выпнут.
Время так или иначе все расставит по своим местам.

Не завидуй — анализируй.
Если кто-то получает больше — попробуй понять, почему.
У него может быть другой стек, опыт, знания языка, регион.
Это не повод злиться, это повод задуматься.

Понимаешь, что ты лучше — борись.

Ты видишь, что твой "коллега" получает в 2 раза больше чем ты, но не может пройти твоего ревью?
Значит пора что-то менять. Пора начинать толкаться плечами, ведь ты хочешь жить лучше?

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


Так что да, твоя зарплата — не ты. И не уровень твоих компетенций.

Но то, как ты к ней относишься — говорит о тебе громче, чем цифры в оффере.

Кичиться в моменте что ты получаешь 400к, но не знаешь и не слышал, к примеру о Spring AI - глупо.
Завтра тебя перепрыгнет более опытный в нужном стеке мидл, а ты пойдешь на дно.

Поэтому развитие и связи — это приоритет, а офферы лишь заслуженное приложение.

А для этого надо общаться и учиться...

И быть подписанным на наш канал ☺️😉


Понравилась статья - поделись с другом, позови его на канал и будет тебе моя благодарность
🤝

😎

#motivation
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥71