rxjava : backpressure
This commit is contained in:
@@ -1,3 +1,5 @@
|
|||||||
|
package _01_basic;
|
||||||
|
|
||||||
import io.reactivex.rxjava3.core.Flowable;
|
import io.reactivex.rxjava3.core.Flowable;
|
||||||
|
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
package _01_basic;
|
||||||
|
|
||||||
import io.reactivex.rxjava3.core.Flowable;
|
import io.reactivex.rxjava3.core.Flowable;
|
||||||
|
|
||||||
public class ColdPublisherEx {
|
public class ColdPublisherEx {
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
package _01_basic;
|
||||||
|
|
||||||
import io.reactivex.rxjava3.processors.PublishProcessor;
|
import io.reactivex.rxjava3.processors.PublishProcessor;
|
||||||
|
|
||||||
public class HotPublisherEx {
|
public class HotPublisherEx {
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
package _01_basic;
|
||||||
|
|
||||||
import io.reactivex.rxjava3.core.Flowable;
|
import io.reactivex.rxjava3.core.Flowable;
|
||||||
|
|
||||||
public class OperatorEx {
|
public class OperatorEx {
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
package _02_backpressure;
|
||||||
|
|
||||||
|
import io.reactivex.rxjava3.core.BackpressureOverflowStrategy;
|
||||||
|
import io.reactivex.rxjava3.core.Flowable;
|
||||||
|
import io.reactivex.rxjava3.schedulers.Schedulers;
|
||||||
|
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
public class BackPressureStrategyEx {
|
||||||
|
/*
|
||||||
|
BUFFER : 모든 데이터 버퍼링
|
||||||
|
DROP : 새로 생성한 데이터 삭제
|
||||||
|
LATEST : 버퍼가 비워질 때 까지 통지 데이터 대기
|
||||||
|
ERROR : 버퍼 크기 초과시 MissingBackpressureException
|
||||||
|
NONE : 특정 처리 수행 X
|
||||||
|
*/
|
||||||
|
public static void main(String[] args) throws InterruptedException {
|
||||||
|
// BUFFER 전략
|
||||||
|
// bufferStrategy();
|
||||||
|
|
||||||
|
// DROP 전략
|
||||||
|
// dropStrategy();
|
||||||
|
|
||||||
|
// LATEST 전략
|
||||||
|
latestStrategy();
|
||||||
|
|
||||||
|
Thread.sleep(3000L);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void latestStrategy() {
|
||||||
|
Flowable.interval(300L, TimeUnit.MILLISECONDS)
|
||||||
|
.doOnNext(data -> System.out.println("interval = " + data))
|
||||||
|
.onBackpressureLatest()
|
||||||
|
.observeOn(Schedulers.computation(), false, 1)
|
||||||
|
.subscribe(
|
||||||
|
data -> {
|
||||||
|
Thread.sleep(1000L);
|
||||||
|
System.out.println("data = " + data);
|
||||||
|
},
|
||||||
|
error -> System.out.println("error = " + error)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void dropStrategy() {
|
||||||
|
Flowable.interval(300L, TimeUnit.MILLISECONDS)
|
||||||
|
.doOnNext(data -> System.out.println("interval = " + data))
|
||||||
|
.onBackpressureDrop(drop -> System.out.println("drop = " + drop))
|
||||||
|
.observeOn(Schedulers.computation(), false, 1)
|
||||||
|
.subscribe(
|
||||||
|
data -> {
|
||||||
|
Thread.sleep(1000L);
|
||||||
|
System.out.println("data = " + data);
|
||||||
|
},
|
||||||
|
error -> System.out.println("error = " + error)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void bufferStrategy() {
|
||||||
|
Flowable.interval(300L, TimeUnit.MILLISECONDS)
|
||||||
|
.doOnNext(data -> System.out.println("interval = " + data))
|
||||||
|
.onBackpressureBuffer(
|
||||||
|
2,
|
||||||
|
() -> System.out.println("overflow"),
|
||||||
|
BackpressureOverflowStrategy.DROP_LATEST // ERROR, DROP_LATEST, DROP_OLDEST
|
||||||
|
)
|
||||||
|
.doOnNext(data -> System.out.println("buffer = " + data))
|
||||||
|
.observeOn(Schedulers.computation(), false, 1)
|
||||||
|
.subscribe(
|
||||||
|
data -> {
|
||||||
|
Thread.sleep(1000L);
|
||||||
|
System.out.println("data = " + data);
|
||||||
|
},
|
||||||
|
error -> System.out.println("error = " + error)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
package _02_backpressure;
|
||||||
|
|
||||||
|
import io.reactivex.rxjava3.core.Flowable;
|
||||||
|
import io.reactivex.rxjava3.schedulers.Schedulers;
|
||||||
|
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
public class MissingBackpressureExceptionEx {
|
||||||
|
|
||||||
|
public static void main(String[] args) throws InterruptedException {
|
||||||
|
/*
|
||||||
|
실행시 통지 속도보다 처리 속도가 느리기 때문에 MissingBackpressureException 발생
|
||||||
|
기본 버퍼가 128 이므로 128이상의 통지가 오면 예외발생
|
||||||
|
*/
|
||||||
|
Flowable.interval(1L, TimeUnit.MILLISECONDS) // 1ms 마다 숫자 통지
|
||||||
|
.doOnNext(data -> System.out.println("data = " + data)) // 통지된 데이터 출력
|
||||||
|
.observeOn(Schedulers.computation())
|
||||||
|
.subscribe(
|
||||||
|
data -> {
|
||||||
|
System.out.println("처리 대기중");
|
||||||
|
Thread.sleep(1000L); // 1초의 지연
|
||||||
|
System.out.println("data = " + data);
|
||||||
|
},
|
||||||
|
error -> System.out.println("error = " + error),
|
||||||
|
() -> System.out.println("completed")
|
||||||
|
);
|
||||||
|
|
||||||
|
Thread.sleep(2000L);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user