Java9でpubsubを実装する

Java9でpubsubを実装する

Java9からpubsubを簡単に実装できるようになっています。サブスクライバーを実装します。

オーバーライド
onSubscribe()
onNext()
onError()
onComplete()

Subscriberインタフェースからオーバーライドするメソッドは4つです。

package jp.co.confrage;
import java.util.concurrent.Flow;
import java.util.concurrent.Flow.Subscription;
public class Subscriber<T> implements Flow.Subscriber<T>{
private Flow.Subscription sub;
@Override
public void onSubscribe(Subscription sub) {
this.sub = sub; // 登録
sub.request(1); // 最初のデータをリクエスト
System.out.println("登録");
}
@Override
public void onNext(T item) {
System.out.println(item);
sub.request(1); // 次のデータをリクエスト
}
@Override
public void onComplete() {
System.out.println("完了"); // 完了処理
}
@Override
public void onError(Throwable t) {
t.printStackTrace(); // エラー発生処理
}
}

view raw
gistfile1.txt
hosted with ❤ by GitHub

SubmissionPublisherクラスを使用してパブリッシャーのインスタンスを作成します。

subscribeメソッドが用意されているので引数にサブスクライバーのインスタンスをセットします。これでパブサブの設定は完了です。

あとはSubmissionPublisherクラスのsubmitメソッドでpublishします。

以下は簡単なパブサブの実装です。

package jp.co.confrage;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.SubmissionPublisher;
public class Sample {
public static void main(String[] args) {
SubmissionPublisher<String> publisher = new SubmissionPublisher<>();
Subscriber<String> subscriber = new Subscriber<>();
publisher.subscribe(subscriber); // サブスクライバーを登録する
List<String> items = List.of("1", "2", "3", "4", "5", "6");
items.forEach(publisher::submit); // パブリッシュする
publisher.close();
CompletableFuture<Void> f = publisher.consume(s -> {});
try {
f.get(); // pubsubが終了するまで待つ
}catch(Exception ex){}
}
}

view raw
gistfile1.txt
hosted with ❤ by GitHub

ちゃんと実行されているのが結果からわかります。

登録
1
2
3
4
5
6
完了

view raw
gistfile1.txt
hosted with ❤ by GitHub

  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA