Класс RemoteRecordingStream
- Все реализуемые интерфейсы:
-
AutoCloseable,EventStream
public final class RemoteRecordingStream extends Object implements EventStream
EventStream, позволяющая сериализовать события через сеть с помощью MBeanServerConnection. Следующий пример демонстрирует запись пауз сборки мусора и использования ЦП на удалённом хосте и вывод событий в стандартный вывод.
String host = "com.example";
int port = 4711;
String url = "service:jmx:rmi:///jndi/rmi://" + host + ":" + port + "/jmxrmi";
JMXServiceURL u = new JMXServiceURL(url);
JMXConnector c = JMXConnectorFactory.connect(u);
MBeanServerConnection conn = c.getMBeanServerConnection();
try (var rs = new RemoteRecordingStream(conn)) {
rs.enable("jdk.GCPhasePause").withoutThreshold();
rs.enable("jdk.CPULoad").withPeriod(Duration.ofSeconds(1));
rs.onEvent("jdk.CPULoad", System.out::println);
rs.onEvent("jdk.GCPhasePause", System.out::println);
rs.start();
}
- Since:
- 16
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
RemoteRecordingStream |
Создаёт поток событий, работающий с MBeanServerConnection, имеющим зарегистрированный FlightRecorderMXBean. |
RemoteRecordingStream |
Создаёт поток событий, работающий с MBeanServerConnection, имеющим зарегистрированный FlightRecorderMXBean. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
void |
awaitTermination() |
Ожидает завершения всех действий, закрытия потока или прерывания текущего потока, в зависимости от того, что произойдёт раньше. |
void |
awaitTermination |
Ожидает завершения всех действий, закрытия потока, истечения таймаута или прерывания текущего потока, в зависимости от того, что произойдёт раньше. |
void |
close() |
Освобождает все ресурсы, связанные с этим потоком. |
EventSettings |
disable |
Отключает событие с указанным именем. |
void |
dump |
Записывает данные записи в файл. |
EventSettings |
enable |
Включает событие с указанным именем. |
void |
onClose |
Регистрирует действие, которое должно выполняться при закрытии потока. |
void |
onError |
Регистрирует действие, которое должно выполняться при возникновении исключения. |
void |
onEvent |
Регистрирует действие, которое должно выполняться для всех событий, соответствующих имени. |
void |
onEvent |
Регистрирует действие, которое должно выполняться для всех событий в потоке. |
void |
onFlush |
Регистрирует действие, которое должно выполняться после того, как поток будет сброшен. |
boolean |
remove |
Отменяет регистрацию действия. |
void |
setEndTime |
Устанавливает конечное время потока. |
void |
setMaxAge |
Определяет, насколько далеко в прошлом хранятся данные для потока. |
void |
setMaxSize |
Определяет, сколько данных хранится для потока. |
void |
setOrdered |
Указывает, что события поступают в хронологическом порядке, отсортированном по времени их добавления в поток. |
void |
setReuse |
Указывает, что объект события в действии EventStream.onEvent(Consumer) может быть повторно использован. |
void |
setSettings |
Заменяет все настройки для этого потока записи. |
void |
setStartTime |
Устанавливает начальное время потока. |
void |
start() |
Запускает обработку действий. |
void |
startAsync() |
Запускает асинхронную обработку действий. |
boolean |
stop() |
Останавливает поток записи. |
Методы, объявленные в классе java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Методы, объявленные в интерфейсе jdk.jfr.consumer.EventStream
onMetadata
Подробное описание конструкторов
RemoteRecordingStream
public RemoteRecordingStream(MBeanServerConnection connection) throws IOException
MBeanServerConnection, в котором зарегистрирован FlightRecorderMXBean. Для настройки параметров событий используйте setSettings(Map).
- Параметры:
-
connection- theMBeanServerConnection, где зарегистрированFlightRecorderMXBean, а неnull - Исключения:
-
IOException- если поток нельзя открыть, произошла ошибка ввода-вывода при попытке доступа к хранилищу илиFlightRecorderMXBean
RemoteRecordingStream
public RemoteRecordingStream(MBeanServerConnection connection, Path directory) throws IOException
MBeanServerConnection, в котором зарегистрирован FlightRecorderMXBean. Для настройки параметров событий используйте setSettings(Map).
- Параметры:
-
connection- theMBeanServerConnection, где зарегистрированFlightRecorderMXBean, а неnull -
directory- каталог для сохранения загружаемых данных событий, а неnull - Исключения:
-
IOException- если поток нельзя открыть, произошла ошибка ввода-вывода при попытке доступа к хранилищу илиFlightRecorderMXBean
Подробное описание методов
setSettings
public void setSettings(Map<String,String> settings)
Следующий пример подключается к удалённому хосту и транслирует события, используя настройки из конфигурации "default".
{
String host = "com.example";
int port = 4711;
String url = "service:jmx:rmi:///jndi/rmi://" + host + ":" + port + "/jmxrmi";
JMXServiceURL u = new JMXServiceURL(url);
JMXConnector c = JMXConnectorFactory.connect(u);
MBeanServerConnection conn = c.getMBeanServerConnection();
try (final var rs = new RemoteRecordingStream(conn)) {
rs.onMetadata(e -> {
for (Configuration c : e.getConfigurations()) {
if (c.getName().equals("default")) {
rs.setSettings(c.getSettings());
}
}
});
rs.onEvent(System.out::println);
rs.start();
}
- Параметры:
-
settings- настройки для установки, а неnull - См. также:
disable
public EventSettings disable(String name)
Если несколько событий имеют одинаковое имя (например, один и тот же класс загружен в разных загрузчиках классов), то все события, соответствующие имени, отключаются.
- Параметры:
-
name- настройки для события, а неnull - Возвращает:
- настройки события для дальнейшей настройки, а не
null
enable
public EventSettings enable(String name)
Если несколько событий имеют одинаковое имя (например, один и тот же класс загружен в разных загрузчиках классов), то все события, соответствующие имени, включаются.
- Параметры:
-
name- настройки для события, а неnull - Возвращает:
- настройки события для дальнейшей настройки, а не
null - См. также:
setMaxAge
public void setMaxAge(Duration maxAge)
Для управления объёмом данных записи, хранящихся на диске, можно указать максимальную длительность хранения данных. Данные, хранящиеся на диске, которые старше указанной длительности времени, удаляются виртуальной машиной Java (JVM).
Если не установлен ни максимальный предел, ни максимальный срок хранения, размер записи может увеличиваться бесконечно, если события не обрабатываются.
- Параметры:
-
maxAge- длительность хранения данных, илиnullдля бесконечного хранения - Исключения:
-
IllegalArgumentException- еслиmaxAgeотрицательное -
IllegalStateException- если запись находится в состоянииCLOSED
setMaxSize
public void setMaxSize(long maxSize)
Для управления объёмом данных записи, хранящихся на диске, можно указать максимальный объём данных для хранения. При превышении максимального предела виртуальная машина Java (JVM) удаляет самый старый фрагмент, чтобы освободить место для более нового фрагмента.
Если не установлен ни максимальный предел, ни максимальный срок хранения, размер записи может увеличиваться бесконечно, если события не обрабатываются.
Размер измеряется в байтах.
- Параметры:
-
maxSize- объём данных для хранения,0для бесконечного хранения - Исключения:
-
IllegalArgumentException- еслиmaxSizeотрицательное -
IllegalStateException- если запись находится в состоянииCLOSED
onEvent
public void onEvent(Consumer<RecordedEvent> action)
EventStream Для выполнения действия на подмножестве типов событий, рассмотрите использование EventStream.onEvent(String, Consumer) и EventStream.onMetadata(Consumer), так как это, скорее всего, более эффективно, чем любой механизм выбора или фильтрации, реализованный в общем действии.
- Указано в:
-
onEventв интерфейсеEventStream - Параметры:
-
action- действие для выполнения для каждогоRecordedEvent, а неnull - См. также:
onEvent
public void onEvent(String eventName, Consumer<RecordedEvent> action)
EventStream- Указано в:
-
onEventв интерфейсеEventStream - Параметры:
-
eventName- имя события, а неnull -
action- действие для выполнения для каждогоRecordedEvent, соответствующего имени события, а неnull
onFlush
public void onFlush(Runnable action)
EventStream- Указано в:
-
onFlushв интерфейсеEventStream - Параметры:
-
action- действие для выполнения после сброса потока, а неnull
onError
public void onError(Consumer<Throwable> action)
EventStreamЕсли действие не зарегистрировано, трассировка стека исключения выводится в стандартный поток ошибок.
Регистрация действия переопределяет стандартное поведение. Если зарегистрировано несколько действий, они выполняются в порядке регистрации.
Если этот метод сам вызывает исключение, поведение неопределённо.
- Указано в:
-
onErrorв интерфейсеEventStream - Параметры:
-
action- действие для выполнения в случае возникновения исключения, а неnull
onClose
public void onClose(Runnable action)
EventStreamЕсли поток уже закрыт, действие будет выполнено немедленно в текущей нити.
- Указано в:
-
onCloseв интерфейсеEventStream - Параметры:
-
action- действие для выполнения после закрытия потока, а неnull - См. также:
закрыть
public void close()
EventStreamЕсли поток запущен, асинхронно или синхронно, он останавливается немедленно или после следующего сброса. Этот метод НЕ ГАРАНТИРУЕТ, что все зарегистрированные действия будут завершены до возврата.
Закрытие ранее закрытого потока не оказывает никакого эффекта.
- Определено в:
-
closeв интерфейсеAutoCloseable - Определено в:
-
closeв интерфейсеEventStream
удалить
public boolean remove(Object action)
EventStreamЕсли действие было зарегистрировано несколько раз, все экземпляры отменяются.
- Определено в:
-
removeв интерфейсеEventStream - Параметры:
-
action- действие для отмены регистрации, неnull - Возвращает:
-
true, если действие было отменено,falseв противном случае - См. также:
установитьПереиспользование
public void setReuse(boolean reuse)
EventStreamEventStream.onEvent(Consumer) может быть повторно использован. Если переиспользование установлено в true, действие не должно сохранять ссылку на объект события после завершения действия.
- Определено в:
-
setReuseв интерфейсеEventStream - Параметры:
-
reuse-true, если объект события может быть повторно использован,falseв противном случае
установитьПорядок
public void setOrdered(boolean ordered)
EventStream- Определено в:
-
setOrderedв интерфейсеEventStream - Параметры:
-
ordered- если объекты событий поступают в хронологическом порядке вEventStream.onEvent(Consumer)
установитьНачальноеВремя
public void setStartTime(Instant startTime)
EventStreamНачальное время должно быть установлено перед запуском потока
- Определено в:
-
setStartTimeв интерфейсеEventStream - Параметры:
-
startTime- начальное время, неnull - См. также:
установитьКонечноеВремя
public void setEndTime(Instant endTime)
EventStreamКонечное время должно быть установлено перед запуском потока.
В конечное время поток закрывается.
- Определено в:
-
setEndTimeв интерфейсеEventStream - Параметры:
-
endTime- конечное время, неnull - См. также:
запустить
public void start()
EventStreamДействия выполняются в текущем потоке.
Чтобы остановить поток, используйте метод EventStream.close().
- Определено в:
-
startв интерфейсеEventStream
запуститьАсинхронно
public void startAsync()
EventStreamДействия выполняются в отдельном потоке.
Чтобы остановить поток, используйте метод EventStream.close().
- Определено в:
-
startAsyncв интерфейсеEventStream
остановить
public boolean stop()
Останавливает запущенный поток и ожидает, пока все события в записи будут обработаны.
Вызов этого метода в действии, например, в методе onEvent(Consumer), может заблокировать поток на неопределенное время. Чтобы прервать поток, используйте метод close().
Следующий фрагмент кода демонстрирует, как этот метод может быть использован совместно с методом startAsync() для отслеживания происходящего во время тестового метода:
AtomicLong bytesWritten = new AtomicLong();
try (var r = new RemoteRecordingStream(connection)) {
r.setMaxSize(Long.MAX_VALUE);
r.enable("jdk.FileWrite").withoutThreshold();
r.onEvent(event ->
bytesWritten.addAndGet(event.getLong("bytesWritten"))
);
r.startAsync();
testFoo();
r.stop();
if (bytesWritten.get() > 1_000_000L) {
r.dump(Path.of("file-write-events.jfr"));
throw new AssertionError("testFoo() writes too much data to disk");
}
}
- Возвращает:
-
trueесли запись остановлена,falseв противном случае - Исключения:
-
IllegalStateException- если запись не запущена или уже остановлена - С:
- 20
dump
public void dump(Path destination) throws IOException
Поток записи должен быть запущен, но не закрыт.
Крайне рекомендуется установить максимальный срок действия или максимальный размер перед запуском потока. В противном случае дамп может не содержать никаких событий.
- Параметры:
-
destination- местоположение, куда записываются данные записи, неnull - Исключения:
-
IOException- если данные записи не могут быть скопированы в указанное местоположение, или если поток закрыт, или не запущен. - С:
- 17
- См. также:
awaitTermination
public void awaitTermination(Duration timeout) throws InterruptedException
EventStream- Определено в:
-
awaitTerminationв интерфейсеEventStream - Параметры:
-
timeout- максимальное время ожидания, неnull - Исключения:
-
InterruptedException- если поток прерван во время ожидания - См. также:
awaitTermination
public void awaitTermination() throws InterruptedException
EventStream- Определено в:
-
awaitTerminationв интерфейсеEventStream - Исключения:
-
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://download.java.net/java/early_access/jdk24/docs/api/jdk.management.jfr/jdk/management/jfr/RemoteRecordingStream.html