Интерфейс 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- если поток не может быть открыт или при возникновении ошибки ввода-вывода при попытке доступа к репозиторию -
SecurityException- если менеджер безопасности существует и вызывающий поток не имеетFlightRecorderPermission("accessFlightRecorder")
openRepository
static EventStream openRepository(Path directory) throws IOException
По умолчанию поток начинается с следующего события, записанного Flight Recorder.
- Параметры:
-
directory- расположение репозитория на диске, неnull - Возвращает:
- поток событий, не
null - Издаёт исключение:
-
IOException- если поток не может быть открыт или при возникновении ошибки ввода-вывода при попытке доступа к репозиторию -
SecurityException- если менеджер безопасности существует и его методcheckReadзапрещает чтение каталога или файлов в каталоге.
openFile
static EventStream openFile(Path file) throws IOException
По умолчанию поток начинается с первого события в файле.
- Параметры:
-
file- расположение файла, неnull - Возвращает:
- поток событий, не
null - Издаёт исключение:
-
IOException- если файл не может быть открыт или при возникновении ошибки ввода-вывода во время чтения -
SecurityException- если менеджер безопасности существует и его методcheckReadзапрещает чтение файла
onMetadata
default void onMetadata(Consumer<MetadataEvent> action)
- Требования к реализации:
- По умолчанию реализация этого метода пустая.
- Параметры:
-
action- для выполнения, неnull - Издаёт исключение:
-
IllegalStateException- если действие добавлено после запуска потока
onEvent
void onEvent(Consumer<RecordedEvent> action)
- Параметры:
-
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, 2021, 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/17/docs/api/jdk.jfr/jdk/jfr/consumer/EventStream.html