Module jdk.jfr
Package jdk.jfr

Class SettingControl

java.lang.Object
jdk.jfr.SettingControl

public abstract class SettingControl extends Object
基类,用于扩展以创建设置控件。

以下示例展示了一个用于正则表达式的设置控件的简单实现:

final class RegExpControl extends SettingControl {
    private Pattern pattern = Pattern.compile(".*");

    @Override
    public void setValue(String value) {
        this.pattern = Pattern.compile(value);
    }

    @Override
    public String combine(Set<String> values) {
        return String.join("|", values);
    }

    @Override
    public String getValue() {
        return pattern.toString();
    }

    public boolean matches(String s) {
        return pattern.matcher(s).find();
    }
}
当设置值发生变化时,通常在录制开始或停止时,会调用setValue(String)getValue()combine(Set<String>)方法。当多个录制同时运行时,会调用combine(Set<String>)方法来确定使用哪个值。

设置控件必须有一个默认构造函数,以便在注册事件时调用。

要将设置控件与事件一起使用,添加一个返回boolean值并以设置控件为参数的方法。使用@SettingDefinition注解该方法。默认情况下,方法名将用作设置名称,但也可以使用@Name注解来显式设置名称。如果方法返回true,则事件将被提交。

建议setValue(String)方法更新一个高效的数据结构,以便在提交事件时可以快速检查。

以下示例展示了如何创建一个使用上述正则表达式过滤器的事件。

abstract class HTTPRequest extends Event {
    @Label("请求URI")
    protected String uri;

    @Label("Servlet URI过滤器")
    @SettingDefinition
    protected boolean uriFilter(RegExpControl regExp) {
        return regExp.matches(uri);
    }
}

@Label("HTTP Get请求")
class HTTPGetRequest extends HTTPRequest {
}

@Label("HTTP Post请求")
class HTTPPostRequest extends HTTPRequest {
}

class ExampleServlet extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
        HTTPGetRequest request = new HTTPGetRequest();
        request.begin();
        request.uri = req.getRequestURI();
        ...
        request.commit();
    }

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
        HTTPPostRequest request = new HTTPPostRequest();
        request.begin();
        request.uri = req.getRequestURI();
        ...
        request.commit();
    }
}

以下示例展示了如何通过为指定的正则表达式分配"uriFilter"设置来筛选事件。

Recording r = new Recording();
r.enable("HTTPGetRequest").with("uriFilter", "https://www.example.com/list/.*");
r.enable("HTTPPostRequest").with("uriFilter", "https://www.example.com/login/.*");
r.start();
自 JDK 9 起:
9
参见:
  • Constructor Details

    • SettingControl

      protected SettingControl()
      由子类构造函数调用的构造函数。
  • Method Details

    • combine

      public abstract String combine(Set<String> settingValues)
      当多个录制同时运行时,将所有运行录制的设置值合并为一个值,

      设置值如何合并的语义取决于实现的设置控件,但所有录制应至少获得它们请求的所有事件。

      此方法不应具有任何副作用,因为调用方可能会缓存值。此方法不应返回null或抛出异常。如果值对于此设置控件无效,则应忽略该值。

      示例:

      如果设置控件表示一个阈值,并且同时有三个录制运行,设置值分别为"10 ms""8 s""1 ms",则此方法返回"1 ms",因为这意味着所有录制至少获得了所有请求的数据。

      如果设置控件表示一组名称,并且同时有两个录制运行,设置值分别为"Smith, Jones""Jones, Williams",则返回值为"Smith, Jones, Williams",因为所有名称都将被接受。

      如果设置控件表示一个布尔条件,并且同时有四个录制运行,设置值分别为"true""false""false""incorrect",则此方法返回"true",因为所有录制至少获得了所有请求的数据。

      参数:
      settingValues - 值集合,不为null
      返回:
      要使用的值,不为null
    • setValue

      public abstract void setValue(String settingValue)
      设置此设置的值。

      如果设置值对于此设置无效,则此方法不会抛出异常。相反,将忽略该值。

      参数:
      settingValue - 字符串值,不为null
    • getValue

      public abstract String getValue()
      返回当前使用的此设置的值,不为null

      此方法返回的值可作为setValue(String)方法和combine(Set)方法的参数。

      当注册事件时调用此方法以获取默认值。因此,在创建此类的实例后立即返回有效值非常重要。不允许返回null

      返回:
      设置值,不为null