モジュール jdk.jfr
パッケージ jdk.jfr.consumer

インタフェースEventStream

すべてのスーパー・インタフェース:
AutoCloseable
既知のすべての実装クラス:
RecordingStream, RemoteRecordingStream

public interface EventStream extends AutoCloseable
イベントのストリームを表します。

ストリームとは一連のイベントであり、ストリームとの対話方法はアクションの登録です。 EventStreamインタフェースが実装されておらず、将来のバージョンのJDKでは完全に使用できない可能性があります。

イベントの到着時に通知を受信するには、onEvent(Consumer)メソッドを使用してアクションを登録します。 特定の名前を持つイベントのストリームをフィルタするには、onEvent(String, Consumer)メソッドを使用します。

デフォルトでは、同じRecordedEventオブジェクトを使用して2つ以上の個別のイベントを表すことができます。 そのオブジェクトは、同じアクションおよび他のアクションに複数回配信できます。 アクションの完了後にイベント・オブジェクトを使用するには、setReuse(boolean)メソッドをfalseに設定して、イベントごとに新しいオブジェクトが割り当てられるようにします。

イベントは、バッチで配信されます。 バッチが完了したときに通知を受け取るには、onFlush(Runnable)メソッドを使用してアクションを登録します。 これは、Java Virtual Machine (JVM)が次のバッチを準備している間に、外部システムに対してデータを集約またはプッシュする機会です。

バッチ内のイベントは、終了時間によって時系列順にソートされます。 確定イベントは、フラッシュの時点でJVMに使用可能なイベント、つまり単一バッチで1単位として配信されるイベントのセットに対してのみ維持されます。 そのため、バッチ内に配信されたイベントは、以前のバッチで配信されたイベントと比較して順不同になることがありますが、同じバッチ内のイベントとは順不同になることはありません。 順序付けが懸念されない場合は、setOrdered(boolean)メソッドを使用してソートを無効にできます。

登録されたアクションにイベントをディスパッチするには、ストリームを開始する必要があります。 現在のスレッドで処理を開始するには、start()メソッドを呼び出します。 別のスレッドでアクションを非同期に処理するには、startAsync()メソッドを呼び出します。 ストリームの完了を待機するには、awaitTermination awaitTermination()またはawaitTermination(Duration)メソッドを使用します。

ストリームが終了すると、自動的にクローズされます。 イベントの処理を手動で停止するには、close()メソッドを呼び出してストリームを閉じます。 また、ストリームは、たとえばモニターしているJVMが終了した場合など、例外的な状況で自動的にクローズされることもあります。 これらのいずれかのタイミングで通知を受信するには、onClose(Runnable)メソッドを使用してアクションを登録します。

アクションで予期しない例外が発生した場合は、エラー・ハンドラで例外を捕捉できます。 エラー・ハンドラは、onError(Consumer)メソッドを使用して登録できます。 エラー・ハンドラが登録されていない場合、デフォルトの動作では、例外とそのバック・トレースが標準エラー・ストリームに出力されます。

次の例では、Flight Recorderを実行しているJVMでイベントをリスニングするためにEventStreamを使用する方法を示します

try (var es = EventStream.openRepository()) {
    es.onEvent("jdk.CPULoad", event -> {
        System.out.println("CPU Load " + event.getEndTime());
        System.out.println(" Machine total: " + 100 * event.getFloat("machineTotal") + "%");
        System.out.println(" JVM User: " + 100 * event.getFloat("jvmUser") + "%");
        System.out.println(" JVM System: " + 100 * event.getFloat("jvmSystem") + "%");
        System.out.println();
    });
    es.onEvent("jdk.GarbageCollection", event -> {
        System.out.println("Garbage collection: " + event.getLong("gcId"));
        System.out.println(" Cause: " + event.getString("cause"));
        System.out.println(" Total pause: " + event.getDuration("sumOfPauses"));
        System.out.println(" Longest pause: " + event.getDuration("longestPause"));
        System.out.println();
    });
    es.start();
}

ストリームとのレコーディングを開始するには、RecordingStreamを参照してください。

導入されたバージョン:
14