Java 9 Subscription 인터페이스란?
Subscription(구독)은 정확히 하나의 Publisher(발행자)와 하나의 Subscriber(구독자) 사이에서만 공유되며, 두 객체 간의 데이터 교환을 중재하는 역할을 합니다. 바로 이러한 이유 때문에 subscribe() 메서드는 생성된 Subscription 객체를 반환하지 않고 void를 반환합니다. Subscription은 오직 onSubscribe() 메서드 콜백을 통해서만 Subscriber에게 전달됩니다.
Subscription 인터페이스는 두 가지 메서드를 포함합니다. 바로 request()와 cancel()입니다.
문법(Syntax)
public interface Subscription {
public void request(long n);
public void cancel();
}Subscription 인터페이스의 규칙
- Subscription.request()와 Subscription.cancel() 메서드는 반드시 해당 Subscriber의 컨텍스트 내부에서만 호출되어야 합니다.
- Subscription은 Subscriber가 onNext() 또는 onSubscribe() 메서드 내부에서 request() 메서드를 동기적으로 호출할 수 있도록 허용해야 합니다.
- request() 메서드는 Publisher와 Subscriber 사이에 발생할 수 있는 동기적 재귀(synchronous recursion)에 상한선을 설정해야 합니다.
- request() 메서드는 호출자의 응답성(responsivity)을 존중하여 신속하게 반환해야 합니다.
- cancel() 메서드 역시 호출자의 응답성을 존중하여 신속하게 반환해야 하며, 반드시 스레드 세이프(thread-safe)여야 합니다.
- Subscription이 취소되지 않은 상태에서는 request(long n) 메서드가 해당 Subscriber에게 추가로 생산할 요소의 개수를 등록해야 합니다.
- Subscription이 취소되지 않은 상태에서 인자가 0 이하로 전달되면, request(long n) 메서드는 IllegalArgumentException과 함께 onError() 메서드를 호출해야 합니다.
- Subscription이 취소되지 않은 상태에서 request(long n) 메서드는 현재 또는 다른 Subscriber에 대해 동기적으로 onNext() 메서드를 호출할 수 있습니다.
- Subscription이 취소되지 않은 상태에서 request(long n) 메서드는 현재 또는 다른 Subscriber에 대해 동기적으로 onComplete() 또는 onError() 메서드를 호출할 수 있습니다.
- Subscription이 취소되지 않은 상태에서 cancel() 메서드는 Publisher에게 해당 Subscriber로의 신호 전송(signal) 중단을 요청해야 합니다. 단, 이 작업이 즉시 적용되어야 한다고 요구할 수는 없습니다.
- Subscription이 취소되지 않은 상태에서 cancel() 메서드는 Publisher에게 해당 Subscriber에 대한 모든 참조를 제거하도록 요청해야 합니다.
- cancel()과 request() 메서드 호출은 반드시 정상적으로(normal) 반환되어야 합니다.
- Subscription은 무제한 횟수의 request 호출을 지원해야 하며, 최대 2^63-1까지의 수요(demand)를 지원해야 합니다. 만약 수요가 2^63-1과 같거나 그보다 크다면, Publisher는 이를 사실상 무제한(unbounded)으로 간주할 수 있습니다.