├── .gitignore ├── .idea ├── .gitignore ├── checkstyle-idea.xml ├── codeStyles │ ├── Project.xml │ └── codeStyleConfig.xml ├── compiler.xml ├── google-java-format.xml ├── gradle.xml ├── inspectionProfiles │ └── Project_Default.xml ├── jarRepositories.xml ├── jpa-buddy.xml ├── libraries │ ├── Gradle__ch_qos_logback_logback_classic_1_2_3.xml │ ├── Gradle__ch_qos_logback_logback_core_1_2_3.xml │ ├── Gradle__com_fasterxml_jackson_core_jackson_annotations_2_12_3.xml │ ├── Gradle__com_fasterxml_jackson_core_jackson_core_2_12_3.xml │ ├── Gradle__com_fasterxml_jackson_core_jackson_databind_2_12_3.xml │ ├── Gradle__com_h2database_h2_2_1_210.xml │ ├── Gradle__com_squareup_okhttp3_okhttp_3_12_12.xml │ ├── Gradle__com_squareup_okio_okio_1_15_0.xml │ ├── Gradle__commons_codec_commons_codec_1_15.xml │ ├── Gradle__de_flapdoodle_de_flapdoodle_os_1_2_3.xml │ ├── Gradle__de_flapdoodle_embed_de_flapdoodle_embed_mongo_3_5_2.xml │ ├── Gradle__de_flapdoodle_embed_de_flapdoodle_embed_mongo_packageresolver_1_0_12.xml │ ├── Gradle__de_flapdoodle_embed_de_flapdoodle_embed_process_3_2_7.xml │ ├── Gradle__io_dropwizard_metrics_metrics_core_4_1_21.xml │ ├── Gradle__io_micrometer_micrometer_commons_1_10_0.xml │ ├── Gradle__io_micrometer_micrometer_core_1_10_0.xml │ ├── Gradle__io_micrometer_micrometer_observation_1_10_0.xml │ ├── Gradle__io_projectreactor_tools_blockhound_1_0_2_RELEASE.xml │ ├── Gradle__io_projectreactor_tools_blockhound_1_0_6_RELEASE.xml │ ├── Gradle__io_r2dbc_r2dbc_h2_0_9_1_RELEASE.xml │ ├── Gradle__io_r2dbc_r2dbc_spi_0_9_1_RELEASE.xml │ ├── Gradle__io_socket_engine_io_client_1_0_2.xml │ ├── Gradle__io_socket_socket_io_client_1_0_2.xml │ ├── Gradle__net_bytebuddy_byte_buddy_1_10_20.xml │ ├── Gradle__net_bytebuddy_byte_buddy_agent_1_10_20.xml │ ├── Gradle__net_java_dev_jna_jna_5_12_1.xml │ ├── Gradle__net_java_dev_jna_jna_platform_5_12_1.xml │ ├── Gradle__org_apache_commons_commons_compress_1_21.xml │ ├── Gradle__org_apache_commons_commons_lang3_3_12_0.xml │ ├── Gradle__org_apiguardian_apiguardian_api_1_1_2.xml │ ├── Gradle__org_assertj_assertj_core_3_19_0.xml │ ├── Gradle__org_hdrhistogram_HdrHistogram_2_1_12.xml │ ├── Gradle__org_json_json_20090211.xml │ ├── Gradle__org_junit_jupiter_junit_jupiter_api_5_9_1.xml │ ├── Gradle__org_junit_jupiter_junit_jupiter_engine_5_9_1.xml │ ├── Gradle__org_junit_platform_junit_platform_commons_1_9_1.xml │ ├── Gradle__org_junit_platform_junit_platform_engine_1_9_1.xml │ ├── Gradle__org_latencyutils_LatencyUtils_2_0_3.xml │ ├── Gradle__org_mockito_mockito_core_3_9_0.xml │ ├── Gradle__org_mongodb_bson_4_7_0.xml │ ├── Gradle__org_mongodb_bson_record_codec_4_7_0.xml │ ├── Gradle__org_mongodb_mongodb_driver_core_4_7_0.xml │ ├── Gradle__org_mongodb_mongodb_driver_reactivestreams_4_7_0.xml │ ├── Gradle__org_objenesis_objenesis_3_2.xml │ ├── Gradle__org_opentest4j_opentest4j_1_2_0.xml │ ├── Gradle__org_reactivestreams_reactive_streams_1_0_4.xml │ ├── Gradle__org_slf4j_slf4j_api_1_7_25.xml │ └── Gradle__org_slf4j_slf4j_api_1_7_36.xml ├── misc.xml ├── modules.xml ├── modules │ ├── Reactive Advanced │ │ ├── Control Backpressure │ │ │ ├── task1 │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Control_Backpressure-task1.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Control_Backpressure-task1.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Advanced-Control_Backpressure-task1.test.iml │ │ │ ├── task2 │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Control_Backpressure-task2.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Control_Backpressure-task2.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Advanced-Control_Backpressure-task2.test.iml │ │ │ ├── task3 │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Control_Backpressure-task3.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Control_Backpressure-task3.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Advanced-Control_Backpressure-task3.test.iml │ │ │ ├── task4 │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Control_Backpressure-task4.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Control_Backpressure-task4.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Advanced-Control_Backpressure-task4.test.iml │ │ │ └── task5 │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Control_Backpressure-task5.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Control_Backpressure-task5.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Advanced-Control_Backpressure-task5.test.iml │ │ ├── Crypto Tracker │ │ │ ├── application │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Crypto_Tracker-application.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Crypto_Tracker-application.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Advanced-Crypto_Tracker-application.test.iml │ │ │ ├── common │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Crypto_Tracker-common.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Crypto_Tracker-common.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Advanced-Crypto_Tracker-common.test.iml │ │ │ ├── crypto-service-idl │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Crypto_Tracker-crypto-service-idl.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Crypto_Tracker-crypto-service-idl.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Advanced-Crypto_Tracker-crypto-service-idl.test.iml │ │ │ ├── crypto-service │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Crypto_Tracker-crypto-service.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Crypto_Tracker-crypto-service.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Advanced-Crypto_Tracker-crypto-service.test.iml │ │ │ ├── price-service-idl │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Crypto_Tracker-price-service-idl.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Crypto_Tracker-price-service-idl.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Advanced-Crypto_Tracker-price-service-idl.test.iml │ │ │ ├── price-service │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Crypto_Tracker-price-service.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Crypto_Tracker-price-service.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Advanced-Crypto_Tracker-price-service.test.iml │ │ │ ├── trade-service-idl │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Crypto_Tracker-trade-service-idl.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Crypto_Tracker-trade-service-idl.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Advanced-Crypto_Tracker-trade-service-idl.test.iml │ │ │ └── trade-service │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Crypto_Tracker-trade-service.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Crypto_Tracker-trade-service.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Advanced-Crypto_Tracker-trade-service.test.iml │ │ ├── Hot and Sharable │ │ │ ├── task1 │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Hot_and_Sharable-task1.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Hot_and_Sharable-task1.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Advanced-Hot_and_Sharable-task1.test.iml │ │ │ ├── task2 │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Hot_and_Sharable-task2.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Hot_and_Sharable-task2.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Advanced-Hot_and_Sharable-task2.test.iml │ │ │ └── task3 │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Hot_and_Sharable-task3.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Hot_and_Sharable-task3.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Advanced-Hot_and_Sharable-task3.test.iml │ │ ├── Multiple Sources │ │ │ └── Fast Media Server │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Multiple_Sources-Fast_Media_Server.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Multiple_Sources-Fast_Media_Server.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Advanced-Multiple_Sources-Fast_Media_Server.test.iml │ │ ├── Multithreading Operators │ │ │ ├── Change Thread Up and Down │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Multithreading_Operators-Change_Thread_Up_and_Down.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Multithreading_Operators-Change_Thread_Up_and_Down.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Advanced-Multithreading_Operators-Change_Thread_Up_and_Down.test.iml │ │ │ ├── Data Parallelization │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Multithreading_Operators-Data_Parallelization.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Multithreading_Operators-Data_Parallelization.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Advanced-Multithreading_Operators-Data_Parallelization.test.iml │ │ │ ├── Handling Blocking DB Access │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Multithreading_Operators-Handling_Blocking_DB_Access.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Multithreading_Operators-Handling_Blocking_DB_Access.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Advanced-Multithreading_Operators-Handling_Blocking_DB_Access.test.iml │ │ │ ├── NonBlocking Generator │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Multithreading_Operators-NonBlocking_Generator.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Multithreading_Operators-NonBlocking_Generator.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Advanced-Multithreading_Operators-NonBlocking_Generator.test.iml │ │ │ ├── NonBlockingCreateTempFile │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Multithreading_Operators-NonBlockingCreateTempFile.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Multithreading_Operators-NonBlockingCreateTempFile.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Advanced-Multithreading_Operators-NonBlockingCreateTempFile.test.iml │ │ │ ├── NonBlockingTextFileStream │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Multithreading_Operators-NonBlockingTextFileStream.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Multithreading_Operators-NonBlockingTextFileStream.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Advanced-Multithreading_Operators-NonBlockingTextFileStream.test.iml │ │ │ ├── Parallel Concurrency │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Multithreading_Operators-Parallel_Concurrency.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Multithreading_Operators-Parallel_Concurrency.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Advanced-Multithreading_Operators-Parallel_Concurrency.test.iml │ │ │ └── Parallelize by Tasks │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Multithreading_Operators-Parallelize_by_Tasks.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Multithreading_Operators-Parallelize_by_Tasks.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Advanced-Multithreading_Operators-Parallelize_by_Tasks.test.iml │ │ └── Resilience │ │ │ ├── DistributedTransaction │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Resilience-DistributedTransaction.iml │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Resilience-DistributedTransaction.main.iml │ │ │ └── ReactiveProgrammingCourse.Reactive_Advanced-Resilience-DistributedTransaction.test.iml │ │ │ ├── ResilientBackpressure │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Resilience-ResilientBackpressure.iml │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Resilience-ResilientBackpressure.main.iml │ │ │ └── ReactiveProgrammingCourse.Reactive_Advanced-Resilience-ResilientBackpressure.test.iml │ │ │ ├── task1 │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Resilience-task1.iml │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Resilience-task1.main.iml │ │ │ └── ReactiveProgrammingCourse.Reactive_Advanced-Resilience-task1.test.iml │ │ │ ├── task2 │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Resilience-task2.iml │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Resilience-task2.main.iml │ │ │ └── ReactiveProgrammingCourse.Reactive_Advanced-Resilience-task2.test.iml │ │ │ ├── task3 │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Resilience-task3.iml │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Resilience-task3.main.iml │ │ │ └── ReactiveProgrammingCourse.Reactive_Advanced-Resilience-task3.test.iml │ │ │ ├── task4 │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Resilience-task4.iml │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Resilience-task4.main.iml │ │ │ └── ReactiveProgrammingCourse.Reactive_Advanced-Resilience-task4.test.iml │ │ │ ├── task5 │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Resilience-task5.iml │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Resilience-task5.main.iml │ │ │ └── ReactiveProgrammingCourse.Reactive_Advanced-Resilience-task5.test.iml │ │ │ ├── task6 │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Resilience-task6.iml │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Resilience-task6.main.iml │ │ │ └── ReactiveProgrammingCourse.Reactive_Advanced-Resilience-task6.test.iml │ │ │ ├── task7 │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Resilience-task7.iml │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Resilience-task7.main.iml │ │ │ └── ReactiveProgrammingCourse.Reactive_Advanced-Resilience-task7.test.iml │ │ │ ├── task8 │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Resilience-task8.iml │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Resilience-task8.main.iml │ │ │ └── ReactiveProgrammingCourse.Reactive_Advanced-Resilience-task8.test.iml │ │ │ └── task9 │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Resilience-task9.iml │ │ │ ├── ReactiveProgrammingCourse.Reactive_Advanced-Resilience-task9.main.iml │ │ │ └── ReactiveProgrammingCourse.Reactive_Advanced-Resilience-task9.test.iml │ ├── Reactive Essentials │ │ ├── Async Publishers │ │ │ ├── DelayExecution │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Async_Publishers-DelayExecution.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Async_Publishers-DelayExecution.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Essentials-Async_Publishers-DelayExecution.test.iml │ │ │ ├── FutureHttpRequest │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Async_Publishers-FutureHttpRequest.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Async_Publishers-FutureHttpRequest.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Essentials-Async_Publishers-FutureHttpRequest.test.iml │ │ │ ├── ListenableHttpRequest │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Async_Publishers-ListenableHttpRequest.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Async_Publishers-ListenableHttpRequest.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Essentials-Async_Publishers-ListenableHttpRequest.test.iml │ │ │ └── SchedulePeriodic │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Async_Publishers-SchedulePeriodic.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Async_Publishers-SchedulePeriodic.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Essentials-Async_Publishers-SchedulePeriodic.test.iml │ │ ├── Common Operators │ │ │ ├── BetterCodeReadability │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Common_Operators-BetterCodeReadability.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Common_Operators-BetterCodeReadability.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Essentials-Common_Operators-BetterCodeReadability.test.iml │ │ │ ├── FindUsers │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Common_Operators-FindUsers.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Common_Operators-FindUsers.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Essentials-Common_Operators-FindUsers.test.iml │ │ │ ├── FizzBuzz │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Common_Operators-FizzBuzz.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Common_Operators-FizzBuzz.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Essentials-Common_Operators-FizzBuzz.test.iml │ │ │ ├── FlattenWords │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Common_Operators-FlattenWords.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Common_Operators-FlattenWords.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Essentials-Common_Operators-FlattenWords.test.iml │ │ │ ├── LettersCounter │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Common_Operators-LettersCounter.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Common_Operators-LettersCounter.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Essentials-Common_Operators-LettersCounter.test.iml │ │ │ ├── MongoDocsConverter │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Common_Operators-MongoDocsConverter.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Common_Operators-MongoDocsConverter.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Essentials-Common_Operators-MongoDocsConverter.test.iml │ │ │ ├── ProductCatalog │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Common_Operators-ProductCatalog.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Common_Operators-ProductCatalog.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Essentials-Common_Operators-ProductCatalog.test.iml │ │ │ ├── SequenceOfNetworkCalls │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Common_Operators-SequenceOfNetworkCalls.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Common_Operators-SequenceOfNetworkCalls.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Essentials-Common_Operators-SequenceOfNetworkCalls.test.iml │ │ │ ├── VisitorsByCountryCounter │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Common_Operators-VisitorsByCountryCounter.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Common_Operators-VisitorsByCountryCounter.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Essentials-Common_Operators-VisitorsByCountryCounter.test.iml │ │ │ └── VisitorsByPeriodCounter │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Common_Operators-VisitorsByPeriodCounter.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Common_Operators-VisitorsByPeriodCounter.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Essentials-Common_Operators-VisitorsByPeriodCounter.test.iml │ │ ├── Streaming App │ │ │ ├── application │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Streaming_App-application.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Streaming_App-application.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Essentials-Streaming_App-application.test.iml │ │ │ ├── common │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Streaming_App-common.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Streaming_App-common.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Essentials-Streaming_App-common.test.iml │ │ │ ├── crypto-service-idl │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Streaming_App-crypto-service-idl.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Streaming_App-crypto-service-idl.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Essentials-Streaming_App-crypto-service-idl.test.iml │ │ │ ├── crypto-service │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Streaming_App-crypto-service.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Streaming_App-crypto-service.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Essentials-Streaming_App-crypto-service.test.iml │ │ │ ├── price-service-idl │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Streaming_App-price-service-idl.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Streaming_App-price-service-idl.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Essentials-Streaming_App-price-service-idl.test.iml │ │ │ └── price-service │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Streaming_App-price-service.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Streaming_App-price-service.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Essentials-Streaming_App-price-service.test.iml │ │ ├── Sync Publishers │ │ │ ├── CreateSequence │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Sync_Publishers-CreateSequence.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Sync_Publishers-CreateSequence.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Essentials-Sync_Publishers-CreateSequence.test.iml │ │ │ ├── CreateTempFile │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Sync_Publishers-CreateTempFile.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Sync_Publishers-CreateTempFile.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Essentials-Sync_Publishers-CreateTempFile.test.iml │ │ │ ├── FibonacciSequence │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Sync_Publishers-FibonacciSequence.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Sync_Publishers-FibonacciSequence.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Essentials-Sync_Publishers-FibonacciSequence.test.iml │ │ │ ├── GenerateUUID │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Sync_Publishers-GenerateUUID.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Sync_Publishers-GenerateUUID.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Essentials-Sync_Publishers-GenerateUUID.test.iml │ │ │ ├── HandleGetRequest │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Sync_Publishers-HandleGetRequest.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Sync_Publishers-HandleGetRequest.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Essentials-Sync_Publishers-HandleGetRequest.test.iml │ │ │ ├── PropertiesSource │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Sync_Publishers-PropertiesSource.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Sync_Publishers-PropertiesSource.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Essentials-Sync_Publishers-PropertiesSource.test.iml │ │ │ ├── TextFileStream │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Sync_Publishers-TextFileStream.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Sync_Publishers-TextFileStream.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Essentials-Sync_Publishers-TextFileStream.test.iml │ │ │ └── ValidateDuration │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Sync_Publishers-ValidateDuration.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Sync_Publishers-ValidateDuration.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Essentials-Sync_Publishers-ValidateDuration.test.iml │ │ └── Testing │ │ │ ├── Check Flux │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Testing-Check_Flux.iml │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Testing-Check_Flux.main.iml │ │ │ └── ReactiveProgrammingCourse.Reactive_Essentials-Testing-Check_Flux.test.iml │ │ │ ├── Test Publisher │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Testing-Test_Publisher.iml │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Testing-Test_Publisher.main.iml │ │ │ └── ReactiveProgrammingCourse.Reactive_Essentials-Testing-Test_Publisher.test.iml │ │ │ └── Test Timed Flux │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Testing-Test_Timed_Flux.iml │ │ │ ├── ReactiveProgrammingCourse.Reactive_Essentials-Testing-Test_Timed_Flux.main.iml │ │ │ └── ReactiveProgrammingCourse.Reactive_Essentials-Testing-Test_Timed_Flux.test.iml │ ├── Reactive Expert │ │ ├── Context │ │ │ ├── task1 │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Expert-Context-task1.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Expert-Context-task1.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Expert-Context-task1.test.iml │ │ │ ├── task2 │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Expert-Context-task2.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Expert-Context-task2.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Expert-Context-task2.test.iml │ │ │ └── task3 │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Expert-Context-task3.iml │ │ │ │ ├── ReactiveProgrammingCourse.Reactive_Expert-Context-task3.main.iml │ │ │ │ └── ReactiveProgrammingCourse.Reactive_Expert-Context-task3.test.iml │ │ └── Debugging │ │ │ ├── task1 │ │ │ ├── ReactiveProgrammingCourse.Reactive_Expert-Debugging-task1.iml │ │ │ ├── ReactiveProgrammingCourse.Reactive_Expert-Debugging-task1.main.iml │ │ │ └── ReactiveProgrammingCourse.Reactive_Expert-Debugging-task1.test.iml │ │ │ ├── task2 │ │ │ ├── ReactiveProgrammingCourse.Reactive_Expert-Debugging-task2.iml │ │ │ ├── ReactiveProgrammingCourse.Reactive_Expert-Debugging-task2.main.iml │ │ │ └── ReactiveProgrammingCourse.Reactive_Expert-Debugging-task2.test.iml │ │ │ └── task3 │ │ │ ├── ReactiveProgrammingCourse.Reactive_Expert-Debugging-task3.iml │ │ │ ├── ReactiveProgrammingCourse.Reactive_Expert-Debugging-task3.main.iml │ │ │ └── ReactiveProgrammingCourse.Reactive_Expert-Debugging-task3.test.iml │ ├── ReactiveProgrammingCourse.iml │ └── util │ │ ├── ReactiveProgrammingCourse.util.iml │ │ ├── ReactiveProgrammingCourse.util.main.iml │ │ └── ReactiveProgrammingCourse.util.test.iml └── vcs.xml ├── Reactive Advanced ├── Control Backpressure │ ├── BackpressureProblem │ │ ├── build.gradle │ │ ├── src │ │ │ └── Task.java │ │ ├── task.ru.html │ │ └── test │ │ │ └── MultipleSourcesTask5Tests.java │ ├── lesson-info.yaml │ ├── task1 │ │ ├── build.gradle │ │ ├── src │ │ │ ├── RefCounted.java │ │ │ └── Task.java │ │ ├── task-info.yaml │ │ ├── task.html │ │ └── test │ │ │ └── BackpressureTask1Tests.java │ ├── task2 │ │ ├── build.gradle │ │ ├── src │ │ │ └── Task.java │ │ ├── task-info.yaml │ │ ├── task.html │ │ └── test │ │ │ └── BackpressureTask2Tests.java │ ├── task3 │ │ ├── build.gradle │ │ ├── src │ │ │ └── Task.java │ │ ├── task-info.yaml │ │ ├── task.html │ │ └── test │ │ │ └── BackpressureTask3Tests.java │ ├── task4 │ │ ├── build.gradle │ │ ├── src │ │ │ ├── StatisticSnapshot.java │ │ │ └── Task.java │ │ ├── task-info.yaml │ │ ├── task.html │ │ └── test │ │ │ └── BackpressureTask4Tests.java │ └── task5 │ │ ├── build.gradle │ │ ├── src │ │ └── Task.java │ │ ├── task-info.yaml │ │ ├── task.html │ │ └── test │ │ └── BackpressureTask5Tests.java ├── Crypto Tracker │ ├── application │ │ ├── build.gradle │ │ ├── resources │ │ │ ├── logback.xml │ │ │ └── ui │ │ │ │ ├── favicon.ico │ │ │ │ ├── index.html │ │ │ │ └── main.js │ │ ├── src │ │ │ ├── ApplicationRunner.java │ │ │ ├── controller │ │ │ │ └── WSHandler.java │ │ │ └── utils │ │ │ │ ├── EmbeddedMongo.java │ │ │ │ ├── H2Helper.java │ │ │ │ ├── HttpResourceResolver.java │ │ │ │ ├── JsonUtils.java │ │ │ │ ├── MetricsConfig.java │ │ │ │ └── NettyUtils.java │ │ ├── task-info.yaml │ │ ├── task.md │ │ └── test │ │ │ └── CryptoApplicationTests.java │ ├── build.gradle │ ├── common │ │ ├── build.gradle │ │ └── src │ │ │ ├── dto │ │ │ └── MessageDTO.java │ │ │ └── service │ │ │ └── utils │ │ │ ├── MessageMapper.java │ │ │ └── Sum.java │ ├── crypto-service-idl │ │ ├── build.gradle │ │ └── src │ │ │ └── service │ │ │ └── CryptoService.java │ ├── crypto-service │ │ ├── build.gradle │ │ ├── src │ │ │ └── service │ │ │ │ └── external │ │ │ │ ├── CryptoCompareClient.java │ │ │ │ ├── CryptoCompareService.java │ │ │ │ └── utils │ │ │ │ ├── MessageUnpacker.java │ │ │ │ ├── PriceMessageUnpacker.java │ │ │ │ └── TradeMessageUnpacker.java │ │ ├── task-info.yaml │ │ ├── task.md │ │ └── test │ │ │ └── service │ │ │ └── external │ │ │ └── CryptoServiceTests.java │ ├── lesson-info.yaml │ ├── price-service-idl │ │ ├── build.gradle │ │ └── src │ │ │ └── service │ │ │ └── PriceService.java │ ├── price-service │ │ ├── build.gradle │ │ ├── src │ │ │ └── service │ │ │ │ └── impl │ │ │ │ └── DefaultPriceService.java │ │ └── test │ │ │ └── service │ │ │ └── impl │ │ │ └── PriceServiceTests.java │ ├── trade-service-idl │ │ ├── build.gradle │ │ ├── src │ │ │ └── service │ │ │ │ └── TradeService.java │ │ └── test │ │ │ └── Tests.java │ └── trade-service │ │ ├── build.gradle │ │ ├── src │ │ ├── domain │ │ │ ├── Trade.java │ │ │ └── utils │ │ │ │ └── DomainMapper.java │ │ ├── repository │ │ │ ├── TradeRepository.java │ │ │ └── impl │ │ │ │ ├── H2TradeRepository.java │ │ │ │ └── MongoTradeRepository.java │ │ └── service │ │ │ └── impl │ │ │ └── DefaultTradeService.java │ │ ├── task-info.yaml │ │ ├── task.md │ │ └── test │ │ └── service │ │ └── impl │ │ └── TradeServiceTests.java ├── Hot and Sharable │ ├── InMemoryCache │ │ ├── build.gradle │ │ ├── src │ │ │ ├── InMemoryCachingRepositoryTask.java │ │ │ ├── UsersProfile.java │ │ │ └── UsersProfileRepository.java │ │ ├── task-info.yaml │ │ ├── task.md │ │ └── test │ │ │ └── InMemoryCachingRepositoryTests.java │ ├── lesson-info.yaml │ ├── task1 │ │ ├── build.gradle │ │ ├── src │ │ │ └── Task.java │ │ ├── task-info.yaml │ │ ├── task.html │ │ └── test │ │ │ └── HnSTask1Tests.java │ ├── task2 │ │ ├── build.gradle │ │ ├── src │ │ │ └── Task.java │ │ ├── task-info.yaml │ │ ├── task.html │ │ └── test │ │ │ └── HnSTask2Tests.java │ └── task3 │ │ ├── build.gradle │ │ ├── src │ │ └── Task.java │ │ ├── task-info.yaml │ │ ├── task.html │ │ └── test │ │ └── HnSTask3Tests.java ├── Multiple Sources │ ├── EfficientPagination │ │ ├── build.gradle │ │ ├── src │ │ │ ├── AsyncRestTemplate.java │ │ │ ├── TimezonedbResponse.java │ │ │ ├── TimezonedbResponseZone.java │ │ │ └── TimezonesDbClient.java │ │ ├── task-info.yaml │ │ ├── task.md │ │ └── test │ │ │ └── TimezonesDbClientTests.java │ ├── Fast Media Server │ │ ├── build.gradle │ │ ├── src │ │ │ ├── MediaService.java │ │ │ ├── Server.java │ │ │ ├── ServersCatalogue.java │ │ │ └── Video.java │ │ ├── task-info.yaml │ │ ├── task.md │ │ └── test │ │ │ └── CPTask2Tests.java │ ├── LogsObserver │ │ ├── build.gradle │ │ ├── src │ │ │ ├── DiscoveryService.java │ │ │ ├── LogsObserverTask.java │ │ │ └── Server.java │ │ ├── task-info.yaml │ │ ├── task.html │ │ ├── task.ru.html │ │ └── test │ │ │ └── LogsObserverTests.java │ ├── MoviePagination │ │ ├── build.gradle │ │ ├── src │ │ │ ├── Movie.java │ │ │ ├── MovieService.java │ │ │ ├── MoviesRepository.java │ │ │ └── Page.java │ │ ├── task-info.yaml │ │ ├── task.html │ │ ├── task.ru.html │ │ └── test │ │ │ └── MovieServiceTests.java │ ├── OrdersProcessing │ │ ├── build.gradle │ │ ├── src │ │ │ ├── CurrencyRepository.java │ │ │ ├── CustomerInfo.java │ │ │ ├── Order.java │ │ │ ├── OrderProcessingService.java │ │ │ ├── OrdersRepository.java │ │ │ ├── Payment.java │ │ │ └── Product.java │ │ ├── task-info.yaml │ │ ├── task.html │ │ └── test │ │ │ └── OrderProcessingServiceTests.java │ ├── SpeedupExecution │ │ ├── build.gradle │ │ ├── src │ │ │ ├── AsyncRestTemplate.java │ │ │ ├── Cart.java │ │ │ ├── ExecutionOptimizationTask.java │ │ │ ├── PageView.java │ │ │ ├── RestTemplate.java │ │ │ ├── User.java │ │ │ └── Wallet.java │ │ ├── task-info.yaml │ │ ├── task.html │ │ └── test │ │ │ └── ExecutionOptimizationTests.java │ └── lesson-info.yaml ├── Multithreading Operators │ ├── Change Thread Up and Down │ │ ├── build.gradle │ │ ├── src │ │ │ └── Task.java │ │ ├── task-info.yaml │ │ ├── task.html │ │ └── test │ │ │ └── MultithreadingOperatorsTask4Tests.java │ ├── Data Parallelization │ │ ├── build.gradle │ │ ├── src │ │ │ └── Task.java │ │ ├── task-info.yaml │ │ ├── task.html │ │ └── test │ │ │ └── MultithreadingOperatorsTask3Tests.java │ ├── Handling Blocking DB Access │ │ ├── build.gradle │ │ ├── src │ │ │ ├── BlockingPaymentsHistoryJpaRepository.java │ │ │ ├── ConnectionsPool.java │ │ │ ├── Payment.java │ │ │ ├── PaymentService.java │ │ │ ├── PaymentsHistoryJpaRepository.java │ │ │ ├── PaymentsHistoryReactiveJpaRepository.java │ │ │ └── ReactivePaymentsHistoryJpaRepositoryAdapter.java │ │ ├── task-info.yaml │ │ ├── task.md │ │ └── test │ │ │ └── CPTask3Tests.java │ ├── NonBlocking Generator │ │ ├── build.gradle │ │ ├── src │ │ │ ├── NonBlockingGenerateUUIDTask.java │ │ │ └── UUIDGenerator.java │ │ ├── task-info.yaml │ │ ├── task.html │ │ └── test │ │ │ └── NonBlockingGenerateUUIDTaskTests.java │ ├── NonBlockingCreateTempFile │ │ ├── build.gradle │ │ ├── src │ │ │ ├── Files.java │ │ │ └── NonBlockingTempFileTask.java │ │ ├── task-info.yaml │ │ ├── task.md │ │ ├── task.ru.md │ │ └── test │ │ │ └── NonBlockingTempFileTaskTests.java │ ├── NonBlockingTextFileStream │ │ ├── build.gradle │ │ ├── resources │ │ │ └── testfile.txt │ │ ├── src │ │ │ ├── Files.java │ │ │ └── NonBlockingTextFileStreamTask.java │ │ ├── task-info.yaml │ │ ├── task.md │ │ └── test │ │ │ └── NonBlockingTextFileStreamTaskTests.java │ ├── Parallel Concurrency │ │ ├── build.gradle │ │ ├── src │ │ │ └── Task.java │ │ ├── task-info.yaml │ │ ├── task.html │ │ └── test │ │ │ └── MultithreadingOperatorsTask5Tests.java │ ├── Parallelize by Tasks │ │ ├── build.gradle │ │ ├── src │ │ │ ├── DecoupleDeserializationTask.java │ │ │ ├── Deserializer.java │ │ │ └── Event.java │ │ ├── task-info.yaml │ │ ├── task.html │ │ └── test │ │ │ └── DecoupleDeserializationTaskTests.java │ └── lesson-info.yaml ├── Resilience │ ├── DistributedTransaction │ │ ├── build.gradle │ │ ├── src │ │ │ ├── Connection.java │ │ │ ├── DatabaseApi.java │ │ │ ├── DatabasesIntegration.java │ │ │ ├── ErrorResult.java │ │ │ ├── Result.java │ │ │ └── SuccessResult.java │ │ ├── task-info.yaml │ │ ├── task.md │ │ └── test │ │ │ └── CPTask5Tests.java │ ├── ResilientBackpressure │ │ ├── build.gradle │ │ ├── src │ │ │ ├── DataUploaderService.java │ │ │ ├── HttpClient.java │ │ │ └── OrderedByteBuffer.java │ │ ├── task-info.yaml │ │ ├── task.md │ │ └── test │ │ │ ├── CPTask4Tests.java │ │ │ └── TrickyHttpClient.java │ ├── lesson-info.yaml │ ├── task1 │ │ ├── build.gradle │ │ ├── src │ │ │ └── Task.java │ │ ├── task-info.yaml │ │ ├── task.html │ │ └── test │ │ │ └── ResilienceTask1Tests.java │ ├── task2 │ │ ├── build.gradle │ │ ├── src │ │ │ └── Task.java │ │ ├── task-info.yaml │ │ ├── task.html │ │ └── test │ │ │ └── ResilienceTask2Tests.java │ ├── task3 │ │ ├── build.gradle │ │ ├── src │ │ │ └── Task.java │ │ ├── task-info.yaml │ │ ├── task.html │ │ └── test │ │ │ └── ResilienceTask3Tests.java │ ├── task4 │ │ ├── build.gradle │ │ ├── src │ │ │ └── Task.java │ │ ├── task-info.yaml │ │ ├── task.html │ │ └── test │ │ │ └── ResilienceTask4Tests.java │ ├── task5 │ │ ├── build.gradle │ │ ├── src │ │ │ └── Task.java │ │ ├── task-info.yaml │ │ ├── task.html │ │ └── test │ │ │ └── ResilienceTask5Tests.java │ ├── task6 │ │ ├── build.gradle │ │ ├── src │ │ │ └── Task.java │ │ ├── task-info.yaml │ │ ├── task.html │ │ └── test │ │ │ └── ResilienceTask6Tests.java │ ├── task7 │ │ ├── build.gradle │ │ ├── src │ │ │ └── Task.java │ │ ├── task-info.yaml │ │ ├── task.html │ │ └── test │ │ │ └── ResilienceTask7Tests.java │ ├── task8 │ │ ├── build.gradle │ │ ├── src │ │ │ └── Task.java │ │ ├── task-info.yaml │ │ ├── task.html │ │ └── test │ │ │ └── ResilienceTask8Tests.java │ └── task9 │ │ ├── build.gradle │ │ ├── src │ │ └── Task.java │ │ ├── task-info.yaml │ │ ├── task.html │ │ └── test │ │ └── ResilienceTask9Tests.java └── section-info.yaml ├── Reactive Essentials ├── Async Publishers │ ├── DelayExecution │ │ ├── build.gradle │ │ ├── src │ │ │ └── DelayExecutionTask.java │ │ ├── task-info.yaml │ │ ├── task.md │ │ ├── task.ru.md │ │ └── test │ │ │ └── DelayExecutionTaskTests.java │ ├── FutureHttpRequest │ │ ├── build.gradle │ │ ├── src │ │ │ ├── AsyncRestTemplate.java │ │ │ └── FutureHttpGetRequestTask.java │ │ ├── task-info.yaml │ │ ├── task.md │ │ └── test │ │ │ └── AsyncHttpGetRequestTaskTests.java │ ├── ListenableHttpRequest │ │ ├── build.gradle │ │ ├── src │ │ │ ├── AsyncHttpClient.java │ │ │ ├── ListenableFuture.java │ │ │ └── ListenableHttpGetRequestTask.java │ │ ├── task-info.yaml │ │ ├── task.md │ │ └── test │ │ │ └── ListenableHttpGetRequestTaskTests.java │ ├── SchedulePeriodic │ │ ├── build.gradle │ │ ├── src │ │ │ └── SchedulePeriodicTask.java │ │ ├── task-info.yaml │ │ ├── task.md │ │ └── test │ │ │ └── SchedulePeriodicTaskTests.java │ └── lesson-info.yaml ├── Common Operators │ ├── BetterCodeReadability │ │ ├── build.gradle │ │ ├── src │ │ │ └── Task.java │ │ ├── task-info.yaml │ │ ├── task.md │ │ ├── task.ru.md │ │ └── test │ │ │ └── CommonOperatorsTask5Tests.java │ ├── DynamicMessageRebalancing │ │ ├── build.gradle │ │ ├── src │ │ │ ├── KafkaClient.java │ │ │ ├── KafkaLoadbalancer.java │ │ │ ├── LoadbalancedMessageProcessorTask.java │ │ │ └── MessageProcessor.java │ │ ├── task-info.yaml │ │ ├── task.md │ │ ├── task.ru.md │ │ └── test │ │ │ └── LoadbalancedMessageProcessorTests.java │ ├── FillYourIceCream │ │ ├── build.gradle │ │ ├── src │ │ │ └── Task.java │ │ ├── task-info.yaml │ │ ├── task.html │ │ └── test │ │ │ └── MultipleSourcesTask8Tests.java │ ├── FindUsers │ │ ├── build.gradle │ │ ├── src │ │ │ ├── FindElementsInRepositoryTask.java │ │ │ ├── User.java │ │ │ ├── UserNotFoundException.java │ │ │ └── UsersRepository.java │ │ ├── task-info.yaml │ │ ├── task.md │ │ ├── task.ru.md │ │ └── test │ │ │ └── FindElementsInRepositoryTests.java │ ├── FizzBuzz │ │ ├── build.gradle │ │ ├── src │ │ │ └── Task.java │ │ ├── task-info.yaml │ │ ├── task.md │ │ ├── task.ru.md │ │ └── test │ │ │ └── CommonOperatorsTask11Tests.java │ ├── FlattenWords │ │ ├── build.gradle │ │ ├── src │ │ │ └── FlattenWordsTask.java │ │ ├── task-info.yaml │ │ ├── task.md │ │ ├── task.ru.md │ │ └── test │ │ │ └── FlattenWordsTests.java │ ├── LettersCounter │ │ ├── build.gradle │ │ ├── src │ │ │ └── LetterCountersTask.java │ │ ├── task-info.yaml │ │ ├── task.html │ │ ├── task.ru.html │ │ └── test │ │ │ └── LetterCountersTests.java │ ├── MongoDocsConverter │ │ ├── build.gradle │ │ ├── src │ │ │ ├── MongoCollectionUserQueryTask.java │ │ │ └── User.java │ │ ├── task-info.yaml │ │ ├── task.md │ │ ├── task.ru.md │ │ └── test │ │ │ └── MongoCollectionUserQueryTaskTests.java │ ├── ProductCatalog │ │ ├── build.gradle │ │ ├── src │ │ │ ├── Order.java │ │ │ ├── Product.java │ │ │ ├── ProductsCatalog.java │ │ │ └── UserActivityUtils.java │ │ ├── task-info.yaml │ │ ├── task.md │ │ └── test │ │ │ └── CPTask1Tests.java │ ├── SequenceOfNetworkCalls │ │ ├── build.gradle │ │ ├── src │ │ │ ├── BroadCastControllerTask.java │ │ │ ├── DiscoveryService.java │ │ │ └── HttpClient.java │ │ ├── task-info.yaml │ │ ├── task.md │ │ ├── task.ru.md │ │ └── test │ │ │ └── BroadCastControllerTaskTests.java │ ├── ValidQueryExecution │ │ ├── build.gradle │ │ ├── src │ │ │ ├── R2dbcTemplate.java │ │ │ ├── User.java │ │ │ ├── ValidQueryExecutionTask.java │ │ │ └── Validator.java │ │ ├── task-info.yaml │ │ ├── task.md │ │ ├── task.ru.md │ │ └── test │ │ │ └── ValidQueryExecutionTests.java │ ├── VisitorsByCountryCounter │ │ ├── build.gradle │ │ ├── src │ │ │ ├── User.java │ │ │ ├── UserNotFoundException.java │ │ │ ├── VisitorsByCountryTask.java │ │ │ └── VisitorsRepository.java │ │ ├── task-info.yaml │ │ ├── task.md │ │ ├── task.ru.md │ │ └── test │ │ │ └── VisitorsByCountryTests.java │ ├── VisitorsByPeriodCounter │ │ ├── build.gradle │ │ ├── src │ │ │ ├── User.java │ │ │ ├── UserNotFoundException.java │ │ │ ├── VisitorsByPeriodTask.java │ │ │ └── VisitorsService.java │ │ ├── task-info.yaml │ │ ├── task.md │ │ ├── task.ru.md │ │ └── test │ │ │ └── VisitorsByPeriodTests.java │ └── lesson-info.yaml ├── Streaming App │ ├── application │ │ ├── build.gradle │ │ ├── resources │ │ │ ├── logback.xml │ │ │ └── ui │ │ │ │ ├── favicon.ico │ │ │ │ ├── index.html │ │ │ │ └── main.js │ │ ├── src │ │ │ ├── ApplicationRunner.java │ │ │ ├── controller │ │ │ │ └── WSHandler.java │ │ │ └── utils │ │ │ │ ├── HttpResourceResolver.java │ │ │ │ ├── JsonUtils.java │ │ │ │ └── NettyUtils.java │ │ ├── task-info.yaml │ │ ├── task.md │ │ └── test │ │ │ └── CryptoApplicationTests.java │ ├── build.gradle │ ├── common │ │ ├── build.gradle │ │ └── src │ │ │ ├── dto │ │ │ └── MessageDTO.java │ │ │ └── service │ │ │ └── utils │ │ │ ├── MessageMapper.java │ │ │ └── Sum.java │ ├── crypto-service-idl │ │ ├── build.gradle │ │ └── src │ │ │ └── service │ │ │ └── CryptoService.java │ ├── crypto-service │ │ ├── build.gradle │ │ ├── resources │ │ │ └── mockito-extensions │ │ │ │ └── org.mockito.plugins.MockMaker │ │ ├── src │ │ │ └── service │ │ │ │ └── external │ │ │ │ ├── CryptoCompareClient.java │ │ │ │ ├── CryptoCompareService.java │ │ │ │ └── utils │ │ │ │ ├── MessageUnpacker.java │ │ │ │ ├── PriceMessageUnpacker.java │ │ │ │ └── TradeMessageUnpacker.java │ │ ├── task-info.yaml │ │ ├── task.md │ │ └── test │ │ │ └── service │ │ │ └── external │ │ │ └── CryptoServiceTests.java │ ├── lesson-info.yaml │ ├── price-service-idl │ │ ├── build.gradle │ │ └── src │ │ │ └── service │ │ │ └── PriceService.java │ └── price-service │ │ ├── build.gradle │ │ ├── src │ │ └── service │ │ │ └── impl │ │ │ └── DefaultPriceService.java │ │ ├── task-info.yaml │ │ ├── task.md │ │ └── test │ │ └── service │ │ └── impl │ │ └── PriceServiceTests.java ├── Sync Publishers │ ├── CreateSequence │ │ ├── build.gradle │ │ ├── src │ │ │ └── CreateSequenceTask.java │ │ ├── task-info.yaml │ │ ├── task.md │ │ └── test │ │ │ └── CreateSequenceTests.java │ ├── CreateTempFile │ │ ├── build.gradle │ │ ├── src │ │ │ └── CreateTempFileTask.java │ │ ├── task-info.yaml │ │ ├── task.md │ │ └── test │ │ │ └── CreateTempFileTests.java │ ├── FibonacciSequence │ │ ├── build.gradle │ │ ├── src │ │ │ └── Task.java │ │ ├── task-info.yaml │ │ ├── task.md │ │ ├── task.ru.md │ │ └── test │ │ │ └── CommonPublishersTask10Tests.java │ ├── GenerateUUID │ │ ├── build.gradle │ │ ├── src │ │ │ ├── GenerateUUIDTask.java │ │ │ └── UUIDGenerator.java │ │ ├── task-info.yaml │ │ ├── task.md │ │ └── test │ │ │ └── GenerateUUIDTests.java │ ├── HandleGetRequest │ │ ├── build.gradle │ │ ├── src │ │ │ ├── HandleGetRequestTask.java │ │ │ ├── HttpMethod.java │ │ │ ├── ReactiveRandom.java │ │ │ └── RequestEntity.java │ │ ├── task-info.yaml │ │ ├── task.md │ │ └── test │ │ │ └── HandleGetRequestTaskTests.java │ ├── PropertiesSource │ │ ├── build.gradle │ │ ├── src │ │ │ ├── Properties.java │ │ │ ├── PropertiesSourceTask.java │ │ │ └── Property.java │ │ ├── task-info.yaml │ │ ├── task.md │ │ └── test │ │ │ └── PropertiesSourceTests.java │ ├── TextFileStream │ │ ├── build.gradle │ │ ├── resources │ │ │ └── testfile.txt │ │ ├── src │ │ │ └── TextFileStreamTask.java │ │ ├── task-info.yaml │ │ ├── task.md │ │ └── test │ │ │ └── TextFileStreamTests.java │ ├── ValidateDuration │ │ ├── build.gradle │ │ ├── src │ │ │ └── ValidationTask.java │ │ ├── task-info.yaml │ │ ├── task.md │ │ └── test │ │ │ └── ValidationTests.java │ └── lesson-info.yaml ├── Testing │ ├── Check Flux │ │ ├── build.gradle │ │ ├── src │ │ │ └── CheckFluxTask.java │ │ ├── task-info.yaml │ │ ├── task.html │ │ └── test │ │ │ └── TestingTask1Tests.java │ ├── Test Publisher │ │ ├── build.gradle │ │ ├── src │ │ │ └── Task.java │ │ ├── task-info.yaml │ │ ├── task.html │ │ └── test │ │ │ └── TestingTask3Tests.java │ ├── Test Timed Flux │ │ ├── build.gradle │ │ ├── src │ │ │ └── TestTimedFluxTask.java │ │ ├── task-info.yaml │ │ ├── task.html │ │ └── test │ │ │ └── TestingTask2Tests.java │ └── lesson-info.yaml └── section-info.yaml ├── Reactive Expert ├── Context │ ├── lesson-info.yaml │ ├── task1 │ │ ├── build.gradle │ │ ├── src │ │ │ └── Task.java │ │ ├── task-info.yaml │ │ ├── task.html │ │ └── test │ │ │ └── ContextTask1Tests.java │ ├── task2 │ │ ├── build.gradle │ │ ├── src │ │ │ └── Task.java │ │ ├── task-info.yaml │ │ ├── task.html │ │ └── test │ │ │ └── ContextTask2Tests.java │ └── task3 │ │ ├── build.gradle │ │ ├── src │ │ └── Task.java │ │ ├── task-info.yaml │ │ ├── task.html │ │ └── test │ │ └── ContextTask3Tests.java ├── Debugging │ ├── lesson-info.yaml │ ├── task1 │ │ ├── build.gradle │ │ ├── src │ │ │ └── Task.java │ │ ├── task-info.yaml │ │ ├── task.html │ │ └── test │ │ │ └── DLMTask1Tests.java │ ├── task2 │ │ ├── build.gradle │ │ ├── src │ │ │ └── Task.java │ │ ├── task-info.yaml │ │ ├── task.html │ │ └── test │ │ │ └── DLMTask2Tests.java │ └── task3 │ │ ├── build.gradle │ │ ├── src │ │ └── Task.java │ │ ├── task-info.yaml │ │ ├── task.html │ │ └── test │ │ └── DLMTask3Tests.java └── section-info.yaml ├── build.gradle ├── course-info.yaml ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── util └── src └── main └── java └── ToDoException.java /.gitignore: -------------------------------------------------------------------------------- 1 | **/**/**/build 2 | **/**/build 3 | **/build 4 | build 5 | **/**/**/out 6 | **/**/out 7 | **/out 8 | out 9 | **/**/reports 10 | **/reports 11 | reports 12 | .idea 13 | .gradle 14 | *.iml 15 | *.class 16 | *-remote-info.yaml 17 | /.coursecreator/ 18 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Editor-based HTTP Client requests 5 | /httpRequests/ 6 | # Datasource local storage ignored files 7 | /dataSources/ 8 | /dataSources.local.xml 9 | -------------------------------------------------------------------------------- /.idea/checkstyle-idea.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10.9.3 5 | JavaOnly 6 | 14 | 15 | -------------------------------------------------------------------------------- /.idea/codeStyles/Project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | -------------------------------------------------------------------------------- /.idea/codeStyles/codeStyleConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/google-java-format.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /.idea/jarRepositories.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 14 | 15 | 19 | 20 | -------------------------------------------------------------------------------- /.idea/jpa-buddy.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__ch_qos_logback_logback_classic_1_2_3.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__ch_qos_logback_logback_core_1_2_3.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__com_fasterxml_jackson_core_jackson_annotations_2_12_3.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__com_h2database_h2_2_1_210.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_3_12_12.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__com_squareup_okio_okio_1_15_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__commons_codec_commons_codec_1_15.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__de_flapdoodle_de_flapdoodle_os_1_2_3.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__de_flapdoodle_embed_de_flapdoodle_embed_mongo_3_5_2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__de_flapdoodle_embed_de_flapdoodle_embed_mongo_packageresolver_1_0_12.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__de_flapdoodle_embed_de_flapdoodle_embed_process_3_2_7.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__io_dropwizard_metrics_metrics_core_4_1_21.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__io_micrometer_micrometer_commons_1_10_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__io_micrometer_micrometer_core_1_10_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__io_micrometer_micrometer_observation_1_10_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__io_projectreactor_tools_blockhound_1_0_2_RELEASE.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__io_projectreactor_tools_blockhound_1_0_6_RELEASE.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__io_r2dbc_r2dbc_h2_0_9_1_RELEASE.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__io_r2dbc_r2dbc_spi_0_9_1_RELEASE.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__io_socket_engine_io_client_1_0_2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__io_socket_socket_io_client_1_0_2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__net_bytebuddy_byte_buddy_1_10_20.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__net_bytebuddy_byte_buddy_agent_1_10_20.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__net_java_dev_jna_jna_5_12_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__net_java_dev_jna_jna_platform_5_12_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__org_apache_commons_commons_compress_1_21.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__org_apache_commons_commons_lang3_3_12_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__org_apiguardian_apiguardian_api_1_1_2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__org_assertj_assertj_core_3_19_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__org_hdrhistogram_HdrHistogram_2_1_12.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__org_json_json_20090211.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__org_junit_jupiter_junit_jupiter_api_5_9_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__org_junit_jupiter_junit_jupiter_engine_5_9_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__org_junit_platform_junit_platform_commons_1_9_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__org_junit_platform_junit_platform_engine_1_9_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__org_latencyutils_LatencyUtils_2_0_3.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__org_mockito_mockito_core_3_9_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__org_mongodb_bson_4_7_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__org_mongodb_bson_record_codec_4_7_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__org_mongodb_mongodb_driver_core_4_7_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__org_mongodb_mongodb_driver_reactivestreams_4_7_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__org_objenesis_objenesis_3_2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__org_opentest4j_opentest4j_1_2_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__org_reactivestreams_reactive_streams_1_0_4.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__org_slf4j_slf4j_api_1_7_25.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__org_slf4j_slf4j_api_1_7_36.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 10 | -------------------------------------------------------------------------------- /.idea/modules/ReactiveProgrammingCourse.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /.idea/modules/util/ReactiveProgrammingCourse.util.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Reactive Advanced/Control Backpressure/BackpressureProblem/build.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | implementation 'io.projectreactor:reactor-core' 3 | } -------------------------------------------------------------------------------- /Reactive Advanced/Control Backpressure/BackpressureProblem/task.ru.html: -------------------------------------------------------------------------------- 1 | 2 | Сгрупируйте все елементы в Flux по первой букве 3 |
4 | Используйте Flux#groupBy 5 |
6 | -------------------------------------------------------------------------------- /Reactive Advanced/Control Backpressure/BackpressureProblem/test/MultipleSourcesTask5Tests.java: -------------------------------------------------------------------------------- 1 | import org.junit.jupiter.api.Test; 2 | import reactor.core.publisher.Flux; 3 | import reactor.test.StepVerifier; 4 | import reactor.util.function.Tuples; 5 | 6 | public class MultipleSourcesTask5Tests { 7 | 8 | @Test 9 | public void testSolution() { 10 | StepVerifier 11 | .create(Flux.from(Task.groupWordsByFirstLatter(Flux.just( 12 | "ABCA", 13 | "BCDBB", 14 | "CDE", 15 | "BEF", 16 | "ADE", 17 | "CFG"))) 18 | ) 19 | .expectSubscription() 20 | .expectNext(Tuples.of('A', 3)) 21 | .expectNext(Tuples.of('B', 4)) 22 | .expectNext(Tuples.of('C', 2)) 23 | .verifyComplete(); 24 | } 25 | } -------------------------------------------------------------------------------- /Reactive Advanced/Control Backpressure/lesson-info.yaml: -------------------------------------------------------------------------------- 1 | custom_name: "How To: Control Backpressure" 2 | content: 3 | - task1 4 | - task2 5 | - task3 6 | - task4 7 | - task5 8 | -------------------------------------------------------------------------------- /Reactive Advanced/Control Backpressure/task1/build.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | implementation 'io.projectreactor:reactor-core' 3 | } -------------------------------------------------------------------------------- /Reactive Advanced/Control Backpressure/task1/src/RefCounted.java: -------------------------------------------------------------------------------- 1 | public interface RefCounted { 2 | 3 | long refCount(); 4 | 5 | void release(); 6 | } -------------------------------------------------------------------------------- /Reactive Advanced/Control Backpressure/task1/src/Task.java: -------------------------------------------------------------------------------- 1 | import reactor.core.publisher.Flux; 2 | 3 | public class Task { 4 | 5 | public static Flux dropElementsOnBackpressure(Flux upstream) { 6 | return Flux.error(new ToDoException()); 7 | } 8 | } -------------------------------------------------------------------------------- /Reactive Advanced/Control Backpressure/task1/task.html: -------------------------------------------------------------------------------- 1 | 2 | Make sure your subscriber is not going to be overwhelmed by elements. Drop all 3 | unrequested elements. Release dropped elements. 4 |
5 | Use Flux#onBackpressureDrop(onDropHook) 6 |
7 | -------------------------------------------------------------------------------- /Reactive Advanced/Control Backpressure/task2/build.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | implementation 'io.projectreactor:reactor-core' 3 | } -------------------------------------------------------------------------------- /Reactive Advanced/Control Backpressure/task2/src/Task.java: -------------------------------------------------------------------------------- 1 | import java.time.Duration; 2 | import java.util.List; 3 | 4 | import reactor.core.publisher.Flux; 5 | 6 | public class Task { 7 | 8 | public static Flux> backpressureByBatching(Flux upstream, 9 | Duration duration) { 10 | return Flux.error(new ToDoException()); 11 | } 12 | } -------------------------------------------------------------------------------- /Reactive Advanced/Control Backpressure/task2/task.html: -------------------------------------------------------------------------------- 1 | 2 | Keep rate of elements at one batch per given duration 3 | 4 | 5 | 6 |
7 | Use Flux#buffer(Duration). 8 |
9 | -------------------------------------------------------------------------------- /Reactive Advanced/Control Backpressure/task2/test/BackpressureTask2Tests.java: -------------------------------------------------------------------------------- 1 | import java.time.Duration; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import reactor.core.publisher.Flux; 5 | import reactor.test.StepVerifier; 6 | 7 | public class BackpressureTask2Tests { 8 | 9 | @Test 10 | public void testSolution() { 11 | StepVerifier.withVirtualTime(() -> Task.backpressureByBatching(Flux.interval( 12 | Duration.ofMillis(1)), Duration.ofMillis(1000)), 0) 13 | .expectSubscription() 14 | .thenRequest(1) 15 | .expectNoEvent(Duration.ofSeconds(1)) 16 | .expectNextCount(1) 17 | .thenRequest(1) 18 | .expectNoEvent(Duration.ofSeconds(1)) 19 | .expectNextCount(1) 20 | .thenCancel() 21 | .verify(); 22 | } 23 | } -------------------------------------------------------------------------------- /Reactive Advanced/Control Backpressure/task3/build.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | implementation 'io.projectreactor:reactor-core' 3 | } -------------------------------------------------------------------------------- /Reactive Advanced/Control Backpressure/task3/src/Task.java: -------------------------------------------------------------------------------- 1 | import java.time.Duration; 2 | 3 | import reactor.core.publisher.Flux; 4 | 5 | public class Task { 6 | 7 | public static Flux backpressureByBatching(Flux upstream, 8 | Duration duration) { 9 | return Flux.error(new ToDoException()); 10 | } 11 | } -------------------------------------------------------------------------------- /Reactive Advanced/Control Backpressure/task3/task.html: -------------------------------------------------------------------------------- 1 | 2 | Concat all numbers into a String that fall in the same 3 | window 4 | 5 | 6 | 7 |
8 | Use Flux#window(Duration). 9 |
10 | -------------------------------------------------------------------------------- /Reactive Advanced/Control Backpressure/task3/test/BackpressureTask3Tests.java: -------------------------------------------------------------------------------- 1 | import java.time.Duration; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import reactor.core.publisher.Flux; 5 | import reactor.test.StepVerifier; 6 | 7 | public class BackpressureTask3Tests { 8 | 9 | @Test 10 | public void testSolution() { 11 | StepVerifier.withVirtualTime(() -> Task.backpressureByBatching( 12 | Flux.interval(Duration.ZERO, Duration.ofMillis(10)), Duration.ofMillis(100)), 0) 13 | .expectSubscription() 14 | .thenRequest(1) 15 | .expectNoEvent(Duration.ofMillis(100)) 16 | .expectNext("0123456789") 17 | .thenRequest(1) 18 | .expectNoEvent(Duration.ofMillis(100)) 19 | .expectNext("10111213141516171819") 20 | .thenCancel() 21 | .verify(); 22 | } 23 | } -------------------------------------------------------------------------------- /Reactive Advanced/Control Backpressure/task4/build.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | implementation 'io.projectreactor:reactor-core' 3 | } -------------------------------------------------------------------------------- /Reactive Advanced/Control Backpressure/task4/src/StatisticSnapshot.java: -------------------------------------------------------------------------------- 1 | public interface StatisticSnapshot { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /Reactive Advanced/Control Backpressure/task4/src/Task.java: -------------------------------------------------------------------------------- 1 | import java.util.function.Function; 2 | 3 | import reactor.core.publisher.Flux; 4 | import reactor.core.publisher.Mono; 5 | 6 | public class Task { 7 | 8 | public static Flux keepBackpressureForLongRunningOps(Flux queryFlux, 9 | Function> calculateStatistic) { 10 | 11 | return Flux.error(new ToDoException()); 12 | } 13 | } -------------------------------------------------------------------------------- /Reactive Advanced/Control Backpressure/task4/task.html: -------------------------------------------------------------------------------- 1 | 2 | Perform statistic updates only on latest notification. 3 | 4 | 5 | 6 |
7 | Use Flux#onBackpressureLatest(). 8 |
9 | -------------------------------------------------------------------------------- /Reactive Advanced/Control Backpressure/task5/build.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | implementation 'io.projectreactor:reactor-core' 3 | } -------------------------------------------------------------------------------- /Reactive Advanced/Control Backpressure/task5/src/Task.java: -------------------------------------------------------------------------------- 1 | import java.util.concurrent.CountDownLatch; 2 | 3 | import org.reactivestreams.Subscription; 4 | import reactor.core.publisher.BaseSubscriber; 5 | import reactor.core.publisher.Flux; 6 | import reactor.core.publisher.SignalType; 7 | 8 | public class Task { 9 | 10 | public static void dynamicDemand(Flux source, CountDownLatch countDownOnComplete) { 11 | 12 | new BaseSubscriber() {}; 13 | } 14 | } -------------------------------------------------------------------------------- /Reactive Advanced/Crypto Tracker/application/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /Reactive Advanced/Crypto Tracker/application/resources/ui/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OlegDokuka/reactive-programming-course-preview/33c29f7b8fd7812f0ef655df4927c6ab8740f486/Reactive Advanced/Crypto Tracker/application/resources/ui/favicon.ico -------------------------------------------------------------------------------- /Reactive Advanced/Crypto Tracker/application/resources/ui/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | React App 14 | 15 | 16 | 19 |
20 | 21 | -------------------------------------------------------------------------------- /Reactive Advanced/Crypto Tracker/application/src/controller/WSHandler.java: -------------------------------------------------------------------------------- 1 | package controller; 2 | 3 | import dto.MessageDTO; 4 | import reactor.core.publisher.Flux; 5 | import service.PriceService; 6 | import service.TradeService; 7 | 8 | public class WSHandler { 9 | 10 | private final PriceService priceService; 11 | private final TradeService tradeService; 12 | 13 | public WSHandler(PriceService priceService, TradeService tradeService) { 14 | this.priceService = priceService; 15 | this.tradeService = tradeService; 16 | } 17 | 18 | public Flux handle(Flux input) { 19 | return Flux.merge( 20 | priceService.pricesStream(input), 21 | tradeService.tradesStream() 22 | ); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Reactive Advanced/Crypto Tracker/application/src/utils/H2Helper.java: -------------------------------------------------------------------------------- 1 | package utils; 2 | 3 | import io.r2dbc.h2.H2ConnectionConfiguration; 4 | import io.r2dbc.h2.H2ConnectionFactory; 5 | import io.r2dbc.spi.ConnectionFactory; 6 | 7 | public class H2Helper { 8 | 9 | public static ConnectionFactory createInMemH2() { 10 | H2ConnectionConfiguration conf = H2ConnectionConfiguration.builder() 11 | .url("mem:db;DB_CLOSE_DELAY=-1;TRACE_LEVEL_SYSTEM_OUT=2") 12 | .build(); 13 | 14 | return new H2ConnectionFactory(conf); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Reactive Advanced/Crypto Tracker/application/src/utils/HttpResourceResolver.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (C) Zoomdata, Inc. 2012-2018. All rights reserved. 3 | */ 4 | package utils; 5 | 6 | import java.net.URI; 7 | import java.nio.file.Paths; 8 | import java.util.logging.Logger; 9 | 10 | public class HttpResourceResolver { 11 | private static final Logger logger = Logger.getLogger("http-server"); 12 | 13 | public static String resourcePath(String fileName) { 14 | try { 15 | URI resourceUri = ClassLoader.getSystemResource(fileName).toURI(); 16 | String location = Paths.get(resourceUri).toAbsolutePath().toString(); 17 | logger.info("File [" + fileName + "] location: " + location); 18 | return location; 19 | } catch (Exception e) { 20 | throw new RuntimeException(e); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Reactive Advanced/Crypto Tracker/application/src/utils/JsonUtils.java: -------------------------------------------------------------------------------- 1 | package utils; 2 | 3 | import com.fasterxml.jackson.core.JsonProcessingException; 4 | import com.fasterxml.jackson.databind.ObjectMapper; 5 | import reactor.core.Exceptions; 6 | 7 | public class JsonUtils { 8 | private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); 9 | 10 | public static String writeAsString(Object o) { 11 | try { 12 | return OBJECT_MAPPER.writeValueAsString(o); 13 | } catch (JsonProcessingException e) { 14 | throw Exceptions.propagate(e); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Reactive Advanced/Crypto Tracker/application/src/utils/NettyUtils.java: -------------------------------------------------------------------------------- 1 | package utils; 2 | 3 | import java.nio.charset.StandardCharsets; 4 | import java.util.function.Function; 5 | 6 | import io.netty.handler.codec.http.websocketx.TextWebSocketFrame; 7 | import org.reactivestreams.Publisher; 8 | import reactor.core.publisher.Flux; 9 | import reactor.netty.http.websocket.WebsocketInbound; 10 | import reactor.netty.http.websocket.WebsocketOutbound; 11 | 12 | public class NettyUtils { 13 | 14 | public static Flux prepareInput(WebsocketInbound inbound) { 15 | return inbound 16 | .receiveFrames() 17 | .map(hc -> hc.content().toString(StandardCharsets.UTF_8)); 18 | } 19 | 20 | public static Function, Publisher> prepareOutbound(WebsocketOutbound outbound) { 21 | return output -> outbound 22 | .sendObject(output.map(TextWebSocketFrame::new), __ -> true); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Reactive Advanced/Crypto Tracker/application/task.md: -------------------------------------------------------------------------------- 1 | Provide implementations for a missing methods: 2 | 3 | 1) Implement `ApplicationRunner.handleRequestedAveragePriceIntervalValue`. 4 | Provide Mapping of inbound messages from WebSocket to a stream of Interval. 5 | Make sure interval is within (0, 60] range and can ***continue*** working in case 6 | of malformed strings 7 | 1) Implement `ApplicationRunner.handleOutgoingStreamBackpressure` general backpressure 8 | handling using a ***strategy*** -------------------------------------------------------------------------------- /Reactive Advanced/Crypto Tracker/build.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | // implementation "io.r2dbc:r2dbc-h2:${property("r2dbc.version")}" 3 | // implementation "io.r2dbc:r2dbc-client:${property("r2dbc.version")}" 4 | } -------------------------------------------------------------------------------- /Reactive Advanced/Crypto Tracker/common/build.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | implementation 'io.projectreactor:reactor-core' 3 | } -------------------------------------------------------------------------------- /Reactive Advanced/Crypto Tracker/crypto-service-idl/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OlegDokuka/reactive-programming-course-preview/33c29f7b8fd7812f0ef655df4927c6ab8740f486/Reactive Advanced/Crypto Tracker/crypto-service-idl/build.gradle -------------------------------------------------------------------------------- /Reactive Advanced/Crypto Tracker/crypto-service-idl/src/service/CryptoService.java: -------------------------------------------------------------------------------- 1 | package service; 2 | 3 | import java.util.Map; 4 | 5 | import reactor.core.publisher.Flux; 6 | 7 | public interface CryptoService { 8 | 9 | Flux> eventsStream(); 10 | } 11 | -------------------------------------------------------------------------------- /Reactive Advanced/Crypto Tracker/crypto-service/build.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | implementation project(":Reactive_Advanced-Crypto_Tracker-crypto-service-idl") 3 | 4 | implementation 'io.socket:socket.io-client' 5 | } -------------------------------------------------------------------------------- /Reactive Advanced/Crypto Tracker/crypto-service/src/service/external/utils/MessageUnpacker.java: -------------------------------------------------------------------------------- 1 | package service.external.utils; 2 | 3 | import java.util.Map; 4 | 5 | public interface MessageUnpacker { 6 | boolean supports(String messageType); 7 | 8 | Map unpack(String message); 9 | } 10 | -------------------------------------------------------------------------------- /Reactive Advanced/Crypto Tracker/crypto-service/task.md: -------------------------------------------------------------------------------- 1 | 1) Make Service Shared between all the subscribers 2 | 2) Make sure there is a support for caching so newly connected subscribers is going to 3 | observe resent events -------------------------------------------------------------------------------- /Reactive Advanced/Crypto Tracker/lesson-info.yaml: -------------------------------------------------------------------------------- 1 | custom_name: Streaming Application 2 | content: 3 | - application 4 | - crypto-service 5 | - trade-service 6 | -------------------------------------------------------------------------------- /Reactive Advanced/Crypto Tracker/price-service-idl/build.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | implementation project(":Reactive_Advanced-Crypto_Tracker-common") 3 | } -------------------------------------------------------------------------------- /Reactive Advanced/Crypto Tracker/price-service-idl/src/service/PriceService.java: -------------------------------------------------------------------------------- 1 | package service; 2 | 3 | import dto.MessageDTO; 4 | import reactor.core.publisher.Flux; 5 | 6 | public interface PriceService { 7 | 8 | Flux> pricesStream(Flux intervalPreferencesStream); 9 | } 10 | -------------------------------------------------------------------------------- /Reactive Advanced/Crypto Tracker/price-service/build.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | implementation project(":Reactive_Advanced-Crypto_Tracker-price-service-idl") 3 | implementation project(":Reactive_Advanced-Crypto_Tracker-crypto-service-idl") 4 | implementation project(":Reactive_Advanced-Crypto_Tracker-common") 5 | } -------------------------------------------------------------------------------- /Reactive Advanced/Crypto Tracker/trade-service-idl/build.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | implementation project(":Reactive_Advanced-Crypto_Tracker-common") 3 | } -------------------------------------------------------------------------------- /Reactive Advanced/Crypto Tracker/trade-service-idl/src/service/TradeService.java: -------------------------------------------------------------------------------- 1 | package service; 2 | 3 | import dto.MessageDTO; 4 | import reactor.core.publisher.Flux; 5 | 6 | public interface TradeService { 7 | 8 | Flux> tradesStream(); 9 | 10 | } 11 | -------------------------------------------------------------------------------- /Reactive Advanced/Crypto Tracker/trade-service-idl/test/Tests.java: -------------------------------------------------------------------------------- 1 | import org.junit.jupiter.api.Test; 2 | 3 | public class Tests { 4 | 5 | @Test 6 | public void findVideoTest() { 7 | // TODO add more tests 8 | } 9 | } -------------------------------------------------------------------------------- /Reactive Advanced/Crypto Tracker/trade-service/build.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | 3 | implementation 'io.projectreactor.addons:reactor-extra' 4 | implementation 'org.mongodb:mongodb-driver-reactivestreams' 5 | implementation 'com.fasterxml.jackson.core:jackson-databind' 6 | implementation 'io.r2dbc:r2dbc-spi' 7 | implementation project(':Reactive_Advanced-Crypto_Tracker-trade-service-idl') 8 | implementation project(':Reactive_Advanced-Crypto_Tracker-crypto-service-idl') 9 | implementation project(':Reactive_Advanced-Crypto_Tracker-common') 10 | } -------------------------------------------------------------------------------- /Reactive Advanced/Crypto Tracker/trade-service/src/repository/TradeRepository.java: -------------------------------------------------------------------------------- 1 | package repository; 2 | 3 | import java.util.List; 4 | 5 | import domain.Trade; 6 | import reactor.core.publisher.Mono; 7 | 8 | public interface TradeRepository { 9 | 10 | Mono saveAll(List input); 11 | } 12 | -------------------------------------------------------------------------------- /Reactive Advanced/Hot and Sharable/InMemoryCache/build.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | implementation 'io.projectreactor:reactor-core' 3 | } -------------------------------------------------------------------------------- /Reactive Advanced/Hot and Sharable/InMemoryCache/src/UsersProfile.java: -------------------------------------------------------------------------------- 1 | public class UsersProfile { 2 | final String userId; 3 | final String uniqueHash; 4 | 5 | public UsersProfile(String userId, String uniqueHash) { 6 | this.userId = userId; 7 | this.uniqueHash = uniqueHash; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Reactive Advanced/Hot and Sharable/InMemoryCache/src/UsersProfileRepository.java: -------------------------------------------------------------------------------- 1 | import reactor.core.publisher.Flux; 2 | import reactor.core.publisher.Mono; 3 | 4 | public interface UsersProfileRepository { 5 | 6 | Mono find(String userID); 7 | } 8 | -------------------------------------------------------------------------------- /Reactive Advanced/Hot and Sharable/InMemoryCache/task.md: -------------------------------------------------------------------------------- 1 | 2 | Implement caching mechanism. Follow TODOs to solve problems at place 3 | -------------------------------------------------------------------------------- /Reactive Advanced/Hot and Sharable/lesson-info.yaml: -------------------------------------------------------------------------------- 1 | custom_name: "How To: Hot and Sharable" 2 | content: 3 | - task1 4 | - task2 5 | - task3 6 | - InMemoryCache 7 | -------------------------------------------------------------------------------- /Reactive Advanced/Hot and Sharable/task1/build.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | implementation 'io.projectreactor:reactor-core' 3 | } -------------------------------------------------------------------------------- /Reactive Advanced/Hot and Sharable/task1/src/Task.java: -------------------------------------------------------------------------------- 1 | import org.reactivestreams.Publisher; 2 | import reactor.core.publisher.Flux; 3 | 4 | public class Task { 5 | 6 | public static Publisher transformToHotWithOperator(Flux coldSource) { 7 | return Flux.error(new ToDoException()); 8 | } 9 | } -------------------------------------------------------------------------------- /Reactive Advanced/Hot and Sharable/task1/task.html: -------------------------------------------------------------------------------- 1 | 2 | Share Flux in such a way so backpressure will be controlled by all the 3 | subscribers. Also, it should connect to the main Flux 4 | when the total number of subscriber reach number 3. In case all the subscribers has 5 | been disconnected, it should cancel the subscription. 6 |
7 | Use Flux#publish + Flux.autoConnect in the first case 8 |
9 | -------------------------------------------------------------------------------- /Reactive Advanced/Hot and Sharable/task1/test/HnSTask1Tests.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OlegDokuka/reactive-programming-course-preview/33c29f7b8fd7812f0ef655df4927c6ab8740f486/Reactive Advanced/Hot and Sharable/task1/test/HnSTask1Tests.java -------------------------------------------------------------------------------- /Reactive Advanced/Hot and Sharable/task2/build.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | implementation 'io.projectreactor:reactor-core' 3 | } -------------------------------------------------------------------------------- /Reactive Advanced/Hot and Sharable/task2/src/Task.java: -------------------------------------------------------------------------------- 1 | import java.util.concurrent.atomic.AtomicInteger; 2 | import org.reactivestreams.Publisher; 3 | import reactor.core.Disposable; 4 | import reactor.core.publisher.Flux; 5 | import reactor.core.publisher.Sinks; 6 | import reactor.core.publisher.Sinks.EmitFailureHandler; 7 | 8 | public class Task { 9 | 10 | public static Publisher replayLast3ElementsInHotFashion1(Flux coldSource) { 11 | return Flux.error(new ToDoException()); // With Operator 12 | } 13 | 14 | public static Publisher replayLast3ElementsInHotFashion2(Flux coldSource) { 15 | final Sinks.Many replaySink = Sinks.many().replay().limit(3); 16 | 17 | return Flux.error(new ToDoException()); // With Sinks API 18 | } 19 | } -------------------------------------------------------------------------------- /Reactive Advanced/Hot and Sharable/task2/task.html: -------------------------------------------------------------------------------- 1 | 2 | Convert stream to replayable stream. Note, replay provides stream sharing 3 | 4 |
5 | Use Flux.replay. 6 |
7 | -------------------------------------------------------------------------------- /Reactive Advanced/Hot and Sharable/task2/test/HnSTask2Tests.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OlegDokuka/reactive-programming-course-preview/33c29f7b8fd7812f0ef655df4927c6ab8740f486/Reactive Advanced/Hot and Sharable/task2/test/HnSTask2Tests.java -------------------------------------------------------------------------------- /Reactive Advanced/Hot and Sharable/task3/build.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | implementation 'io.projectreactor:reactor-core' 3 | } -------------------------------------------------------------------------------- /Reactive Advanced/Hot and Sharable/task3/src/Task.java: -------------------------------------------------------------------------------- 1 | import org.reactivestreams.Publisher; 2 | import reactor.core.publisher.DirectProcessor; 3 | import reactor.core.publisher.Flux; 4 | 5 | public class Task { 6 | 7 | public static Publisher transformToHotUsingProcessor(Flux coldSource) { 8 | return Flux.error(new ToDoException()); 9 | } 10 | } -------------------------------------------------------------------------------- /Reactive Advanced/Hot and Sharable/task3/task.html: -------------------------------------------------------------------------------- 1 | 2 | Convert stream to shared stream but with no backpressure support 3 | 4 | 5 |
6 | Use DirectProcessor 7 |
8 | -------------------------------------------------------------------------------- /Reactive Advanced/Hot and Sharable/task3/test/HnSTask3Tests.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OlegDokuka/reactive-programming-course-preview/33c29f7b8fd7812f0ef655df4927c6ab8740f486/Reactive Advanced/Hot and Sharable/task3/test/HnSTask3Tests.java -------------------------------------------------------------------------------- /Reactive Advanced/Multiple Sources/EfficientPagination/build.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | implementation 'io.projectreactor:reactor-core' 3 | } -------------------------------------------------------------------------------- /Reactive Advanced/Multiple Sources/EfficientPagination/src/AsyncRestTemplate.java: -------------------------------------------------------------------------------- 1 | import java.util.concurrent.CompletableFuture; 2 | 3 | public interface AsyncRestTemplate { 4 | 5 | CompletableFuture getForObjectAsync(String uri, Class clazz, Object... data); 6 | } 7 | -------------------------------------------------------------------------------- /Reactive Advanced/Multiple Sources/EfficientPagination/src/TimezonedbResponse.java: -------------------------------------------------------------------------------- 1 | import java.util.List; 2 | 3 | public class TimezonedbResponse { 4 | 5 | public String status; 6 | public String message; 7 | public int totalPage; 8 | public int currentPage; 9 | public List zones; 10 | 11 | public TimezonedbResponse() { 12 | } 13 | 14 | public TimezonedbResponse(String status, String message, int totalPage, 15 | int currentPage, List zones) { 16 | super(); 17 | this.status = status; 18 | this.message = message; 19 | this.totalPage = totalPage; 20 | this.currentPage = currentPage; 21 | this.zones = zones; 22 | } 23 | 24 | } 25 | 26 | 27 | -------------------------------------------------------------------------------- /Reactive Advanced/Multiple Sources/EfficientPagination/task.md: -------------------------------------------------------------------------------- 1 | Similarly to task 2, you need to resolve pagination. Think how you may optimize 2 | resolution given you know how many pages in total you have -------------------------------------------------------------------------------- /Reactive Advanced/Multiple Sources/Fast Media Server/build.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | implementation 'io.projectreactor:reactor-core' 3 | } -------------------------------------------------------------------------------- /Reactive Advanced/Multiple Sources/Fast Media Server/src/MediaService.java: -------------------------------------------------------------------------------- 1 | import reactor.core.publisher.Flux; 2 | import reactor.core.publisher.Mono; 3 | 4 | public class MediaService { 5 | 6 | private final ServersCatalogue catalogue; 7 | 8 | public MediaService(ServersCatalogue catalogue) { 9 | this.catalogue = catalogue; 10 | } 11 | 12 | public Mono