Commit b7ddc2a2 authored by Julien SADAOUI's avatar Julien SADAOUI
Browse files

feat: RxJava - Level1

parent 0d963723
repositories {
jcenter()
mavenCentral()
}
plugins {
id("java")
id("org.springframework.boot") version "2.1.1.RELEASE"
id("idea")
}
apply(plugin = "io.spring.dependency-management")
java {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
group = "com.ippon.codingdojo"
version = "1.0.0"
dependencies {
implementation("ch.qos.logback:logback-classic")
implementation("org.slf4j:log4j-over-slf4j")
implementation("io.reactivex.rxjava2:rxjava")
compileOnly("org.projectlombok:lombok")
annotationProcessor("org.projectlombok:lombok")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine")
testImplementation("org.junit.jupiter:junit-jupiter-api")
}
configurations.all {
exclude(group = "org.slf4j", module = "slf4j-log4j12")
exclude(group = "log4j", module = "log4j")
}
tasks.withType<Jar> {
enabled = false
}
tasks.withType<Test> {
useJUnitPlatform()
maxHeapSize = "1G"
testLogging.showStandardStreams = true
}
rootProject.name = "reactive-rxjava"
package fr.ippon.codingdojo.reactive;
import fr.ippon.codingdojo.reactive.util.Log;
import io.reactivex.Observable;
import lombok.extern.slf4j.Slf4j;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/**
* Création de flux de données.
*
* La classe `Observable` représente un flux de données. Les méthodes `just` or `fromIterable` crée un flux
* à partir d'une collection d'objets. Les flux de données sont des chaînes de caractères dans cet exercice.
*
* Si vous ne souscrivez pas au flux, rien ne se passe. La méthode `subscribe` déclare un `observer` consommant
* les données passées dans le flux. La souscription déclenche les étapes de traitement du flux.
*
*/
@Slf4j
public class Level1 {
public static void main(String[] args) throws Exception {
exercise1();
exercise2();
exercice3();
exercise4();
}
/**
* TODO: Créer un `Observable` de `Flash McQueen`, `Chick Hicks` and `The King` avec la méthode `Observable.just`
*
* NOTE: sortie attendue
*
* Start Level1/Exercise1
* Flash McQueen
* Chick Hicks
* The King
* Done
* Stop
*
* REMARQUE:
* la sortie du flux est synchrone !
*/
private static void exercise1() {
log.info("Start Level1/Exercise1");
Observable.just("Flash McQueen", "Chick Hicks", "The King")
.subscribe(log::info, Log::error, Log::done);
log.info("Stop");
}
/**
* TODO: Créer un `Observable` à partir de la liste `data`
*
* NOTE: sortie attendue
*
* Start Level1/Exercise2
* Flash McQueen
* Martin
* Sally Carrera
* Done
* Stop
*
* REMARQUE:
* La sortie du flux est encore synchrone, parce que la liste est consommée de manière synchrone
*/
private static void exercise2() {
var data = List.of("Flash McQueen", "Martin", "Sally Carrera");
log.info("Start Level1/Exercise2");
Observable.fromIterable(data)
.subscribe(log::info, Log::error, Log::done);
log.info("Stop");
}
/**
* TODO: Créer à partir d'une tâche `Callable`, la tâche émet la valeur après 5 secondes.
*
* NOTE: sortie attendue
*
* Start Level1/Exercise3
* Winner: Flash McQueen
* Done
* Stop
*
* REMARQUE:
* La tâche est exécutée de manière synchrone, le `Thread` principal attend le résultat de la tâche.
*/
private static void exercice3() {
Callable<String> callable = () -> {
nap(5, TimeUnit.SECONDS);
return "Flash McQueen";
};
log.info("Start Level1/Exercise3");
Observable.fromCallable(callable)
.subscribe(winner -> log.info("Winner: {}", winner), Log::error, Log::done);
log.info("Stop");
}
/**
* TODO: Créer un `Observable` à partir d'un objet `Futre`, le résultat est émit par une tâche planifiée après 3 secondes.
*
* NOTE: sortie attendue
*
* Start Level1/Exercise4
* Winner: The king
* Done
* Stop
*
* REMARQUE:
* La tâche est encore exécutée de manière synchrone !
*/
public static void exercise4() {
var future = Executors.newSingleThreadScheduledExecutor().schedule(() -> "The king", 3, TimeUnit.SECONDS);
log.info("Start Level1/Exercise4");
Observable.fromFuture(future)
.subscribe(winner -> log.info("Winner: {}", winner), Log::error, Log::done);
log.info("stop");
}
private static void nap(long delay, TimeUnit timeUnit) {
try {
Thread.sleep(timeUnit.toMillis(delay));
} catch (InterruptedException e) {
// ignore
}
}
}
package fr.ippon.codingdojo.reactive.util;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
@UtilityClass
@Slf4j
public class Log {
public void error(Throwable throwable) {
log.error(throwable.getMessage(), throwable);
}
public void done() {
log.info("Done");
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://raw.githubusercontent.com/enricopulatzo/logback-XSD/master/src/main/xsd/logback.xsd">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d [%thread] %-5level - %msg%n</pattern>
</encoder>
</appender>
<logger name="com.ippon.codingdojo" level="DEBUG"/>
<logger name="ch.qos.logback" level="WARN"/>
<root level="debug">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment