Содержание.
Глава 1. Реактивное программирование с применением Rxjava 20
Реактивное программирование и RxJava 20
Когда возникает нужда в реактивном программировании 22
Как работает RxJava 23
Проталкивание и вытягивание 23
Синхронный и асинхронный режим 25
Конкурентность и параллелизм 28
Ленивые и энергичные типы 31
Двойственность 33
Одно или несколько? 34
Учет особенностей оборудования: блокирующий и неблокирующий ввод-вывод 39
Абстракция реактивности 44
Глава 2. Реактивные расширения 45
Анатомия rx.Observable 45
Подписка на уведомления от объекта Observable 48
Получение всех уведомлений с помощью типа Observer<T> 50
Управление прослушивателями с помощью типов Subscription и Subscriber<T> 50
Создание объектов Observable 52
Подробнее о методе Observable.create() 53
Бесконечные потоки 56
Хронометраж: операторы timer() и intervalQ 61
Горячие и холодные объекты Observable 61
Практический пример: от API обратных вызовов к потоку Observable 63
Управление подписчиками вручную 68
Класс rx.subjects. Subject 69
Тип ConnectableObservable 71
Реализация единственной подписки с помощью publish().refCount() 72
Жизненный цикл ConnectableObservable 74
Резюме 77
Глава 3. Операторы и преобразования 79
Базовые операторы: отображение и фильтрация 79
Взаимно однозначные преобразования с помощью тар() 81
Обертывание с помощью flatMap() 85
Откладывание событий с помощью оператора delay() 90
Порядок событий после flatMapO 91
Сохранение порядка с помощью concatMap() 93
Более одного объекта Observable 95
Обращение с несколькими объектами Observable, как с одним, с помощью merge() 95
Попарная композиция с помощью zip() и zipWith() 97
Когда потоки не синхронизированы: combineLatest(), withLatestFrom() и amb() 100
Более сложные операторы: collect(), reduce(), scan(), distinctQ и groupBy() 106
Просмотр последовательности с помощью Scan и Reduce 106
Редукция с помощью изменяемого аккумулятора: collect() 108
Проверка того, что Observable содержит ровно один элемент, с помощью singleQ 109
Устранение дубликатов с помощью distinct() и distinctUntilChanged() 110
Выборка с помощью операторов skip(), takeWhileQ и прочих 112
Способы комбинирования потоков: concat(), merge() и switchOnNext() 114
Расщепление потока по условию с помощью groupByQ 121
Написание пользовательских операторов 125
Повторное использование операторов с помощью compose() 125
Реализация более сложных операторов с помощью lift() 127
Резюме 133
Глава 4. Применение реактивного программирования в существующих приложениях 134
От коллекций к Observable 135
BiockingObservable: выход из реактивного мира 135
О пользе лени 138
Композиция объектов Observable 140
Ленивое разбиение на страницы и конкатенация 141
Императивная конкурентность 142
flatMapO как оператор асинхронного сцепления 148
Замена обратных вызовов потоками 153
Периодический опрос изменений 156
Многопоточность в RxJava 157
Что такое диспетчер? 158
Декларативная подписка с помощью subscribeOnQ 167
Конкурентность и поведение subscribeOn() 171
Создание пакета запросов с помощью groupByQ 175
Декларативная конкурентность с помощью observeOn() 177
Другие применения диспетчеров 180
Резюме 181
Глава 5. Реактивность сверху донизу 183
Решение проблемы C10k 183
Традиционные HTTP-серверы на основе потоков 185
Неблокирующий HTTP-сервер на основе Netty и Rxtyetty 187
Сравнение производительности блокирующего и реактивного сервера 195
Обзор реактивных HTTP-серверов 200
Код HTTP-клиента 201
Доступ к реляционной базе данных 205
NOTIFY и LISTEN на примере PostgreSQL 207
CompletableFuture и потоки 211
Краткое введение в CompletableFuture 211
Сравнение типов Observable и Single 220
Создание и потребление объектов типа Single 221
Объединение ответов с помощью zip, merge и concat 223
Интероперабельность с Observable и CompletableFuture 225
Когда использовать тип Single? 226
Резюме 227
Глава 6. Управление потоком и противодавление 228
Управление потоком 228
Периодическая выборка и отбрасывание событий 228
Скользящее окно 237
Пропуск устаревших событий с помощью debounceQ 238
Противодавление 243
Противодавление в RxJava 244
Встроенное противодавление 247
Производители и исключение MissingBackpressureException 250
Учет запрошенного объема данных 253
Резюме 259
Глава 7. Тестирование и отладка 260
Обработка ошибок 260
А где же мои исключения? 261
Декларативная замена try-catch 264
Таймаут в случае отсутствия событий 268
Повтор после ошибки 271
Тестирование и отладка 275
Виртуальное время 275
Диспетчеры и автономное тестирование 277
Автономное тестирование 279
Мониторинг и отладка 287
Обратные вызовы doOn () 287
Измерение и мониторинг 289
Резюме 292
Глава 8. Практические примеры 293
Применение RxJava в разработке программ для Android 293
Предотвращение утечек памяти в компонентах Activity 294
Библиотека Retrofit со встроенной поддержкой RxJava 296
Диспетчеры в Android 301
События пользовательского интерфейса как потоки 304
Управление отказами с помощью Hystrix 307
Hystrix: первые шаги 308
Неблокирующие команды и HystrixObservableCommand 310
Паттерн Переборка и быстрое прекращение 311
Пакетирование и объединение команд 313
Мониторинг и инструментальные панели 318
Опрос баз данных NoSQL 321
Клиенстский API Couchbase 322
Клиентский API MongoDB 323
Интеграция с Camel 325
Потребление файлов с помощью Camel 325
Получение сообщений от Kafka 326
Потоки Java 8 и CompletableFuture 326
Полезность параллельных потоков 328
Выбор подходящей абстракции конкурентности 330
Когда выбирать Observable? 331
Потребление памяти и утечки 332
Операторы, потребляющие неконтролируемый объем памяти 332
Резюме 337
Глава 9. Направления будущего развития 338
Реактивные потоки 338
Типы Observable и Flowable 338
Производительность 339
Миграция 340
Приложения.
Приложение А. Дополнительные примеры
НТТР-серверов 341
Системный вызов fork() в программе на С 341
Один поток - одно подключение 343
Пул потоков для обслуживания подключений 345
Приложение В. Решающее дерево для выбора
операторов Observable 347
Об авторах 352
Об изображении на обложке 352
Предметный указатель 353
Добавить комментарий