Java
 Computer >> コンピューター >  >> プログラミング >> Java

Java 9のSubscriptionインターフェースのルールとは?基本から徹底解説

Java 9で導入されたReactive Streams(java.util.concurrent.Flow)において、SubscriptionPublisherSubscriberの間のデータ交換を仲介するための重要な役割を担います。Subscriptionは必ず1つのPublisherと1つのSubscriberのペアでのみ共有されます。そのため、subscribe()メソッドは生成されたSubscriptionを返さず、戻り値はvoidになっています。SubscriptionはonSubscribe()メソッドのコールバックを通じてのみSubscriberへ渡されます。

Subscriptionインターフェースには、request()cancel()という2つのメソッドが定義されています。

構文

public interface Subscription {
    public void request(long n);
    public void cancel();
}

Subscriptionインターフェースのルール

  • Subscription.request()およびSubscription.cancel()メソッドは、そのSubscriberのコンテキスト内でのみ呼び出されなければなりません。
  • Subscriptionは、SubscriberがonNext()またはonSubscribe()メソッド内からSubscription.request()を同期的に呼び出せるようにしなければなりません。
  • Subscription.request()メソッドは、PublisherとSubscriber間で発生しうる同期再帰に対して上限を設けなければなりません。
  • Subscription.request()メソッドは、適切なタイミングで復帰することにより、呼び出し元の応答性を尊重すべきです。
  • Subscription.cancel()メソッドは、適切なタイミングで復帰して呼び出し元の応答性を尊重しなければならず、さらにスレッドセーフである必要があります。
  • Subscriptionがキャンセルされていない間、Subscription.request(long n)メソッドは、当該Subscriberに対して生成される追加要素の数を登録しなければなりません。
  • Subscriptionがキャンセルされていない間、引数が0以下の場合、Subscription.request(long n)メソッドはIllegalArgumentExceptionを伴ってonError()メソッドを呼び出さなければなりません。
  • Subscriptionがキャンセルされていない間、Subscription.request(long n)メソッドは、このSubscriberまたは他のSubscriberに対してonNext()メソッドを同期的に呼び出しても構いません。
  • Subscriptionがキャンセルされていない間、Subscription.request(long n)メソッドは、このSubscriberまたは他のSubscriberに対してonComplete()またはonError()メソッドを同期的に呼び出しても構いません。
  • Subscriptionがキャンセルされていない間、Subscription.cancel()メソッドは、Publisherに対してそのSubscriberへのシグナリングを停止するよう要求しなければなりません。ただし、この操作が即座にSubscriptionへ影響を与えることは要求できません。
  • Subscriptionがキャンセルされていない間、Subscription.cancel()メソッドは、Publisherに対して該当するSubscriberへの参照を破棄するよう要求しなければなりません。
  • Subscription.cancel()およびSubscription.request()メソッドの呼び出しは、正常に復帰しなければなりません。
  • Subscriptionは、requestメソッドの無制限回数の呼び出しをサポートし、最大2^63-1までの需要(デマンド)を扱えなければなりません。2^63-1以上の需要は、Publisherによって事実上無限(effectively unbounded)として扱われる場合があります。

まとめ

Subscriptionインターフェースは、バックプレッシャー(背圧)制御の中核となる仕組みです。これらのルールに従うことで、PublisherとSubscriberの間で安全かつ効率的な非同期ストリーム処理を実現できます。特にrequest()による需要管理とcancel()によるキャンセル処理の挙動は、Reactive Streams実装を正しく理解するうえで重要なポイントです。

  1. Java 9における@Deprecatedアノテーションの改善点とは?新要素「since」「forRemoval」を徹底解説

    @Deprecatedアノテーションとはクラス、メソッド、フィールドなど、プログラム内のあらゆる要素に付与できる@Deprecatedアノテーションは、「その要素はもはや使用すべきではない」ことを示すためのものです。要素が非推奨とされる主な理由は以下の通りです。使用すると危険であり、エラーを引き起こす可能性がある将来のバージョンで互換性がなくなる可能性がある将来のバージョンで削除される可能性があるより優れた、効率的な代替手段がすでに提供されているJava 9で追加された2つの新しい要素Java 9では、@DeprecatedアノテーションにsinceとforRemovalという2つの新しい属性

  2. Javaのpaint()メソッドとrepaint()メソッドの違いをわかりやすく解説

    JavaでGUIアプリケーションを開発する際、コンポーネントの描画に関わるpaint()メソッドとrepaint()メソッドは、役割がまったく異なる重要なメソッドです。この記事では、両者の違いと正しい使い方を具体例とともに解説します。 paint()メソッドとrepaint()メソッドの違い paint()メソッドとは paint()は、コンポーネントを実際に描画するための処理(描画命令)を記述するメソッドです。Java AWTでは、このメソッドをオーバーライドして独自の描画処理を実装します。 一方、Java SwingではpaintComponent()メソッドをオーバーライドするのが推奨さ