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