Spec-Zone.ru › OpenJDK 24

Интерфейс 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(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
Ожидает завершения всех операций, или закрытия потока, или истечения таймаута, или прерывания текущей нити, что произойдёт первым.
Parameters:
timeout - максимальное время ожидания, не null
Throws:
IllegalArgumentException - если таймаут отрицательный
InterruptedException - если ожидание было прервано
See Also:
  • start()
  • startAsync()
  • Thread.interrupt()

awaitTermination

void awaitTermination() throws InterruptedException
Ожидает завершения всех операций, или закрытия потока, или прерывания текущей нити, что произойдёт первым.
Throws:
InterruptedException - если ожидание было прервано
See Also:
  • start()
  • startAsync()
  • Thread.interrupt()

© 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://download.java.net/java/early_access/jdk24/docs/api/jdk.jfr/jdk/jfr/consumer/EventStream.html

Spec-Zone.ru

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