Spec-Zone.ru › OpenJDK 25

Интерфейс EventStream

Все супер интерфейсы:
AutoCloseable
Все известные реализующие классы:
RecordingStream, RemoteRecordingStream
public interface EventStream extends AutoCloseable
Представляет поток событий.

Поток — это последовательность событий, а для взаимодействия с потоком регистрируются действия. Интерфейс EventStream не предназначен для реализации, и в будущих версиях JDK это может быть полностью запрещено.

Чтобы получать уведомления о поступлении события, зарегистрируйте действие с помощью метода onEvent(Consumer). Чтобы отфильтровать поток по событию с определённым именем, используйте метод onEvent(String, Consumer).

По умолчанию один и тот же объект RecordedEvent может представлять два или более различных события. Этот объект может передаваться одному и тому же действию несколько раз, а также другим действиям. Чтобы использовать объект события после завершения действия, следует задать для метода setReuse(boolean) значение false, чтобы для каждого события создавался новый объект.

События доставляются пакетами. Чтобы получать уведомления о завершении обработки пакета, зарегистрируйте действие с помощью метода onFlush(Runnable). Это позволяет агрегировать данные или отправлять их во внешние системы, пока виртуальная машина Java (JVM) подготавливает следующий пакет.

События в пакете сортируются в хронологическом порядке по времени их окончания. Правильный порядок событий сохраняется только для тех событий, которые доступны JVM на момент сброса, то есть для набора событий, доставляемых как единое целое в одном пакете. Поэтому события в одном пакете могут поступать не по порядку относительно событий из предыдущего пакета, но порядок событий внутри одного пакета всегда сохраняется. Если порядок не важен, сортировку можно отключить с помощью метода setOrdered(boolean).

Чтобы передавать события зарегистрированным действиям, поток необходимо запустить. Чтобы начать обработку в текущем потоке, вызовите метод start(). Чтобы обрабатывать действия асинхронно в отдельном потоке, вызовите метод startAsync(). Чтобы дождаться завершения потока, используйте метод awaitTermination awaitTermination() или метод awaitTermination(Duration).

При завершении поток автоматически закрывается. Чтобы вручную остановить обработку событий, закройте поток, вызвав метод close(). Поток также может автоматически закрыться при исключительных обстоятельствах, например если завершается работа отслеживаемой JVM. Чтобы получать уведомления при любом из этих событий, зарегистрируйте действие с помощью метода onClose(Runnable).

Если в действии возникает непредвиденное исключение, его можно перехватить обработчиком ошибок. Обработчик ошибок можно зарегистрировать с помощью метода onError(Consumer). Если обработчик ошибок не зарегистрирован, исключение и трассировка его стека выводятся в стандартный поток ошибок.

В следующем примере показано, как EventStream можно использовать для прослушивания событий в JVM, запустившей Flight Recorder

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

Краткое описание методов

Модификатор и тип Метод Описание
void awaitTermination()
Блокирует выполнение до тех пор, пока не завершатся все действия, не будет закрыт поток, не произойдёт прерывание текущего потока — в зависимости от того, что наступит первым.
void awaitTermination(Duration timeout)
Блокирует выполнение до тех пор, пока не завершатся все действия, не будет закрыт поток, не истечёт время ожидания или не произойдёт прерывание текущего потока — в зависимости от того, что наступит первым.
void close()
Освобождает все ресурсы, связанные с этим потоком.
void onClose(Runnable action)
Регистрирует действие, которое будет выполнено при закрытии потока.
void onError(Consumer<Throwable> action)
Регистрирует действие, которое будет выполнено при возникновении исключения.
void onEvent(String eventName, Consumer<RecordedEvent> action)
Регистрирует действие, которое будет выполнено для всех событий с заданным именем.
void onEvent(Consumer<RecordedEvent> action)
Регистрирует действие, которое будет выполнено для всех событий в потоке.
void onFlush(Runnable action)
Регистрирует действие, которое будет выполнено после сброса потока.
default void onMetadata(Consumer<MetadataEvent> action)
Регистрирует действие, которое будет выполнено при поступлении в поток новых метаданных.
static EventStream openFile(Path file)
Создаёт поток событий из файла.
static EventStream openRepository()
Создаёт поток из репозитория текущей виртуальной машины Java (JVM).
static EventStream openRepository(Path directory)
Создаёт поток событий из дискового репозитория.
boolean remove(Object action)
Отменяет регистрацию действия.
void setEndTime(Instant endTime)
Задаёт время окончания потока.
void setOrdered(boolean ordered)
Указывает, что события поступают в хронологическом порядке, отсортированном по времени их фиксации в потоке.
void setReuse(boolean reuse)
Указывает, что объект события в действии onEvent(Consumer) можно повторно использовать.
void setStartTime(Instant startTime)
Задаёт время начала потока.
void start()
Запускает обработку действий.
void startAsync()
Запускает асинхронную обработку действий.

Подробное описание методов

openRepository

static EventStream openRepository() throws IOException
Создаёт поток из репозитория текущей виртуальной машины Java (JVM).

По умолчанию поток начинается со следующего события, сброшенного Flight Recorder.

Возвращает:
поток событий, не null
Вызывает исключение:
IOException — если не удаётся открыть поток или при попытке доступа к репозиторию происходит ошибка ввода-вывода

openRepository

static EventStream openRepository(Path directory) throws IOException
Создаёт поток событий из дискового репозитория.

По умолчанию поток начинается со следующего события, сброшенного Flight Recorder.

Следует открывать только доверенные дисковые репозитории.

Параметры:
directory — расположение дискового репозитория, не null
Возвращает:
поток событий, не null
Вызывает исключение:
IOException — если не удаётся открыть поток или при попытке доступа к репозиторию происходит ошибка ввода-вывода

openFile

static EventStream openFile(Path file) throws IOException
Создаёт поток событий из файла.

По умолчанию поток начинается с первого события в файле.

Следует открывать только файлы записи из доверенных источников.

Параметры:
file — расположение файла, не null
Возвращает:
поток событий, не null
Вызывает исключение:
IOException — если не удаётся открыть файл или при чтении происходит ошибка ввода-вывода

onMetadata

default void onMetadata(Consumer<MetadataEvent> action)
Регистрирует действие, которое будет выполнено при поступлении в поток новых метаданных. Тип события всегда поступает раньше самого события. Действие необходимо зарегистрировать до запуска потока.

В следующем примере показано, как прослушивать новые типы событий, регистрировать действие, если имя типа события соответствует регулярному выражению, и увеличивать счётчик при обнаружении соответствующего события. Преимущество использования отдельного действия для каждого типа события вместо универсального метода onEvent(Consumer) заключается в том, что реализация потока может не считывать события, которые не представляют интереса.

static long count = 0;
public static void main(String... args) throws IOException {
    Path file = Path.of(args[0]);
    String regExp = args[1];
    var pr = Pattern.compile(regExp).asMatchPredicate();
    try (var s = EventStream.openFile(file)) {
        s.setOrdered(false);
        s.onMetadata(metadata -> metadata.getAddedEventTypes()
         .stream().map(EventType::getName).filter(pr)
         .forEach(eventName -> s.onEvent(eventName, event -> count++)));
        s.start();
        System.out.println(count + " events matches " + regExp);
    }
}
Требования к реализации:
Реализация этого метода по умолчанию ничего не делает.
Параметры:
action — действие, которое нужно выполнить, не null
Вызывает исключение:
IllegalStateException — если действие добавлено после запуска потока
Начиная с:
16

onEvent

void onEvent(Consumer<RecordedEvent> action)
Регистрирует действие, которое будет выполнено для всех событий в потоке.

Чтобы выполнить действие для подмножества типов событий, рассмотрите возможность использования методов onEvent(String, Consumer) и onMetadata(Consumer), поскольку это, вероятно, будет эффективнее любого механизма выбора или фильтрации, реализованного в универсальном действии.

Параметры:
action — действие, выполняемое для каждого RecordedEvent, не null
См. также:
  • onEvent(Consumer)
  • onMetadata(Consumer)

onEvent

void onEvent(String eventName, Consumer<RecordedEvent> action)
Регистрирует действие, которое будет выполнено для всех событий с заданным именем.
Параметры:
eventName — имя события, не null
action — действие, выполняемое для каждого RecordedEvent с указанным именем события, не null

onFlush

void onFlush(Runnable action)
Регистрирует действие, которое будет выполнено после сброса потока.
Параметры:
action — действие, выполняемое после сброса потока, не null

onError

void onError(Consumer<Throwable> action)
Регистрирует действие, которое будет выполнено при возникновении исключения.

Если действие не зарегистрировано, трассировка стека исключения выводится в стандартный поток ошибок.

Регистрация действия заменяет поведение по умолчанию. Если зарегистрировано несколько действий, они выполняются в порядке регистрации.

Если сам этот метод выбрасывает исключение, дальнейшее поведение не определено.

Параметры:
action — действие, выполняемое при возникновении исключения, не null

onClose

void onClose(Runnable action)
Регистрирует действие, которое будет выполнено при закрытии потока.

Если поток уже закрыт, действие будет немедленно выполнено в текущем потоке.

Параметры:
action — действие, выполняемое после закрытия потока, не null
См. также:
  • close()

close

void close()
Освобождает все ресурсы, связанные с этим потоком.

Если поток запущен асинхронно или синхронно, он немедленно останавливается либо останавливается после следующего сброса. Этот метод НЕ гарантирует, что все зарегистрированные действия будут завершены до его возврата.

Повторное закрытие уже закрытого потока не оказывает никакого эффекта.

Определено в:
close в интерфейсе AutoCloseable

remove

boolean remove(Object action)
Отменяет регистрацию действия.

Если действие было зарегистрировано несколько раз, регистрация отменяется для всех его экземпляров.

Параметры:
action — действие, регистрацию которого нужно отменить, не null
Возвращает:
true, если регистрация действия была отменена, и false в противном случае
См. также:
  • onEvent(Consumer)
  • onEvent(String, Consumer)
  • onFlush(Runnable)
  • onClose(Runnable)
  • onError(Consumer)

setReuse

void setReuse(boolean reuse)
Указывает, что объект события в действии onEvent(Consumer) можно повторно использовать.

Если для повторного использования задано значение true, действие не должно сохранять ссылку на объект события после завершения.

Параметры:
reuse — true, если объект события можно повторно использовать, и false в противном случае

setOrdered

void setOrdered(boolean ordered)
Указывает, что события поступают в хронологическом порядке, отсортированном по времени их фиксации в потоке.
Параметры:
ordered — следует ли передавать объекты событий в хронологическом порядке методу onEvent(Consumer)

setStartTime

void setStartTime(Instant startTime)
Задаёт время начала потока.

Время начала необходимо задать до запуска потока

Параметры:
startTime — время начала, не null
Вызывает исключение:
IllegalStateException — если поток уже запущен
См. также:
  • start()
  • startAsync()

setEndTime

void setEndTime(Instant endTime)
Задаёт время окончания потока.

Время окончания необходимо задать до запуска потока.

По достижении времени окончания поток закрывается.

Параметры:
endTime — время окончания, не null
Вызывает исключение:
IllegalStateException — если поток уже запущен
См. также:
  • start()
  • startAsync()

start

void start()
Запускает обработку действий.

Действия выполняются в текущем потоке.

Чтобы остановить поток, используйте метод close().

Вызывает исключение:
IllegalStateException — если поток уже запущен или закрыт

startAsync

void startAsync()
Запускает асинхронную обработку действий.

Действия выполняются в одном отдельном потоке.

Чтобы остановить поток, используйте метод close().

Вызывает исключение:
IllegalStateException — если поток уже запущен или закрыт

awaitTermination

void awaitTermination(Duration timeout) throws InterruptedException
Блокирует выполнение до тех пор, пока не завершатся все действия, не будет закрыт поток, не истечёт время ожидания или не произойдёт прерывание текущего потока — в зависимости от того, что наступит первым.
Параметры:
timeout — максимальное время ожидания, не null
Вызывает исключение:
IllegalArgumentException — если время ожидания отрицательное
InterruptedException — если ожидание было прервано
См. также:
  • start()
  • startAsync()
  • Thread.interrupt()

awaitTermination

void awaitTermination() throws InterruptedException
Блокирует выполнение до тех пор, пока не завершатся все действия, не будет закрыт поток или не произойдёт прерывание текущего потока — в зависимости от того, что наступит первым.
Вызывает исключение:
InterruptedException — если ожидание было прервано
См. также:
  • start()
  • startAsync()
  • Thread.interrupt()

Сообщить об ошибке или предложить улучшение
Дополнительную справочную информацию по API и документацию для разработчиков см. в разделе Документация Java SE, где представлены более подробные описания для разработчиков, концептуальные обзоры, определения терминов, обходные решения и примеры работающего кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или её аффилированных лиц в США и других странах.
Авторское право © 1993, 2025, Oracle и/или её аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/25/docs/api/jdk.jfr/jdk/jfr/consumer/EventStream.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API