Spec-Zone.ru › OpenJDK 17

Интерфейс 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 - если поток не может быть открыт или при возникновении ошибки ввода-вывода при попытке доступа к репозиторию
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()

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()
END_OF_DOCUMENT_MARKER

© 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

Spec-Zone.ru

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