Subscription có thể chia sẻ bởi đúng một Publisher và một Subscriber để trung gian trao đổi dữ liệu. Đó là lý do phương thức subscribe() không trả về Subscription đã tạo, mà trả về void. Subscription chỉ truyền cho Subscriber qua callback phương thức onSubscribe(). Interface Subscription chứa hai phương thức: request() và cancel().
Cú pháp
public interface Subscription {
public void request(long n);
public void cancel();
}
Quy tắc cho interface Subscription:
- Phương thức
Subscription.request()vàSubscription.cancel()phải chỉ gọi bên trong context Subscriber của nó. - Subscription phải cho phép Subscriber gọi
Subscription.request()đồng bộ từ trongonNext()hoặconSubscribe(). Subscription.request()phải đặt giới hạn trên cho đệ quy đồng bộ có thể xảy ra giữa Publisher và Subscriber.Subscription.request()nên tôn trọng tính responsivity của caller bằng cách trả về kịp thời.Subscription.cancel()phải tôn trọng responsivity của caller bằng cách trả về kịp thời, và phải thread-safe.- Khi Subscription chưa bị hủy,
Subscription.request(long n)phải đăng ký số lượng phần tử thêm để sản xuất cho subscriber tương ứng. - Khi Subscription chưa bị hủy,
Subscription.request(long n)phải gọionError()vớiIllegalArgumentExceptionnếu tham số <= 0. - Khi Subscription chưa bị hủy,
Subscription.request(long n)có thể gọi đồng bộonNext()trên subscriber này hoặc subscriber khác. - Khi Subscription chưa bị hủy,
Subscription.request(long n)có thể gọi đồng bộonComplete()hoặconError()trên subscriber này hoặc subscriber khác. - Khi Subscription chưa bị hủy,
Subscription.cancel()phải yêu cầu Publisher dừng gửi tín hiệu cho Subscriber. Operation không bắt buộc ảnh hưởng ngay lập tức. - Khi Subscription chưa bị hủy,
Subscription.cancel()phải yêu cầu Publisher xóa tham chiếu đến subscriber tương ứng. - Gọi
Subscription.cancel()vàSubscription.request()phải trả về bình thường. - Subscription phải hỗ trợ số lượng gọi request không giới hạn và hỗ trợ demand lên đến
2^63-1. Demand bằng hoặc lớn hơn2^63-1có thể coi là effectively unbounded bởi Publisher.