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

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
История IT-технологий сегодня — 24 октября


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

Пьер Жиль де Жен (фр. Pierre-Gilles de Gennes; 24 октября 1932 года, Париж — 18 мая 2007, Орсе[фр.]) — французский физик, лауреат Нобелевской премии по физике в 1991 году. Де Жен известен прежде всего тем, что открыл структуру, положившую начало производству ЖК-дисплеев. За множество фундаментальных открытий члены Нобелевского комитета назвали де Жена «Ньютоном нашего времени».

Вернер Бухгольц (24 октября 1922 г. – 11 июля 2019 г.) — учёный-информатик германо-американского происхождения; работал в IBM, и в июне 1956 года ввёл термин «byte» (единица цифровой информации) для обозначения группы битов.

Чарльз Джозеф Колборн (родился 24 октября 1953 года) — канадский информатик и математик, специалист по графовым алгоритмам и комбинаторике, профессор в Arizona State University.


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

1861 — по телеграфу передана первая в мире трансконтинентальная телеграмма — от судьи Стефана Дж. Филда (Stephen J. Field) из Калифорнии президенту США Аврааму Линкольну.

2007 — с космодрома Сичан с помощью ракеты-носителя Чанчжэн-3А запущена китайская АМС Чанъэ-1, предназначенная для исследования Луны.



#Biography #Birth_Date #Events #24Октября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Реактивное программирование

Горячие и холодные 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
Переключение типов: операторы для контроля

Из холодного в горячий: 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
Что выведет код?

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