Интерфейс 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 |
Блокирует выполнение до тех пор, пока не завершатся все действия, не будет закрыт поток, не истечёт время ожидания или не произойдёт прерывание текущего потока — в зависимости от того, что наступит первым. |
void |
close() |
Освобождает все ресурсы, связанные с этим потоком. |
void |
onClose |
Регистрирует действие, которое будет выполнено при закрытии потока. |
void |
onError |
Регистрирует действие, которое будет выполнено при возникновении исключения. |
void |
onEvent |
Регистрирует действие, которое будет выполнено для всех событий с заданным именем. |
void |
onEvent |
Регистрирует действие, которое будет выполнено для всех событий в потоке. |
void |
onFlush |
Регистрирует действие, которое будет выполнено после сброса потока. |
default void |
onMetadata |
Регистрирует действие, которое будет выполнено при поступлении в поток новых метаданных. |
static EventStream |
openFile |
Создаёт поток событий из файла. |
static EventStream |
openRepository() |
Создаёт поток из репозитория текущей виртуальной машины Java (JVM). |
static EventStream |
openRepository |
Создаёт поток событий из дискового репозитория. |
boolean |
remove |
Отменяет регистрацию действия. |
void |
setEndTime |
Задаёт время окончания потока. |
void |
setOrdered |
Указывает, что события поступают в хронологическом порядке, отсортированном по времени их фиксации в потоке. |
void |
setReuse |
Указывает, что объект события в действии onEvent(Consumer) можно повторно использовать. |
void |
setStartTime |
Задаёт время начала потока. |
void |
start() |
Запускает обработку действий. |
void |
startAsync() |
Запускает асинхронную обработку действий. |
Подробное описание методов
openRepository
static EventStream openRepository() throws IOException
По умолчанию поток начинается со следующего события, сброшенного 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
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
void close()
Если поток запущен асинхронно или синхронно, он немедленно останавливается либо останавливается после следующего сброса. Этот метод НЕ гарантирует, что все зарегистрированные действия будут завершены до его возврата.
Повторное закрытие уже закрытого потока не оказывает никакого эффекта.
- Определено в:
-
closeв интерфейсеAutoCloseable
remove
boolean remove(Object action)
Если действие было зарегистрировано несколько раз, регистрация отменяется для всех его экземпляров.
- Параметры:
-
action— действие, регистрацию которого нужно отменить, неnull - Возвращает:
-
true, если регистрация действия была отменена, иfalseв противном случае - См. также:
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— если поток уже запущен - См. также:
setEndTime
void setEndTime(Instant endTime)
Время окончания необходимо задать до запуска потока.
По достижении времени окончания поток закрывается.
- Параметры:
-
endTime— время окончания, неnull - Вызывает исключение:
-
IllegalStateException— если поток уже запущен - См. также:
start
void start()
Действия выполняются в текущем потоке.
Чтобы остановить поток, используйте метод close().
- Вызывает исключение:
-
IllegalStateException— если поток уже запущен или закрыт
startAsync
void startAsync()
Действия выполняются в одном отдельном потоке.
Чтобы остановить поток, используйте метод close().
- Вызывает исключение:
-
IllegalStateException— если поток уже запущен или закрыт
awaitTermination
void awaitTermination(Duration timeout) throws InterruptedException
- Параметры:
-
timeout— максимальное время ожидания, неnull - Вызывает исключение:
-
IllegalArgumentException— если время ожидания отрицательное -
InterruptedException— если ожидание было прервано - См. также:
awaitTermination
void awaitTermination() throws InterruptedException
- Вызывает исключение:
-
InterruptedException— если ожидание было прервано - См. также:
© 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