この API ドキュメントでは、Spring Boot アクチュエーターの Web エンドポイントについて説明しています。

1. 概要

先に進む前に、次のトピックを読む必要があります。

以下に記載されている正しい JSON レスポンスを取得するには、Jackson が使用可能である必要があります。

1.1. URL

デフォルトでは、すべての Web エンドポイントは、/actuator/{id} という形式の URL を持つパス /actuator で使用可能です。/actuator ベースパスは、次の例に示すように、management.endpoints.web.base-path プロパティを使用して構成できます。

management.endpoints.web.base-path=/manage

上記の application.properties の例は、エンドポイント URL の形式を /actuator/{id} から /manage/{id} に変更します。例: URL info エンドポイントは /manage/info になります。

1.2. タイムスタンプ

クエリパラメーターとして、またはリクエスト本文でエンドポイントによって消費されるすべてのタイムスタンプは、ISO 8601 [Wikipedia] (英語) で指定されたオフセット日時としてフォーマットする必要があります。

2. イベントの監査 (auditevents)

auditevents エンドポイントは、アプリケーションの監査イベントに関する情報を提供します。

2.1. 監査イベントの取得

監査イベントを取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/auditevents に作成します。

$ curl 'http://localhost:8080/actuator/auditevents?principal=alice&after=2020-05-14T23%3A39%3A35.095Z&type=logout' -i -X GET

前述の例では、UTC タイムゾーンで 2017 年 11 月 7 日に 09:37 の後に発生したプリンシパル alice の logout イベントを取得します。結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 121

{
  "events" : [ {
    "timestamp" : "2020-05-14T23:39:35.095Z",
    "principal" : "alice",
    "type" : "logout"
  } ]
}

2.1.1. クエリパラメーター

エンドポイントはクエリパラメーターを使用して、返すイベントを制限します。次の表は、サポートされているクエリパラメーターを示しています。

パラメーター 説明

after

指定された時間後に発生したイベントにイベントを制限します。オプション。

principal

指定されたプリンシパルを持つイベントにイベントを制限します。オプション。

type

指定された型のイベントにイベントを制限します。オプション。

2.1.2. レスポンス構造

レスポンスには、クエリに一致したすべての監査イベントの詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

events

Array

監査イベントの配列。

events.[].timestamp

String

イベントが発生したときのタイムスタンプ。

events.[].principal

String

イベントをトリガーしたプリンシパル。

events.[].type

String

イベントの型。

3. Bean (beans)

beans エンドポイントは、アプリケーションの Bean に関する情報を提供します。

3.1. Bean の取得

Bean を取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/beans に作成します。

$ curl 'http://localhost:8080/actuator/beans' -i -X GET

結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 1062

{
  "contexts" : {
    "application" : {
      "beans" : {
        "defaultServletHandlerMapping" : {
          "aliases" : [ ],
          "scope" : "singleton",
          "type" : "org.springframework.web.servlet.HandlerMapping",
          "resource" : "class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]",
          "dependencies" : [ ]
        },
        "org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration" : {
          "aliases" : [ ],
          "scope" : "singleton",
          "type" : "org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration",
          "dependencies" : [ ]
        },
        "org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration" : {
          "aliases" : [ ],
          "scope" : "singleton",
          "type" : "org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration",
          "dependencies" : [ ]
        }
      }
    }
  }
}

3.1.1. レスポンス構造

レスポンスには、アプリケーションの Bean の詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

contexts

Object

ID をキーとするアプリケーションコンテキスト。

contexts.*.parentId

String

親アプリケーションコンテキストの ID(存在する場合)。

contexts.*.beans

Object

名前をキーとするアプリケーションコンテキストの Bean。

contexts.*.beans.*.aliases

Array

エイリアスの名前。

contexts.*.beans.*.scope

String

Bean の範囲。

contexts.*.beans.*.type

String

Bean の完全修飾型。

contexts.*.beans.*.resource

String

Bean が定義されたリソース(ある場合)。

contexts.*.beans.*.dependencies

Array

依存関係の名前。

4. キャッシュ (caches)

caches エンドポイントは、アプリケーションのキャッシュへのアクセスを提供します。

4.1. すべてのキャッシュを取得する

アプリケーションのキャッシュを取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/caches に作成します。

$ curl 'http://localhost:8080/actuator/caches' -i -X GET

結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 435

{
  "cacheManagers" : {
    "anotherCacheManager" : {
      "caches" : {
        "countries" : {
          "target" : "java.util.concurrent.ConcurrentHashMap"
        }
      }
    },
    "cacheManager" : {
      "caches" : {
        "cities" : {
          "target" : "java.util.concurrent.ConcurrentHashMap"
        },
        "countries" : {
          "target" : "java.util.concurrent.ConcurrentHashMap"
        }
      }
    }
  }
}

4.1.1. レスポンス構造

レスポンスには、アプリケーションのキャッシュの詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

cacheManagers

Object

ID をキーとするキャッシュマネージャー。

cacheManagers.*.caches

Object

名前をキーとするアプリケーションコンテキストのキャッシュ。

cacheManagers.*.caches.*.target

String

ネイティブキャッシュの完全修飾名。

4.2. 名前によるキャッシュの取得

キャッシュを名前で取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/caches/{name} に作成します。

$ curl 'http://localhost:8080/actuator/caches/cities' -i -X GET

上記の例では、cities という名前のキャッシュに関する情報を取得します。結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 113

{
  "target" : "java.util.concurrent.ConcurrentHashMap",
  "name" : "cities",
  "cacheManager" : "cacheManager"
}

4.2.1. クエリパラメーター

リクエストされた名前が単一のキャッシュを識別するのに十分具体的である場合、追加のパラメーターは必要ありません。それ以外の場合は、cacheManager を指定する必要があります。次の表は、サポートされているクエリパラメーターを示しています。

パラメーター 説明

cacheManager

キャッシュを修飾する cacheManager の名前。キャッシュ名が一意の場合は省略できます。

4.2.2. レスポンス構造

レスポンスには、リクエストされたキャッシュの詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

name

String

キャッシュ名。

cacheManager

String

キャッシュマネージャー名。

target

String

ネイティブキャッシュの完全修飾名。

4.3. すべてのキャッシュを削除する

使用可能なすべてのキャッシュをクリアするには、次の curl ベースの例に示すように、DELETE を /actuator/caches にリクエストします。

$ curl 'http://localhost:8080/actuator/caches' -i -X DELETE

4.4. 名前によるキャッシュの削除

特定のキャッシュを削除するには、次の curl ベースの例に示すように、DELETE を /actuator/caches/{name} にリクエストします。

$ curl 'http://localhost:8080/actuator/caches/countries?cacheManager=anotherCacheManager' -i -X DELETE
countries という名前の 2 つのキャッシュがあるため、Cache をクリアする必要があることを指定するには、cacheManager を提供する必要があります。

4.4.1. リクエスト構造

リクエストされた名前が単一のキャッシュを識別するのに十分具体的である場合、追加のパラメーターは必要ありません。それ以外の場合は、cacheManager を指定する必要があります。次の表は、サポートされているクエリパラメーターを示しています。

パラメーター 説明

cacheManager

キャッシュを修飾する cacheManager の名前。キャッシュ名が一意の場合は省略できます。

5. 条件評価レポート (conditions)

conditions エンドポイントは、構成および自動構成クラスの条件の評価に関する情報を提供します。

5.1. レポートの取得

レポートを取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/conditions に作成します。

$ curl 'http://localhost:8080/actuator/conditions' -i -X GET

結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 3255

{
  "contexts" : {
    "application" : {
      "positiveMatches" : {
        "EndpointAutoConfiguration#endpointOperationParameterMapper" : [ {
          "condition" : "OnBeanCondition",
          "message" : "@ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.invoke.ParameterValueMapper; SearchStrategy: all) did not find any beans"
        } ],
        "EndpointAutoConfiguration#endpointCachingOperationInvokerAdvisor" : [ {
          "condition" : "OnBeanCondition",
          "message" : "@ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.invoker.cache.CachingOperationInvokerAdvisor; SearchStrategy: all) did not find any beans"
        } ],
        "WebEndpointAutoConfiguration" : [ {
          "condition" : "OnWebApplicationCondition",
          "message" : "@ConditionalOnWebApplication (required) found 'session' scope"
        } ]
      },
      "negativeMatches" : {
        "WebFluxEndpointManagementContextConfiguration" : {
          "notMatched" : [ {
            "condition" : "OnWebApplicationCondition",
            "message" : "not a reactive web application"
          } ],
          "matched" : [ {
            "condition" : "OnClassCondition",
            "message" : "@ConditionalOnClass found required classes 'org.springframework.web.reactive.DispatcherHandler', 'org.springframework.http.server.reactive.HttpHandler'"
          } ]
        },
        "GsonHttpMessageConvertersConfiguration.GsonHttpMessageConverterConfiguration" : {
          "notMatched" : [ {
            "condition" : "GsonHttpMessageConvertersConfiguration.PreferGsonOrJacksonAndJsonbUnavailableCondition",
            "message" : "AnyNestedCondition 0 matched 2 did not; NestedCondition on GsonHttpMessageConvertersConfiguration.PreferGsonOrJacksonAndJsonbUnavailableCondition.JacksonJsonbUnavailable NoneNestedConditions 1 matched 1 did not; NestedCondition on GsonHttpMessageConvertersConfiguration.JacksonAndJsonbUnavailableCondition.JsonbPreferred @ConditionalOnProperty (spring.mvc.converters.preferred-json-mapper=jsonb) did not find property 'spring.mvc.converters.preferred-json-mapper'; NestedCondition on GsonHttpMessageConvertersConfiguration.JacksonAndJsonbUnavailableCondition.JacksonAvailable @ConditionalOnBean (types: org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; SearchStrategy: all) found bean 'mappingJackson2HttpMessageConverter'; NestedCondition on GsonHttpMessageConvertersConfiguration.PreferGsonOrJacksonAndJsonbUnavailableCondition.GsonPreferred @ConditionalOnProperty (spring.mvc.converters.preferred-json-mapper=gson) did not find property 'spring.mvc.converters.preferred-json-mapper'"
          } ],
          "matched" : [ ]
        },
        "JsonbHttpMessageConvertersConfiguration" : {
          "notMatched" : [ {
            "condition" : "OnClassCondition",
            "message" : "@ConditionalOnClass did not find required class 'javax.json.bind.Jsonb'"
          } ],
          "matched" : [ ]
        }
      },
      "unconditionalClasses" : [ "org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration", "org.springframework.boot.actuate.autoconfigure.endpoint.EndpointAutoConfiguration" ]
    }
  }
}

5.1.1. レスポンス構造

レスポンスには、アプリケーションの条件評価の詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

contexts

Object

ID をキーとするアプリケーションコンテキスト。

contexts.*.positiveMatches

Object

一致した条件を持つクラスとメソッド。

contexts.*.positiveMatches.*.[].condition

String

条件の名前。

contexts.*.positiveMatches.*.[].message

String

条件が一致した理由の詳細。

contexts.*.negativeMatches

Object

一致しなかった条件を持つクラスとメソッド。

contexts.*.negativeMatches.*.notMatched

Array

一致した条件。

contexts.*.negativeMatches.*.notMatched.[].condition

String

条件の名前。

contexts.*.negativeMatches.*.notMatched.[].message

String

条件が一致しなかった理由の詳細。

contexts.*.negativeMatches.*.matched

Array

一致した条件。

contexts.*.negativeMatches.*.matched.[].condition

String

条件の名前。

contexts.*.negativeMatches.*.matched.[].message

String

条件が一致した理由の詳細。

contexts.*.unconditionalClasses

Array

無条件の自動構成クラスの名前(ある場合)。

contexts.*.parentId

String

親アプリケーションコンテキストの ID(存在する場合)。

6. プロパティの構成 (configprops)

configprops エンドポイントは、アプリケーションの @ConfigurationProperties Bean に関する情報を提供します。

6.1. @ConfigurationProperties Bean の取得

@ConfigurationProperties Bean を取得するには、次の curl ベースの例に示すように、/actuator/configprops に対して GET リクエストを作成します。

$ curl 'http://localhost:8080/actuator/configprops' -i -X GET

結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 2958

{
  "contexts" : {
    "application" : {
      "beans" : {
        "management.endpoints.web.cors-org.springframework.boot.actuate.autoconfigure.endpoint.web.CorsEndpointProperties" : {
          "prefix" : "management.endpoints.web.cors",
          "properties" : {
            "allowedHeaders" : [ ],
            "allowedMethods" : [ ],
            "allowedOrigins" : [ ],
            "maxAge" : "PT30M",
            "exposedHeaders" : [ ]
          },
          "inputs" : {
            "allowedHeaders" : [ ],
            "allowedMethods" : [ ],
            "allowedOrigins" : [ ],
            "maxAge" : { },
            "exposedHeaders" : [ ]
          }
        },
        "management.endpoints.web-org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties" : {
          "prefix" : "management.endpoints.web",
          "properties" : {
            "pathMapping" : { },
            "exposure" : {
              "include" : [ "*" ],
              "exclude" : [ ]
            },
            "basePath" : "/actuator"
          },
          "inputs" : {
            "pathMapping" : { },
            "exposure" : {
              "include" : [ {
                "origin" : "\"management.endpoints.web.exposure.include\" from property source \"Inlined Test Properties\"",
                "value" : "*"
              } ],
              "exclude" : [ ]
            },
            "basePath" : { }
          }
        },
        "spring.resources-org.springframework.boot.autoconfigure.web.ResourceProperties" : {
          "prefix" : "spring.resources",
          "properties" : {
            "addMappings" : true,
            "chain" : {
              "cache" : true,
              "htmlApplicationCache" : false,
              "compressed" : false,
              "strategy" : {
                "fixed" : {
                  "enabled" : false,
                  "paths" : [ "/**" ]
                },
                "content" : {
                  "enabled" : false,
                  "paths" : [ "/**" ]
                }
              }
            },
            "cache" : {
              "cachecontrol" : { }
            },
            "staticLocations" : [ "classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/" ]
          },
          "inputs" : {
            "addMappings" : { },
            "chain" : {
              "cache" : { },
              "htmlApplicationCache" : { },
              "compressed" : { },
              "strategy" : {
                "fixed" : {
                  "enabled" : { },
                  "paths" : [ { } ]
                },
                "content" : {
                  "enabled" : { },
                  "paths" : [ { } ]
                }
              }
            },
            "cache" : {
              "cachecontrol" : { }
            },
            "staticLocations" : [ { }, { }, { }, { } ]
          }
        }
      }
    }
  }
}

6.1.1. レスポンス構造

レスポンスには、アプリケーションの @ConfigurationProperties Bean の詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

contexts

Object

ID をキーとするアプリケーションコンテキスト。

contexts.*.beans.*

Object

@ConfigurationProperties beans keyed by bean name.

contexts.*.beans.*.prefix

String

Bean のプロパティの名前に適用されるプレフィックス。

contexts.*.beans.*.properties

Object

名前と値のペアとしての Bean のプロパティ。

contexts.*.beans.*.inputs

Object

この Bean にバインドするときに使用される構成プロパティの起源と値。

contexts.*.parentId

String

親アプリケーションコンテキストの ID(存在する場合)。

7. 環境 (env)

env エンドポイントは、アプリケーションの Environment に関する情報を提供します。

7.1. 環境全体を取得する

環境全体を取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/env に作成します。

$ curl 'http://localhost:8080/actuator/env' -i -X GET

結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 788

{
  "activeProfiles" : [ ],
  "propertySources" : [ {
    "name" : "systemProperties",
    "properties" : {
      "java.runtime.name" : {
        "value" : "OpenJDK Runtime Environment"
      },
      "java.vm.version" : {
        "value" : "25.252-b09"
      },
      "java.vm.vendor" : {
        "value" : "AdoptOpenJDK"
      }
    }
  }, {
    "name" : "systemEnvironment",
    "properties" : {
      "JAVA_HOME" : {
        "value" : "/opt/openjdk",
        "origin" : "System Environment Property \"JAVA_HOME\""
      }
    }
  }, {
    "name" : "applicationConfig: [classpath:/application.properties]",
    "properties" : {
      "com.example.cache.max-size" : {
        "value" : "1000",
        "origin" : "class path resource [application.properties]:1:29"
      }
    }
  } ]
}

7.1.1. レスポンス構造

レスポンスには、アプリケーションの Environment の詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

activeProfiles

Array

アクティブなプロファイルの名前(ある場合)。

propertySources

Array

優先度順のプロパティソース。

propertySources.[].name

String

プロパティソースの名前。

propertySources.[].properties

Object

プロパティ名をキーとするプロパティソースのプロパティ。

propertySources.[].properties.*.value

String

プロパティの値。

propertySources.[].properties.*.origin

String

プロパティの起源(ある場合)。

7.2. 単一のプロパティを取得する

単一のプロパティを取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/env/{property.name} に作成します。

$ curl 'http://localhost:8080/actuator/env/com.example.cache.max-size' -i -X GET

上記の例では、com.example.cache.max-size という名前のプロパティに関する情報を取得します。結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Disposition: inline;filename=f.txt
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 445

{
  "property" : {
    "source" : "applicationConfig: [classpath:/application.properties]",
    "value" : "1000"
  },
  "activeProfiles" : [ ],
  "propertySources" : [ {
    "name" : "systemProperties"
  }, {
    "name" : "systemEnvironment"
  }, {
    "name" : "applicationConfig: [classpath:/application.properties]",
    "property" : {
      "value" : "1000",
      "origin" : "class path resource [application.properties]:1:29"
    }
  } ]
}

7.2.1. レスポンス構造

レスポンスには、リクエストされたプロパティの詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

property

Object

環境のプロパティ(見つかった場合)。

property.source

String

プロパティのソースの名前。

property.value

String

プロパティの値。

activeProfiles

Array

アクティブなプロファイルの名前(ある場合)。

propertySources

Array

優先度順のプロパティソース。

propertySources.[].name

String

プロパティソースの名前。

propertySources.[].property

Object

プロパティソース内のプロパティ(ある場合)。

propertySources.[].property.value

Varies

プロパティの値。

propertySources.[].property.origin

String

プロパティの起源(ある場合)。

8. Flyway (flyway)

flyway エンドポイントは、Flyway によって実行されるデータベース移行に関する情報を提供します。

8.1. 移行の取得

移行を取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/flyway に作成します。

$ curl 'http://localhost:8080/actuator/flyway' -i -X GET

結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 515

{
  "contexts" : {
    "application" : {
      "flywayBeans" : {
        "flyway" : {
          "migrations" : [ {
            "type" : "SQL",
            "checksum" : -156244537,
            "version" : "1",
            "description" : "init",
            "script" : "V1__init.sql",
            "state" : "SUCCESS",
            "installedBy" : "SA",
            "installedOn" : "2020-05-14T23:39:30.260Z",
            "installedRank" : 1,
            "executionTime" : 2
          } ]
        }
      }
    }
  }
}

8.1.1. レスポンス構造

レスポンスには、アプリケーションの Flyway 移行の詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

contexts

Object

ID をキーとするアプリケーションコンテキスト

contexts.*.flywayBeans.*.migrations

Array

Flyway Bean 名をキーとする、Flyway インスタンスによって実行される移行。

contexts.*.flywayBeans.*.migrations.[].checksum

Number

移行のチェックサム(ある場合)。

contexts.*.flywayBeans.*.migrations.[].description

String

移行の説明(ある場合)。

contexts.*.flywayBeans.*.migrations.[].executionTime

Number

適用された移行のミリ秒単位の実行時間。

contexts.*.flywayBeans.*.migrations.[].installedBy

String

適用された移行をインストールしたユーザー(存在する場合)。

contexts.*.flywayBeans.*.migrations.[].installedOn

String

適用された移行がインストールされたときのタイムスタンプ(ある場合)。

contexts.*.flywayBeans.*.migrations.[].installedRank

Number

適用された移行のランク(ある場合)。後の移行のランクは高くなります。

contexts.*.flywayBeans.*.migrations.[].script

String

移行の実行に使用されるスクリプトの名前(ある場合)。

contexts.*.flywayBeans.*.migrations.[].state

String

移行の状態。(PENDINGABOVE_TARGETBELOW_BASELINEBASELINEIGNOREDMISSING_SUCCESSMISSING_FAILEDSUCCESSUNDONEAVAILABLEFAILEDOUT_OF_ORDERFUTURE_SUCCESSFUTURE_FAILEDOUTDATEDSUPERSEDED)

contexts.*.flywayBeans.*.migrations.[].type

String

移行の型。(SCHEMABASELINESQLUNDO_SQLJDBCUNDO_JDBCSPRING_JDBCUNDO_SPRING_JDBCCUSTOMUNDO_CUSTOM)

contexts.*.flywayBeans.*.migrations.[].version

String

移行を適用した後のデータベースのバージョン(ある場合)。

contexts.*.parentId

String

親アプリケーションコンテキストの ID(存在する場合)。

9. 状態 (health)

health エンドポイントは、アプリケーションの状態に関する詳細情報を提供します。

9.1. アプリケーションの正常性の取得

アプリケーションの正常性を取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/health に作成します。

$ curl 'http://localhost:8080/actuator/health' -i -X GET \
    -H 'Accept: application/json'

結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 704

{
  "status" : "UP",
  "components" : {
    "broker" : {
      "status" : "UP",
      "components" : {
        "us1" : {
          "status" : "UP",
          "details" : {
            "version" : "1.0.2"
          }
        },
        "us2" : {
          "status" : "UP",
          "details" : {
            "version" : "1.0.4"
          }
        }
      }
    },
    "db" : {
      "status" : "UP",
      "details" : {
        "database" : "H2",
        "validationQuery" : "isValid()"
      }
    },
    "diskSpace" : {
      "status" : "UP",
      "details" : {
        "total" : 194686709760,
        "free" : 174531383296,
        "threshold" : 10485760,
        "exists" : true
      }
    }
  }
}

9.1.1. レスポンス構造

レスポンスには、アプリケーションの正常性の詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

status

String

アプリケーションの全体的なステータス。

components

Object

正常性を構成するコンポーネント。

components.*.status

String

アプリケーションの特定の部分のステータス。

components.*.components

Object

正常性を構成するネストされたコンポーネント。

components.*.details

Object

アプリケーションの特定の部分の正常性の詳細。存在は management.endpoint.health.show-details によって制御されます。正常性を構成するネストされたコンポーネントが含まれる場合があります。

上記のレスポンスフィールドは V3 API 用です。V2 JSON を返す必要がある場合は、accept ヘッダーまたは application/vnd.spring-boot.actuator.v2+json を使用する必要があります

9.2. コンポーネントの正常性の取得

アプリケーションのヘルスの特定のコンポーネントのヘルスを取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/health/{component} に送信します。

$ curl 'http://localhost:8080/actuator/health/db' -i -X GET \
    -H 'Accept: application/json'

結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 101

{
  "status" : "UP",
  "details" : {
    "database" : "H2",
    "validationQuery" : "isValid()"
  }
}

9.2.1. レスポンス構造

レスポンスには、アプリケーションの正常性の特定のコンポーネントの正常性の詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

status

String

アプリケーションの特定の部分のステータス

details

Object

アプリケーションの特定の部分の正常性の詳細。

9.3. ネストされたコンポーネントのヘルスを取得する

特定のコンポーネントに他のネストされたコンポーネントが含まれる場合(上記の例の broker インジケーターとして)、次の curl ベースの例に示すように、GET リクエストを /actuator/health/{component}/{subcomponent} に発行することにより、そのようなネストされたコンポーネントのヘルスを取得できます:

$ curl 'http://localhost:8080/actuator/health/broker/us1' -i -X GET \
    -H 'Accept: application/json'

結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 66

{
  "status" : "UP",
  "details" : {
    "version" : "1.0.2"
  }
}

アプリケーションの正常性のコンポーネントは、アプリケーションの正常性インジケーターとそれらがどのようにグループ化されているかに応じて、任意の深さにネストできます。ヘルスエンドポイントは、URL で任意の数の /{component} 識別子をサポートし、任意の深さでコンポーネントのヘルスを取得できるようにします。

9.3.1. レスポンス構造

レスポンスには、アプリケーションの特定のコンポーネントのインスタンスの正常性の詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

status

String

アプリケーションの特定の部分のステータス

details

Object

アプリケーションの特定の部分の正常性の詳細。

10. ヒープダンプ (heapdump)

heapdump エンドポイントは、アプリケーションの JVM からのヒープダンプを提供します。

10.1. ヒープダンプの取得

ヒープダンプを取得するには、GET を /actuator/heapdump にリクエストします。レスポンスは HPROF [Oracle] 形式のバイナリデータであり、大きくなる可能性があります。通常、後続の分析のためにレスポンスをディスクに保存する必要があります。curl を使用する場合、次の例に示すように、-O オプションを使用してこれを実現できます。

$ curl 'http://localhost:8080/actuator/heapdump' -O

上記の例では、heapdump という名前のファイルが現在の作業ディレクトリに書き込まれます。

11. HTTP トレース (httptrace)

httptrace エンドポイントは、HTTP リクエスト / レスポンス交換に関する情報を提供します。

11.1. トレースの取得

トレースを取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/httptrace に作成します。

$ curl 'http://localhost:8080/actuator/httptrace' -i -X GET

結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 503

{
  "traces" : [ {
    "timestamp" : "2020-05-14T23:39:34.175Z",
    "principal" : {
      "name" : "alice"
    },
    "session" : {
      "id" : "39e6f693-8d2d-4ca5-a09d-1a33f9182bd0"
    },
    "request" : {
      "method" : "GET",
      "uri" : "https://api.example.com",
      "headers" : {
        "Accept" : [ "application/json" ]
      }
    },
    "response" : {
      "status" : 200,
      "headers" : {
        "Content-Type" : [ "application/json" ]
      }
    },
    "timeTaken" : 1
  } ]
}

11.1.1. レスポンス構造

レスポンスには、トレースされた HTTP リクエストとレスポンスの交換の詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

traces

Array

トレースされた HTTP リクエスト / レスポンス交換の配列。

traces.[].timestamp

String

トレースされた交換が発生したときのタイムスタンプ。

traces.[].principal

Object

交換のプリンシパル(ある場合)。

traces.[].principal.name

String

プリンシパルの名前。

traces.[].request.method

String

リクエストの HTTP メソッド。

traces.[].request.remoteAddress

String

リクエストが受信されたリモートアドレス(わかっている場合)。

traces.[].request.uri

String

リクエストの URI。

traces.[].request.headers

Object

ヘッダー名でキー付けされたリクエストのヘッダー。

traces.[].request.headers.*.[]

Array

ヘッダーの値

traces.[].response.status

Number

レスポンスのステータス

traces.[].response.headers

Object

ヘッダー名でキー付けされたレスポンスのヘッダー。

traces.[].response.headers.*.[]

Array

ヘッダーの値

traces.[].session

Object

交換に関連付けられたセッション(ある場合)。

traces.[].session.id

String

セッションの ID。

traces.[].timeTaken

Number

交換の処理にかかった時間(ミリ秒)。

12. 情報 (info)

info エンドポイントは、アプリケーションに関する一般情報を提供します。

12.1. 情報を取得する

アプリケーションに関する情報を取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/info に作成します。

$ curl 'http://localhost:8080/actuator/info' -i -X GET

結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 235

{
  "git" : {
    "commit" : {
      "time" : "+52339-03-28T21:10:34Z",
      "id" : "df027cf"
    },
    "branch" : "master"
  },
  "build" : {
    "version" : "1.0.3",
    "artifact" : "application",
    "group" : "com.example"
  }
}

12.1.1. レスポンス構造

レスポンスには、アプリケーションに関する一般情報が含まれています。レスポンスの各セクションは、InfoContributor によって提供されます。Spring Boot は、build および git の貢献を提供します。

レスポンス構造の構築

次の表に、レスポンスの build セクションの構造を示します。

パス タイプ 説明

artifact

String

アプリケーションのアーティファクト ID(ある場合)。

group

String

アプリケーションのグループ ID(ある場合)。

name

String

アプリケーションの名前(ある場合)。

version

String

アプリケーションのバージョン(ある場合)。

time

Varies

アプリケーションが作成されたときのタイムスタンプ(ある場合)。

Git レスポンス構造

次の表に、レスポンスの git セクションの構造を示します。

パス タイプ 説明

branch

String

Git ブランチの名前(ある場合)。

commit

Object

Git コミットの詳細(ある場合)。

commit.time

Varies

コミットのタイムスタンプ(ある場合)。

commit.id

String

コミットの ID(ある場合)。

13. Spring Integration グラフ (integrationgraph)

integrationgraph エンドポイントは、すべての Spring Integration コンポーネントを含むグラフを公開します。

13.1. Spring Integration グラフの取得

アプリケーションに関する情報を取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/integrationgraph に作成します。

$ curl 'http://localhost:8080/actuator/integrationgraph' -i -X GET

結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 969

{
  "contentDescriptor" : {
    "providerVersion" : "5.3.0.RELEASE",
    "providerFormatVersion" : 1.2,
    "provider" : "spring-integration"
  },
  "nodes" : [ {
    "nodeId" : 1,
    "componentType" : "null-channel",
    "integrationPatternType" : "null_channel",
    "integrationPatternCategory" : "messaging_channel",
    "properties" : { },
    "name" : "nullChannel"
  }, {
    "nodeId" : 2,
    "componentType" : "publish-subscribe-channel",
    "integrationPatternType" : "publish_subscribe_channel",
    "integrationPatternCategory" : "messaging_channel",
    "properties" : { },
    "name" : "errorChannel"
  }, {
    "nodeId" : 3,
    "componentType" : "logging-channel-adapter",
    "integrationPatternType" : "outbound_channel_adapter",
    "integrationPatternCategory" : "messaging_endpoint",
    "properties" : { },
    "input" : "errorChannel",
    "name" : "errorLogger"
  } ],
  "links" : [ {
    "from" : 2,
    "to" : 3,
    "type" : "input"
  } ]
}

13.1.1. レスポンス構造

レスポンスには、アプリケーション内で使用されるすべての Spring Integration コンポーネントとそれらの間のリンクが含まれます。構造の詳細については、リファレンスドキュメントを参照してください (英語)

13.2. Spring Integration グラフの再構築

公開されたグラフを再構築するには、次の curl ベースの例に示すように、POST リクエストを /actuator/integrationgraph に作成します。

$ curl 'http://localhost:8080/actuator/integrationgraph' -i -X POST

これにより、204 - No Content レスポンスが発生します。

HTTP/1.1 204 No Content

14. Liquibase (liquibase)

liquibase エンドポイントは、Liquibase によって適用されたデータベース変更セットに関する情報を提供します。

14.1. 変更を取得する

変更を取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/liquibase に作成します。

$ curl 'http://localhost:8080/actuator/liquibase' -i -X GET

結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 688

{
  "contexts" : {
    "application" : {
      "liquibaseBeans" : {
        "liquibase" : {
          "changeSets" : [ {
            "author" : "marceloverdijk",
            "changeLog" : "classpath:/db/changelog/db.changelog-master.yaml",
            "comments" : "",
            "contexts" : [ ],
            "dateExecuted" : "2020-05-14T23:39:33.157Z",
            "deploymentId" : "9499573128",
            "description" : "createTable tableName=customer",
            "execType" : "EXECUTED",
            "id" : "1",
            "labels" : [ ],
            "checksum" : "8:46debf252cce6d7b25e28ddeb9fc4bf6",
            "orderExecuted" : 1
          } ]
        }
      }
    }
  }
}

14.1.1. レスポンス構造

レスポンスには、アプリケーションの Liquibase 変更セットの詳細が含まれます。次の表は、レスポンスの構造を示しています。

パス タイプ 説明

contexts

Object

ID をキーとするアプリケーションコンテキスト

contexts.*.liquibaseBeans.*.changeSets

Array

Bean 名をキーとする、Liquibase Bean によって作成された変更セット。

contexts.*.liquibaseBeans.*.changeSets[].author

String

変更セットの作成者。

contexts.*.liquibaseBeans.*.changeSets[].changeLog

String

変更セットを含む変更ログ。

contexts.*.liquibaseBeans.*.changeSets[].comments

String

変更セットに関するコメント。

contexts.*.liquibaseBeans.*.changeSets[].contexts

Array

変更セットのコンテキスト。

contexts.*.liquibaseBeans.*.changeSets[].dateExecuted

String

変更セットが実行されたときのタイムスタンプ。

contexts.*.liquibaseBeans.*.changeSets[].deploymentId

String

変更セットを実行したデプロイの ID。

contexts.*.liquibaseBeans.*.changeSets[].description

String

変更セットの説明。

contexts.*.liquibaseBeans.*.changeSets[].execType

String

変更セットの実行型(EXECUTEDFAILEDSKIPPEDRERANMARK_RAN)。

contexts.*.liquibaseBeans.*.changeSets[].id

String

変更セットの ID。

contexts.*.liquibaseBeans.*.changeSets[].labels

Array

変更セットに関連付けられたラベル。

contexts.*.liquibaseBeans.*.changeSets[].checksum

String

変更セットのチェックサム。

contexts.*.liquibaseBeans.*.changeSets[].orderExecuted

Number

変更セットの実行順序。

contexts.*.liquibaseBeans.*.changeSets[].tag

String

変更セットに関連付けられているタグ(ある場合)。

contexts.*.parentId

String

親アプリケーションコンテキストの ID(存在する場合)。

15. ログファイル (logfile)

logfile エンドポイントは、アプリケーションのログファイルのコンテンツへのアクセスを提供します。

15.1. ログファイルの取得

ログファイルを取得するには、次の curl ベースの例に示すように、GET を /actuator/logfile にリクエストします。

$ curl 'http://localhost:8080/actuator/logfile' -i -X GET

結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Accept-Ranges: bytes
Content-Type: text/plain;charset=UTF-8
Content-Length: 4723

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::

2017-08-08 17:12:30.910  INFO 19866 --- [           main] s.f.SampleWebFreeMarkerApplication       : Starting SampleWebFreeMarkerApplication on host.local with PID 19866
2017-08-08 17:12:30.913  INFO 19866 --- [           main] s.f.SampleWebFreeMarkerApplication       : No active profile set, falling back to default profiles: default
2017-08-08 17:12:30.952  INFO 19866 --- [           main] ConfigServletWebServerApplicationContext : Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@76b10754: startup date [Tue Aug 08 17:12:30 BST 2017]; root of context hierarchy
2017-08-08 17:12:31.878  INFO 19866 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2017-08-08 17:12:31.889  INFO 19866 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2017-08-08 17:12:31.890  INFO 19866 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.5.16
2017-08-08 17:12:31.978  INFO 19866 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2017-08-08 17:12:31.978  INFO 19866 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1028 ms
2017-08-08 17:12:32.080  INFO 19866 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Mapping servlet: 'dispatcherServlet' to [/]
2017-08-08 17:12:32.084  INFO 19866 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'characterEncodingFilter' to: [/*]
2017-08-08 17:12:32.084  INFO 19866 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2017-08-08 17:12:32.084  INFO 19866 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2017-08-08 17:12:32.084  INFO 19866 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'requestContextFilter' to: [/*]
2017-08-08 17:12:32.349  INFO 19866 --- [           main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@76b10754: startup date [Tue Aug 08 17:12:30 BST 2017]; root of context hierarchy
2017-08-08 17:12:32.420  INFO 19866 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2017-08-08 17:12:32.421  INFO 19866 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
2017-08-08 17:12:32.444  INFO 19866 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-08-08 17:12:32.444  INFO 19866 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-08-08 17:12:32.471  INFO 19866 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-08-08 17:12:32.600  INFO 19866 --- [           main] o.s.w.s.v.f.FreeMarkerConfigurer         : ClassTemplateLoader for Spring macros added to FreeMarker configuration
2017-08-08 17:12:32.681  INFO 19866 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2017-08-08 17:12:32.744  INFO 19866 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http)
2017-08-08 17:12:32.750  INFO 19866 --- [           main] s.f.SampleWebFreeMarkerApplication       : Started SampleWebFreeMarkerApplication in 2.172 seconds (JVM running for 2.479)

15.2. ログファイルの一部を取得する

Jersey を使用する場合、ログファイルの一部の取得はサポートされていません。

ログファイルの一部を取得するには、次の curl ベースの例に示すように、Range ヘッダーを使用して GET リクエストを /actuator/logfile に作成します。

$ curl 'http://localhost:8080/actuator/logfile' -i -X GET \
    -H 'Range: bytes=0-1023'

上記の例は、ログファイルの最初の 1024 バイトを取得します。結果のレスポンスは次のようになります。

HTTP/1.1 206 Partial Content
Accept-Ranges: bytes
Content-Type: text/plain;charset=UTF-8
Content-Range: bytes 0-1023/4723
Content-Length: 1024

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::

2017-08-08 17:12:30.910  INFO 19866 --- [           main] s.f.SampleWebFreeMarkerApplication       : Starting SampleWebFreeMarkerApplication on host.local with PID 19866
2017-08-08 17:12:30.913  INFO 19866 --- [           main] s.f.SampleWebFreeMarkerApplication       : No active profile set, falling back to default profiles: default
2017-08-08 17:12:30.952  INFO 19866 --- [           main] ConfigServletWebServerApplicationContext : Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@76b10754: startup date [Tue Aug 08 17:12:30 BST 2017]; root of context hierarchy
2017-08-08 17:12:31.878  INFO 19866 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(

16. ロガー (loggers)

loggers エンドポイントは、アプリケーションのロガーおよびそのレベルの構成へのアクセスを提供します。

16.1. すべてのロガーの取得

アプリケーションのロガーを取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/loggers に作成します。

$ curl 'http://localhost:8080/actuator/loggers' -i -X GET

結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 791

{
  "levels" : [ "OFF", "FATAL", "ERROR", "WARN", "INFO", "DEBUG", "TRACE" ],
  "loggers" : {
    "ROOT" : {
      "configuredLevel" : "INFO",
      "effectiveLevel" : "INFO"
    },
    "com.example" : {
      "configuredLevel" : "DEBUG",
      "effectiveLevel" : "DEBUG"
    }
  },
  "groups" : {
    "test" : {
      "configuredLevel" : "INFO",
      "members" : [ "test.member1", "test.member2" ]
    },
    "web" : {
      "members" : [ "org.springframework.core.codec", "org.springframework.http", "org.springframework.web", "org.springframework.boot.actuate.endpoint.web", "org.springframework.boot.web.servlet.ServletContextInitializerBeans" ]
    },
    "sql" : {
      "members" : [ "org.springframework.jdbc.core", "org.hibernate.SQL", "org.jooq.tools.LoggerListener" ]
    }
  }
}

16.1.1. レスポンス構造

レスポンスには、アプリケーションのロガーの詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

levels

Array

ロギングシステムによるレベルのサポート。

loggers

Object

名前をキーとするロガー。

groups

Object

名前をキーとするロガーグループ

loggers.*.configuredLevel

String

ロガーの構成レベル(ある場合)。

loggers.*.effectiveLevel

String

ロガーの有効レベル。

groups.*.configuredLevel

String

ロガーグループの設定レベル(ある場合)。

groups.*.members

Array

このグループの一部であるロガー

16.2. 単一のロガーの取得

単一のロガーを取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/loggers/{logger.name} に作成します。

$ curl 'http://localhost:8080/actuator/loggers/com.example' -i -X GET

上記の例では、com.example というロガーに関する情報を取得します。結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Disposition: inline;filename=f.txt
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 61

{
  "configuredLevel" : "INFO",
  "effectiveLevel" : "INFO"
}

16.2.1. レスポンス構造

レスポンスには、リクエストされたロガーの詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

configuredLevel

String

ロガーの構成レベル(ある場合)。

effectiveLevel

String

ロガーの有効レベル。

16.3. 単一グループの取得

単一のグループを取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/loggers/{group.name} に作成します。

$ curl 'http://localhost:8080/actuator/loggers/test' -i -X GET

上記の例は、test という名前のロガーグループに関する情報を取得します。結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 82

{
  "configuredLevel" : "INFO",
  "members" : [ "test.member1", "test.member2" ]
}

16.3.1. レスポンス構造

レスポンスには、リクエストされたグループの詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

configuredLevel

String

ロガーグループの設定レベル(ある場合)。

members

Array

このグループの一部であるロガー

16.4. ログレベルの設定

ロガーのレベルを設定するには、次の curl ベースの例に示すように、ロガーに設定されたレベルを指定する JSON 本文を使用して、POST を /actuator/loggers/{logger.name} にリクエストします。

$ curl 'http://localhost:8080/actuator/loggers/com.example' -i -X POST \
    -H 'Content-Type: application/json' \
    -d '{"configuredLevel":"debug"}'

上記の例では、com.example ロガーの configuredLevel を DEBUG に設定します。

16.4.1. リクエスト構造

リクエストは、ロガーの望ましいレベルを指定します。次の表に、リクエストの構造を示します。

パス タイプ 説明

configuredLevel

String

ロガーのレベル。レベルをクリアするために省略できます。

16.5. グループのログレベルの設定

ロガーのレベルを設定するには、次の curl ベースの例に示すように、ロガーグループに設定されたレベルを指定する JSON ボディを使用して、POST を /actuator/loggers/{group.name} にリクエストします。

$ curl 'http://localhost:8080/actuator/loggers/test' -i -X POST \
    -H 'Content-Type: application/json' \
    -d '{"configuredLevel":"debug"}'

上記の例では、test ロガーグループの configuredLevel を DEBUG に設定します。

16.5.1. リクエスト構造

リクエストは、ロガーグループの目的のレベルを指定します。次の表に、リクエストの構造を示します。

パス タイプ 説明

configuredLevel

String

ロガーのレベル。レベルをクリアするために省略できます。

16.6. ログレベルのクリア

ロガーのレベルをクリアするには、次の curl ベースの例に示すように、空のオブジェクトを含む JSON ボディを使用して POST を /actuator/loggers/{logger.name} にリクエストします。

$ curl 'http://localhost:8080/actuator/loggers/com.example' -i -X POST \
    -H 'Content-Type: application/json' \
    -d '{}'

上記の例は、com.example ロガーの構成済みレベルをクリアします。

17. マッピング (mappings)

mappings エンドポイントは、アプリケーションのリクエストマッピングに関する情報を提供します。

17.1. マッピングの取得

マッピングを取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/mappings に作成します。

$ curl 'http://localhost:40299/actuator/mappings' -i -X GET

結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Transfer-Encoding: chunked
Date: Thu, 14 May 2020 23:39:40 GMT
Content-Length: 5476

{
  "contexts" : {
    "application" : {
      "mappings" : {
        "dispatcherServlets" : {
          "dispatcherServlet" : [ {
            "handler" : "Actuator web endpoint 'mappings'",
            "predicate" : "{GET /actuator/mappings, produces [application/vnd.spring-boot.actuator.v3+json || application/vnd.spring-boot.actuator.v2+json || application/json]}",
            "details" : {
              "handlerMethod" : {
                "className" : "org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping.OperationHandler",
                "name" : "handle",
                "descriptor" : "(Ljavax/servlet/http/HttpServletRequest;Ljava/util/Map;)Ljava/lang/Object;"
              },
              "requestMappingConditions" : {
                "consumes" : [ ],
                "headers" : [ ],
                "methods" : [ "GET" ],
                "params" : [ ],
                "patterns" : [ "/actuator/mappings" ],
                "produces" : [ {
                  "mediaType" : "application/vnd.spring-boot.actuator.v3+json",
                  "negated" : false
                }, {
                  "mediaType" : "application/vnd.spring-boot.actuator.v2+json",
                  "negated" : false
                }, {
                  "mediaType" : "application/json",
                  "negated" : false
                } ]
              }
            }
          }, {
            "handler" : "Actuator root web endpoint",
            "predicate" : "{GET /actuator, produces [application/vnd.spring-boot.actuator.v3+json || application/vnd.spring-boot.actuator.v2+json || application/json]}",
            "details" : {
              "handlerMethod" : {
                "className" : "org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping.WebMvcLinksHandler",
                "name" : "links",
                "descriptor" : "(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)Ljava/lang/Object;"
              },
              "requestMappingConditions" : {
                "consumes" : [ ],
                "headers" : [ ],
                "methods" : [ "GET" ],
                "params" : [ ],
                "patterns" : [ "/actuator" ],
                "produces" : [ {
                  "mediaType" : "application/vnd.spring-boot.actuator.v3+json",
                  "negated" : false
                }, {
                  "mediaType" : "application/vnd.spring-boot.actuator.v2+json",
                  "negated" : false
                }, {
                  "mediaType" : "application/json",
                  "negated" : false
                } ]
              }
            }
          }, {
            "handler" : "org.springframework.boot.actuate.autoconfigure.endpoint.web.documentation.MappingsEndpointServletDocumentationTests$ExampleController#example()",
            "predicate" : "{POST /, params [a!=alpha], headers [X-Custom=Foo], consumes [application/json || !application/xml], produces [text/plain]}",
            "details" : {
              "handlerMethod" : {
                "className" : "org.springframework.boot.actuate.autoconfigure.endpoint.web.documentation.MappingsEndpointServletDocumentationTests.ExampleController",
                "name" : "example",
                "descriptor" : "()Ljava/lang/String;"
              },
              "requestMappingConditions" : {
                "consumes" : [ {
                  "mediaType" : "application/json",
                  "negated" : false
                }, {
                  "mediaType" : "application/xml",
                  "negated" : true
                } ],
                "headers" : [ {
                  "name" : "X-Custom",
                  "value" : "Foo",
                  "negated" : false
                } ],
                "methods" : [ "POST" ],
                "params" : [ {
                  "name" : "a",
                  "value" : "alpha",
                  "negated" : true
                } ],
                "patterns" : [ "/" ],
                "produces" : [ {
                  "mediaType" : "text/plain",
                  "negated" : false
                } ]
              }
            }
          }, {
            "handler" : "ResourceHttpRequestHandler [\"classpath:/META-INF/resources/webjars/\"]",
            "predicate" : "/webjars/**"
          }, {
            "handler" : "ResourceHttpRequestHandler [\"classpath:/META-INF/resources/\", \"classpath:/resources/\", \"classpath:/static/\", \"classpath:/public/\", \"/\"]",
            "predicate" : "/**"
          } ]
        },
        "servletFilters" : [ {
          "servletNameMappings" : [ ],
          "urlPatternMappings" : [ "/*" ],
          "name" : "requestContextFilter",
          "className" : "org.springframework.boot.web.servlet.filter.OrderedRequestContextFilter"
        }, {
          "servletNameMappings" : [ ],
          "urlPatternMappings" : [ "/*" ],
          "name" : "formContentFilter",
          "className" : "org.springframework.boot.web.servlet.filter.OrderedFormContentFilter"
        } ],
        "servlets" : [ {
          "mappings" : [ ],
          "name" : "default",
          "className" : "org.apache.catalina.servlets.DefaultServlet"
        }, {
          "mappings" : [ "/" ],
          "name" : "dispatcherServlet",
          "className" : "org.springframework.web.servlet.DispatcherServlet"
        } ]
      }
    }
  }
}

17.1.1. レスポンス構造

レスポンスには、アプリケーションのマッピングの詳細が含まれます。レスポンスで見つかった項目は、Web アプリケーションの型(リアクティブまたはサーブレットベース)によって異なります。次の表に、レスポンスの一般的な要素の構造を示します。

パス タイプ 説明

contexts

Object

ID をキーとするアプリケーションコンテキスト。

contexts.*.mappings

Object

マッピング型によってキー設定されたコンテキスト内のマッピング。

contexts.*.mappings.dispatcherServlets

Object

ディスパッチャーサーブレットマッピング(ある場合)。

contexts.*.mappings.servletFilters

Array

サーブレットフィルターマッピング(ある場合)。

contexts.*.mappings.servlets

Array

サーブレットマッピング(ある場合)。

contexts.*.mappings.dispatcherHandlers

Object

ディスパッチャーハンドラーマッピング(ある場合)。

contexts.*.parentId

String

親アプリケーションコンテキストの ID(存在する場合)。

contexts.*.mappings で見つかる可能性のあるエントリについては、次のセクションで説明します。

17.1.2. ディスパッチャーサーブレットのレスポンス構造

Spring MVC を使用する場合、レスポンスには contexts.*.mappings.dispatcherServlets にあるすべての DispatcherServlet リクエストマッピングの詳細が含まれます。次の表は、レスポンスのこのセクションの構造を示しています。

パス タイプ 説明

*

Array

ディスパッチャーサーブレットマッピング(ある場合)は、ディスパッチャーサーブレット Bean 名によってキー設定されます。

*.[].details

Object

マッピングに関する追加の実装固有の詳細。オプション。

*.[].handler

String

マッピングのハンドラー。

*.[].predicate

String

マッピングの述語。

*.[].details.handlerMethod

Object

このマッピングへのリクエストを処理するメソッドの詳細(ある場合)。

*.[].details.handlerMethod.className

Varies

メソッドのクラスの完全修飾名。

*.[].details.handlerMethod.name

Varies

メソッドの名前。

*.[].details.handlerMethod.descriptor

Varies

Java 言語仕様で指定されているメソッドの記述子。

*.[].details.requestMappingConditions

Object

リクエストマッピング条件の詳細。

*.[].details.requestMappingConditions.consumes

Varies

消費状態の詳細

*.[].details.requestMappingConditions.consumes.[].mediaType

Varies

消費されたメディア型。

*.[].details.requestMappingConditions.consumes.[].negated

Varies

メディア型が否定されるかどうか。

*.[].details.requestMappingConditions.headers

Varies

ヘッダー条件の詳細。

*.[].details.requestMappingConditions.headers.[].name

Varies

ヘッダーの名前。

*.[].details.requestMappingConditions.headers.[].value

Varies

ヘッダーの必須値(ある場合)。

*.[].details.requestMappingConditions.headers.[].negated

Varies

値が否定されるかどうか。

*.[].details.requestMappingConditions.methods

Varies

処理される HTTP メソッド。

*.[].details.requestMappingConditions.params

Varies

params 条件の詳細。

*.[].details.requestMappingConditions.params.[].name

Varies

パラメーターの名前。

*.[].details.requestMappingConditions.params.[].value

Varies

パラメーターの必須値(ある場合)。

*.[].details.requestMappingConditions.params.[].negated

Varies

値が否定されるかどうか。

*.[].details.requestMappingConditions.patterns

Varies

マッピングによって処理されるパスを識別するパターン。

*.[].details.requestMappingConditions.produces

Varies

生産条件の詳細。

*.[].details.requestMappingConditions.produces.[].mediaType

Varies

作成されたメディア型。

*.[].details.requestMappingConditions.produces.[].negated

Varies

メディア型が否定されるかどうか。

17.1.3. サーブレットのレスポンス構造

サーブレットスタックを使用する場合、レスポンスには contexts.*.mappings.servlets の Servlet マッピングの詳細が含まれます。次の表に、レスポンスのこのセクションの構造を示します。

パス タイプ 説明

[].mappings

Array

サーブレットのマッピング。

[].name

String

サーブレットの名前。

[].className

String

サーブレットのクラス名

17.1.4. サーブレットフィルターのレスポンス構造

サーブレットスタックを使用する場合、レスポンスには contexts.*.mappings.servletFilters の Filter マッピングの詳細が含まれます。次の表に、レスポンスのこのセクションの構造を示します。

パス タイプ 説明

[].servletNameMappings

Array

フィルターがマップされるサーブレットの名前。

[].urlPatternMappings

Array

フィルターがマップされる URL パターン。

[].name

String

フィルターの名前。

[].className

String

フィルターのクラス名

17.1.5. ディスパッチャーハンドラーのレスポンス構造

Spring WebFlux を使用する場合、レスポンスには contexts.*.mappings.dispatcherHandlers の DispatcherHandler リクエストマッピングの詳細が含まれます。次の表に、レスポンスのこのセクションの構造を示します。

パス タイプ 説明

*

Array

ディスパッチャーハンドラー Bean 名をキーとするディスパッチャーハンドラーマッピング(ある場合)。

*.[].details

Object

マッピングに関する追加の実装固有の詳細。オプション。

*.[].handler

String

マッピングのハンドラー。

*.[].predicate

String

マッピングの述語。

*.[].details.requestMappingConditions

Object

リクエストマッピング条件の詳細。

*.[].details.requestMappingConditions.consumes

Array

消費状態の詳細

*.[].details.requestMappingConditions.consumes.[].mediaType

String

消費されたメディア型。

*.[].details.requestMappingConditions.consumes.[].negated

Boolean

メディア型が否定されるかどうか。

*.[].details.requestMappingConditions.headers

Array

ヘッダー条件の詳細。

*.[].details.requestMappingConditions.headers.[].name

String

ヘッダーの名前。

*.[].details.requestMappingConditions.headers.[].value

String

ヘッダーの必須値(ある場合)。

*.[].details.requestMappingConditions.headers.[].negated

Boolean

値が否定されるかどうか。

*.[].details.requestMappingConditions.methods

Array

処理される HTTP メソッド。

*.[].details.requestMappingConditions.params

Array

params 条件の詳細。

*.[].details.requestMappingConditions.params.[].name

String

パラメーターの名前。

*.[].details.requestMappingConditions.params.[].value

String

パラメーターの必須値(ある場合)。

*.[].details.requestMappingConditions.params.[].negated

Boolean

値が否定されるかどうか。

*.[].details.requestMappingConditions.patterns

Array

マッピングによって処理されるパスを識別するパターン。

*.[].details.requestMappingConditions.produces

Array

生産条件の詳細。

*.[].details.requestMappingConditions.produces.[].mediaType

String

作成されたメディア型。

*.[].details.requestMappingConditions.produces.[].negated

Boolean

メディア型が否定されるかどうか。

*.[].details.handlerMethod

Object

このマッピングへのリクエストを処理するメソッドの詳細(ある場合)。

*.[].details.handlerMethod.className

String

メソッドのクラスの完全修飾名。

*.[].details.handlerMethod.name

String

メソッドの名前。

*.[].details.handlerMethod.descriptor

String

Java 言語仕様で指定されているメソッドの記述子。

*.[].details.handlerFunction

Object

このマッピングへのリクエストを処理する関数の詳細(ある場合)。

*.[].details.handlerFunction.className

String

関数のクラスの完全修飾名。

18. メトリクス (metrics)

metrics エンドポイントは、アプリケーションメトリクスへのアクセスを提供します。

18.1. メトリクス名の取得

使用可能なメトリクスの名前を取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/metrics に作成します。

$ curl 'http://localhost:8080/actuator/metrics' -i -X GET

結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 154

{
  "names" : [ "jvm.buffer.count", "jvm.buffer.memory.used", "jvm.buffer.total.capacity", "jvm.memory.committed", "jvm.memory.max", "jvm.memory.used" ]
}

18.1.1. レスポンス構造

レスポンスには、メトリクス名の詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

names

Array

既知のメトリクスの名前。

18.2. メトリクスの取得

メトリクスを取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/metrics/{metric.name} に作成します。

$ curl 'http://localhost:8080/actuator/metrics/jvm.memory.max' -i -X GET

上記の例は、jvm.memory.max という名前のメトリクスに関する情報を取得します。結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Disposition: inline;filename=f.txt
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 474

{
  "name" : "jvm.memory.max",
  "description" : "The maximum amount of memory in bytes that can be used for memory management",
  "baseUnit" : "bytes",
  "measurements" : [ {
    "statistic" : "VALUE",
    "value" : 2.355625983E9
  } ],
  "availableTags" : [ {
    "tag" : "area",
    "values" : [ "heap", "nonheap" ]
  }, {
    "tag" : "id",
    "values" : [ "Compressed Class Space", "PS Old Gen", "PS Survivor Space", "Metaspace", "PS Eden Space", "Code Cache" ]
  } ]
}

18.2.1. クエリパラメーター

エンドポイントは、クエリパラメーターを使用して、タグを使用してメトリクスにドリルダウンします。次の表に、サポートされている単一のクエリパラメーターを示します。

パラメーター 説明

tag

name:value 形式のドリルダウンに使用するタグ。

18.2.2. レスポンス構造

レスポンスには、メトリクスの詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

name

String

メトリクスの名前

description

String

メトリクスの説明

baseUnit

String

メトリクスの基本単位

measurements

Array

メトリクスの測定

measurements[].statistic

String

測定の統計。(TOTALTOTAL_TIMECOUNTMAXVALUEUNKNOWNACTIVE_TASKSDURATION)。

measurements[].value

Number

測定値。

availableTags

Array

ドリルダウンに使用できるタグ。

availableTags[].tag

String

タグの名前。

availableTags[].values

Array

タグの可能な値。

18.3. ドリルダウン

メトリクスにドリルダウンするには、次の curl ベースの例に示すように、tag クエリパラメーターを使用して GET リクエストを /actuator/metrics/{metric.name} に作成します。

$ curl 'http://localhost:8080/actuator/metrics/jvm.memory.max?tag=area%3Anonheap&tag=id%3ACompressed+Class+Space' -i -X GET

上記の例では、jvm.memory.max メトリクスを取得します。area タグの値は nonheap で、id 属性の値は Compressed Class Space です。結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Disposition: inline;filename=f.txt
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 263

{
  "name" : "jvm.memory.max",
  "description" : "The maximum amount of memory in bytes that can be used for memory management",
  "baseUnit" : "bytes",
  "measurements" : [ {
    "statistic" : "VALUE",
    "value" : 1.073741824E9
  } ],
  "availableTags" : [ ]
}

19. Prometheus (prometheus)

prometheus エンドポイントは、Spring Boot アプリケーションのメトリクスを、Prometheus サーバーによるスクレイピングに必要な形式で提供します。

19.1. メトリクスの取得

メトリクスを取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/prometheus に作成します。

$ curl 'http://localhost:8080/actuator/prometheus' -i -X GET

結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: text/plain;version=0.0.4;charset=utf-8
Content-Length: 2370

# HELP jvm_buffer_count_buffers An estimate of the number of buffers in the pool
# TYPE jvm_buffer_count_buffers gauge
jvm_buffer_count_buffers{id="direct",} 12.0
jvm_buffer_count_buffers{id="mapped",} 0.0
# HELP jvm_buffer_memory_used_bytes An estimate of the memory that the Java virtual machine is using for this buffer pool
# TYPE jvm_buffer_memory_used_bytes gauge
jvm_buffer_memory_used_bytes{id="direct",} 434177.0
jvm_buffer_memory_used_bytes{id="mapped",} 0.0
# HELP jvm_memory_max_bytes The maximum amount of memory in bytes that can be used for memory management
# TYPE jvm_memory_max_bytes gauge
jvm_memory_max_bytes{area="heap",id="PS Survivor Space",} 4.194304E7
jvm_memory_max_bytes{area="heap",id="PS Old Gen",} 7.16177408E8
jvm_memory_max_bytes{area="heap",id="PS Eden Space",} 2.74202624E8
jvm_memory_max_bytes{area="nonheap",id="Metaspace",} -1.0
jvm_memory_max_bytes{area="nonheap",id="Code Cache",} 2.5165824E8
jvm_memory_max_bytes{area="nonheap",id="Compressed Class Space",} 1.073741824E9
# HELP jvm_memory_committed_bytes The amount of memory in bytes that is committed for the Java virtual machine to use
# TYPE jvm_memory_committed_bytes gauge
jvm_memory_committed_bytes{area="heap",id="PS Survivor Space",} 4.194304E7
jvm_memory_committed_bytes{area="heap",id="PS Old Gen",} 2.01326592E8
jvm_memory_committed_bytes{area="heap",id="PS Eden Space",} 2.71581184E8
jvm_memory_committed_bytes{area="nonheap",id="Metaspace",} 1.68251392E8
jvm_memory_committed_bytes{area="nonheap",id="Code Cache",} 4.882432E7
jvm_memory_committed_bytes{area="nonheap",id="Compressed Class Space",} 2.4403968E7
# HELP jvm_memory_used_bytes The amount of used memory
# TYPE jvm_memory_used_bytes gauge
jvm_memory_used_bytes{area="heap",id="PS Survivor Space",} 2.0631288E7
jvm_memory_used_bytes{area="heap",id="PS Old Gen",} 8.643396E7
jvm_memory_used_bytes{area="heap",id="PS Eden Space",} 2.50809032E8
jvm_memory_used_bytes{area="nonheap",id="Metaspace",} 1.57194392E8
jvm_memory_used_bytes{area="nonheap",id="Code Cache",} 4.7927552E7
jvm_memory_used_bytes{area="nonheap",id="Compressed Class Space",} 2.221168E7
# HELP jvm_buffer_total_capacity_bytes An estimate of the total capacity of the buffers in this pool
# TYPE jvm_buffer_total_capacity_bytes gauge
jvm_buffer_total_capacity_bytes{id="direct",} 434176.0
jvm_buffer_total_capacity_bytes{id="mapped",} 0.0

20. スケジュールされたタスク (scheduledtasks)

scheduledtasks エンドポイントは、アプリケーションのスケジュールされたタスクに関する情報を提供します。

20.1. スケジュールされたタスクの取得

スケジュールされたタスクを取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/scheduledtasks に作成します。

$ curl 'http://localhost:8080/actuator/scheduledtasks' -i -X GET

結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 628

{
  "cron" : [ {
    "runnable" : {
      "target" : "com.example.Processor.processOrders"
    },
    "expression" : "0 0 0/3 1/1 * ?"
  } ],
  "fixedDelay" : [ {
    "runnable" : {
      "target" : "com.example.Processor.purge"
    },
    "initialDelay" : 5000,
    "interval" : 5000
  } ],
  "fixedRate" : [ {
    "runnable" : {
      "target" : "com.example.Processor.retrieveIssues"
    },
    "initialDelay" : 10000,
    "interval" : 3000
  } ],
  "custom" : [ {
    "runnable" : {
      "target" : "com.example.Processor$CustomTriggeredRunnable"
    },
    "trigger" : "com.example.Processor$CustomTrigger@17f8a5c"
  } ]
}

20.1.1. レスポンス構造

レスポンスには、アプリケーションのスケジュールされたタスクの詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

cron

Array

cron タスク(ある場合)。

cron.[].runnable.target

String

実行されるターゲット。

cron.[].expression

String

cron 式。

fixedDelay

Array

遅延タスクがある場合は修正されました。

fixedDelay.[].runnable.target

String

実行されるターゲット。

fixedDelay.[].initialDelay

Number

最初の実行までの遅延(ミリ秒単位)。

fixedDelay.[].interval

Number

最後の実行の終了から次の実行の開始までの間隔(ミリ秒単位)。

fixedRate

Array

固定レートタスク(ある場合)。

fixedRate.[].runnable.target

String

実行されるターゲット。

fixedRate.[].interval

Number

各実行の開始間の間隔(ミリ秒単位)。

fixedRate.[].initialDelay

Number

最初の実行までの遅延(ミリ秒単位)。

custom

Array

カスタムトリガーがある場合は、タスク。

custom.[].runnable.target

String

実行されるターゲット。

custom.[].trigger

String

タスクのトリガー。

21. セッション (sessions)

sessions エンドポイントは、Spring Session によって管理されるアプリケーションの HTTP セッションに関する情報を提供します。

21.1. セッションの取得

セッションを取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/sessions に作成します。

$ curl 'http://localhost:8080/actuator/sessions?username=alice' -i -X GET

前述の例では、ユーザー名が alice であるユーザーのすべてのセッションを取得します。結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 753

{
  "sessions" : [ {
    "id" : "46aaa4ef-aa50-49f0-abea-7a3eee0cec1e",
    "attributeNames" : [ ],
    "creationTime" : "2020-05-14T21:39:35.123Z",
    "lastAccessedTime" : "2020-05-14T23:39:23.123Z",
    "maxInactiveInterval" : 1800,
    "expired" : false
  }, {
    "id" : "e30930b0-95de-49c7-8a41-c336dda6e9bc",
    "attributeNames" : [ ],
    "creationTime" : "2020-05-14T11:39:35.122Z",
    "lastAccessedTime" : "2020-05-14T23:38:50.122Z",
    "maxInactiveInterval" : 1800,
    "expired" : false
  }, {
    "id" : "4db5efcc-99cb-4d05-a52c-b49acfbb7ea9",
    "attributeNames" : [ ],
    "creationTime" : "2020-05-14T18:39:35.123Z",
    "lastAccessedTime" : "2020-05-14T23:38:58.123Z",
    "maxInactiveInterval" : 1800,
    "expired" : false
  } ]
}

21.1.1. クエリパラメーター

エンドポイントはクエリパラメーターを使用して、返すセッションを制限します。次の表に、単一の必須クエリパラメーターを示します。

パラメーター 説明

username

ユーザーの名前。

21.1.2. レスポンス構造

レスポンスには、一致するセッションの詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

sessions

Array

指定されたユーザー名のセッション。

sessions.[].id

String

セッションの ID。

sessions.[].attributeNames

Array

セッションに保存されている属性の名前。

sessions.[].creationTime

String

セッションが作成されたときのタイムスタンプ。

sessions.[].lastAccessedTime

String

セッションが最後にアクセスされたときのタイムスタンプ。

sessions.[].maxInactiveInterval

Number

セッションが期限切れになるまでの最大非アクティブ期間(秒単位)。

sessions.[].expired

Boolean

セッションの有効期限が切れているかどうか。

21.2. 単一セッションの取得

単一のセッションを取得するには、次の curl ベースの例に示すように、GET リクエストを /actuator/sessions/{id} に作成します。

$ curl 'http://localhost:8080/actuator/sessions/4db5efcc-99cb-4d05-a52c-b49acfbb7ea9' -i -X GET

上記の例は、id が 4db5efcc-99cb-4d05-a52c-b49acfbb7ea9 のセッションを取得します。結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 228

{
  "id" : "4db5efcc-99cb-4d05-a52c-b49acfbb7ea9",
  "attributeNames" : [ ],
  "creationTime" : "2020-05-14T18:39:35.123Z",
  "lastAccessedTime" : "2020-05-14T23:38:58.123Z",
  "maxInactiveInterval" : 1800,
  "expired" : false
}

21.2.1. レスポンス構造

レスポンスには、リクエストされたセッションの詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

id

String

セッションの ID。

attributeNames

Array

セッションに保存されている属性の名前。

creationTime

String

セッションが作成されたときのタイムスタンプ。

lastAccessedTime

String

セッションが最後にアクセスされたときのタイムスタンプ。

maxInactiveInterval

Number

セッションが期限切れになるまでの最大非アクティブ期間(秒単位)。

expired

Boolean

セッションの有効期限が切れているかどうか。

21.3. セッションを削除する

セッションを削除するには、次の curl ベースの例に示すように、DELETE リクエストを /actuator/sessions/{id} に作成します。

$ curl 'http://localhost:8080/actuator/sessions/4db5efcc-99cb-4d05-a52c-b49acfbb7ea9' -i -X DELETE

上記の例は、id が 4db5efcc-99cb-4d05-a52c-b49acfbb7ea9 であるセッションを削除します。

22. シャットダウン (shutdown)

shutdown エンドポイントは、アプリケーションをシャットダウンするために使用されます。

22.1. アプリケーションのシャットダウン

アプリケーションをシャットダウンするには、次の curl ベースの例に示すように、POST を /actuator/shutdown にリクエストします。

$ curl 'http://localhost:8080/actuator/shutdown' -i -X POST

次のようなレスポンスが生成されます。

HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 41

{
  "message" : "Shutting down, bye..."
}

22.1.1. レスポンス構造

レスポンスには、シャットダウンリクエストの結果の詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

message

String

リクエストの結果を説明するメッセージ。

23. スレッドダンプ (threaddump)

threaddump エンドポイントは、アプリケーションの JVM からのスレッドダンプを提供します。

23.1. スレッドダンプを JSON として取得する

スレッドダンプを JSON として取得するには、次の curl ベースの例に示すように、適切な Accept ヘッダーを使用して GET リクエストを /actuator/threaddump に作成します。

$ curl 'http://localhost:8080/actuator/threaddump' -i -X GET \
    -H 'Accept: application/json'

結果のレスポンスは次のようになります。

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 7535

{
  "threads" : [ {
    "threadName" : "Thread-2985",
    "threadId" : 3598,
    "blockedTime" : -1,
    "blockedCount" : 0,
    "waitedTime" : -1,
    "waitedCount" : 1,
    "lockName" : "java.util.concurrent.CountDownLatch$Sync@2a0c822c",
    "lockOwnerId" : -1,
    "inNative" : false,
    "suspended" : false,
    "threadState" : "WAITING",
    "stackTrace" : [ {
      "methodName" : "park",
      "fileName" : "Unsafe.java",
      "lineNumber" : -2,
      "className" : "sun.misc.Unsafe",
      "nativeMethod" : true
    }, {
      "methodName" : "park",
      "fileName" : "LockSupport.java",
      "lineNumber" : 175,
      "className" : "java.util.concurrent.locks.LockSupport",
      "nativeMethod" : false
    }, {
      "methodName" : "parkAndCheckInterrupt",
      "fileName" : "AbstractQueuedSynchronizer.java",
      "lineNumber" : 836,
      "className" : "java.util.concurrent.locks.AbstractQueuedSynchronizer",
      "nativeMethod" : false
    }, {
      "methodName" : "doAcquireSharedInterruptibly",
      "fileName" : "AbstractQueuedSynchronizer.java",
      "lineNumber" : 997,
      "className" : "java.util.concurrent.locks.AbstractQueuedSynchronizer",
      "nativeMethod" : false
    }, {
      "methodName" : "acquireSharedInterruptibly",
      "fileName" : "AbstractQueuedSynchronizer.java",
      "lineNumber" : 1304,
      "className" : "java.util.concurrent.locks.AbstractQueuedSynchronizer",
      "nativeMethod" : false
    }, {
      "methodName" : "await",
      "fileName" : "CountDownLatch.java",
      "lineNumber" : 231,
      "className" : "java.util.concurrent.CountDownLatch",
      "nativeMethod" : false
    }, {
      "methodName" : "lambda$jsonThreadDump$0",
      "fileName" : "ThreadDumpEndpointDocumentationTests.java",
      "lineNumber" : 56,
      "className" : "org.springframework.boot.actuate.autoconfigure.endpoint.web.documentation.ThreadDumpEndpointDocumentationTests",
      "nativeMethod" : false
    }, {
      "methodName" : "run",
      "lineNumber" : -1,
      "className" : "org.springframework.boot.actuate.autoconfigure.endpoint.web.documentation.ThreadDumpEndpointDocumentationTests$$Lambda$2935/334838288",
      "nativeMethod" : false
    }, {
      "methodName" : "run",
      "fileName" : "Thread.java",
      "lineNumber" : 748,
      "className" : "java.lang.Thread",
      "nativeMethod" : false
    } ],
    "lockedMonitors" : [ ],
    "lockedSynchronizers" : [ {
      "className" : "java.util.concurrent.locks.ReentrantLock$NonfairSync",
      "identityHashCode" : 269684612
    } ],
    "lockInfo" : {
      "className" : "java.util.concurrent.CountDownLatch$Sync",
      "identityHashCode" : 705462828
    }
  }, {
    "threadName" : "http-nio-auto-28-Acceptor",
    "threadId" : 3550,
    "blockedTime" : -1,
    "blockedCount" : 0,
    "waitedTime" : -1,
    "waitedCount" : 0,
    "lockOwnerId" : -1,
    "inNative" : true,
    "suspended" : false,
    "threadState" : "RUNNABLE",
    "stackTrace" : [ {
      "methodName" : "accept0",
      "fileName" : "ServerSocketChannelImpl.java",
      "lineNumber" : -2,
      "className" : "sun.nio.ch.ServerSocketChannelImpl",
      "nativeMethod" : true
    }, {
      "methodName" : "accept",
      "fileName" : "ServerSocketChannelImpl.java",
      "lineNumber" : 419,
      "className" : "sun.nio.ch.ServerSocketChannelImpl",
      "nativeMethod" : false
    }, {
      "methodName" : "accept",
      "fileName" : "ServerSocketChannelImpl.java",
      "lineNumber" : 247,
      "className" : "sun.nio.ch.ServerSocketChannelImpl",
      "nativeMethod" : false
    }, {
      "methodName" : "serverSocketAccept",
      "fileName" : "NioEndpoint.java",
      "lineNumber" : 469,
      "className" : "org.apache.tomcat.util.net.NioEndpoint",
      "nativeMethod" : false
    }, {
      "methodName" : "serverSocketAccept",
      "fileName" : "NioEndpoint.java",
      "lineNumber" : 71,
      "className" : "org.apache.tomcat.util.net.NioEndpoint",
      "nativeMethod" : false
    }, {
      "methodName" : "run",
      "fileName" : "Acceptor.java",
      "lineNumber" : 95,
      "className" : "org.apache.tomcat.util.net.Acceptor",
      "nativeMethod" : false
    }, {
      "methodName" : "run",
      "fileName" : "Thread.java",
      "lineNumber" : 748,
      "className" : "java.lang.Thread",
      "nativeMethod" : false
    } ],
    "lockedMonitors" : [ {
      "className" : "java.lang.Object",
      "identityHashCode" : 968329834,
      "lockedStackDepth" : 2,
      "lockedStackFrame" : {
        "methodName" : "accept",
        "fileName" : "ServerSocketChannelImpl.java",
        "lineNumber" : 247,
        "className" : "sun.nio.ch.ServerSocketChannelImpl",
        "nativeMethod" : false
      }
    } ],
    "lockedSynchronizers" : [ ]
  }, {
    "threadName" : "http-nio-auto-28-ClientPoller",
    "threadId" : 3549,
    "blockedTime" : -1,
    "blockedCount" : 0,
    "waitedTime" : -1,
    "waitedCount" : 0,
    "lockOwnerId" : -1,
    "inNative" : true,
    "suspended" : false,
    "threadState" : "RUNNABLE",
    "stackTrace" : [ {
      "methodName" : "epollWait",
      "fileName" : "EPollArrayWrapper.java",
      "lineNumber" : -2,
      "className" : "sun.nio.ch.EPollArrayWrapper",
      "nativeMethod" : true
    }, {
      "methodName" : "poll",
      "fileName" : "EPollArrayWrapper.java",
      "lineNumber" : 269,
      "className" : "sun.nio.ch.EPollArrayWrapper",
      "nativeMethod" : false
    }, {
      "methodName" : "doSelect",
      "fileName" : "EPollSelectorImpl.java",
      "lineNumber" : 93,
      "className" : "sun.nio.ch.EPollSelectorImpl",
      "nativeMethod" : false
    }, {
      "methodName" : "lockAndDoSelect",
      "fileName" : "SelectorImpl.java",
      "lineNumber" : 86,
      "className" : "sun.nio.ch.SelectorImpl",
      "nativeMethod" : false
    }, {
      "methodName" : "select",
      "fileName" : "SelectorImpl.java",
      "lineNumber" : 97,
      "className" : "sun.nio.ch.SelectorImpl",
      "nativeMethod" : false
    }, {
      "methodName" : "run",
      "fileName" : "NioEndpoint.java",
      "lineNumber" : 709,
      "className" : "org.apache.tomcat.util.net.NioEndpoint$Poller",
      "nativeMethod" : false
    }, {
      "methodName" : "run",
      "fileName" : "Thread.java",
      "lineNumber" : 748,
      "className" : "java.lang.Thread",
      "nativeMethod" : false
    } ],
    "lockedMonitors" : [ {
      "className" : "sun.nio.ch.Util$3",
      "identityHashCode" : 2026559947,
      "lockedStackDepth" : 3,
      "lockedStackFrame" : {
        "methodName" : "lockAndDoSelect",
        "fileName" : "SelectorImpl.java",
        "lineNumber" : 86,
        "className" : "sun.nio.ch.SelectorImpl",
        "nativeMethod" : false
      }
    }, {
      "className" : "java.util.Collections$UnmodifiableSet",
      "identityHashCode" : 976911721,
      "lockedStackDepth" : 3,
      "lockedStackFrame" : {
        "methodName" : "lockAndDoSelect",
        "fileName" : "SelectorImpl.java",
        "lineNumber" : 86,
        "className" : "sun.nio.ch.SelectorImpl",
        "nativeMethod" : false
      }
    }, {
      "className" : "sun.nio.ch.EPollSelectorImpl",
      "identityHashCode" : 143151187,
      "lockedStackDepth" : 3,
      "lockedStackFrame" : {
        "methodName" : "lockAndDoSelect",
        "fileName" : "SelectorImpl.java",
        "lineNumber" : 86,
        "className" : "sun.nio.ch.SelectorImpl",
        "nativeMethod" : false
      }
    } ],
    "lockedSynchronizers" : [ ]
  } ]
}

23.1.1. レスポンス構造

レスポンスには、JVM のスレッドの詳細が含まれます。次の表に、レスポンスの構造を示します。

パス タイプ 説明

threads

Array

JVM のスレッド。

threads.[].blockedCount

Number

スレッドがブロックされた合計回数。

threads.[].blockedTime

Number

スレッドがブロックに費やした時間(ミリ秒)。スレッド競合監視を無効にする場合は -1。

threads.[].daemon

Boolean

スレッドがデーモンスレッドかどうか。Java 9 以降でのみ利用可能。

threads.[].inNative

Boolean

スレッドがネイティブコードを実行しているかどうか。

threads.[].lockName

String

スレッドがブロックされているオブジェクトの説明(ある場合)。

threads.[].lockInfo

Object

スレッドが待機をブロックされているオブジェクト。

threads.[].lockInfo.className

String

ロックオブジェクトの完全修飾クラス名。

threads.[].lockInfo.identityHashCode

Number

ロックオブジェクトの ID ハッシュコード。

threads.[].lockedMonitors

Array

このスレッドによってロックされているモニター(ある場合)

threads.[].lockedMonitors.[].className

String

ロックオブジェクトのクラス名。

threads.[].lockedMonitors.[].identityHashCode

Number

ロックオブジェクトの ID ハッシュコード。

threads.[].lockedMonitors.[].lockedStackDepth

Number

モニターがロックされたスタックの深さ。

threads.[].lockedMonitors.[].lockedStackFrame

Object

モニターをロックしたスタックフレーム。

threads.[].lockedSynchronizers

Array

このスレッドによってロックされたシンクロナイザー。

threads.[].lockedSynchronizers.[].className

String

ロックされたシンクロナイザーのクラス名。

threads.[].lockedSynchronizers.[].identityHashCode

Number

ロックされたシンクロナイザーの ID ハッシュコード。

threads.[].lockOwnerId

Number

スレッドがブロックされているオブジェクトを所有するスレッドの ID。スレッドがブロックされていない場合は、-1

threads.[].lockOwnerName

String

スレッドがブロックされているオブジェクトがある場合、そのオブジェクトを所有するスレッドの名前。

threads.[].priority

Number

スレッドの優先度。Java 9 以降でのみ利用可能。

threads.[].stackTrace

Array

スレッドのスタックトレース。

threads.[].stackTrace.[].classLoaderName

String

存在する場合、このエントリによって識別される実行ポイントを含むクラスのクラスローダーの名前。Java 9 以降でのみ利用可能。

threads.[].stackTrace.[].className

String

このエントリで識別される実行ポイントを含むクラスの名前。

threads.[].stackTrace.[].fileName

String

このエントリによって識別される実行ポイントがある場合、それを含むソースファイルの名前。

threads.[].stackTrace.[].lineNumber

Number

このエントリによって識別される実行ポイントの行番号。不明な場合は負。

threads.[].stackTrace.[].methodName

String

メソッドの名前。

threads.[].stackTrace.[].moduleName

String

このエントリで識別される実行ポイントがある場合、その実行ポイントを含むモジュールの名前。Java 9 以降でのみ利用可能。

threads.[].stackTrace.[].moduleVersion

String

このエントリで識別される実行ポイントがある場合、そのバージョンを含むモジュールのバージョン。Java 9 以降でのみ利用可能。

threads.[].stackTrace.[].nativeMethod

Boolean

実行ポイントがネイティブメソッドであるかどうか。

threads.[].suspended

Boolean

スレッドが中断されているかどうか。

threads.[].threadId

Number

スレッドの ID。

threads.[].threadName

String

スレッドの名前。

threads.[].threadState

String

スレッドの状態(NEWRUNNABLEBLOCKEDWAITINGTIMED_WAITINGTERMINATED)。

threads.[].waitedCount

Number

スレッドが通知を待機した合計回数。

threads.[].waitedTime

Number

スレッドが待機に費やした時間(ミリ秒)。-1 スレッド競合監視が無効になっている場合

23.2. スレッドダンプをテキストとして取得する

スレッドダンプをテキストとして取得するには、次の curl ベースの例に示すように、text/plain を受け入れる /actuator/threaddump に GET リクエストを行います。

$ curl 'http://localhost:8080/actuator/threaddump' -i -X GET \
    -H 'Accept: text/plain'

結果のレスポンスは次のようになります。

 HTTP/1.1 200 OK Content-Type: text/plain;charset=UTF-8 Content-Length: 47476 2020-05-14 23:39:41 Full thread dump OpenJDK 64-Bit Server VM (25.252-b09 mixed mode): "http-nio-auto-28-Acceptor" - Thread t@3550 java.lang.Thread.State: RUNNABLE at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method) at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:419) at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:247) - locked <39b78a6a> (a java.lang.Object) at org.apache.tomcat.util.net.NioEndpoint.serverSocketAccept(NioEndpoint.java:469) at org.apache.tomcat.util.net.NioEndpoint.serverSocketAccept(NioEndpoint.java:71) at org.apache.tomcat.util.net.Acceptor.run(Acceptor.java:95) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "http-nio-auto-28-ClientPoller" - Thread t@3549 java.lang.Thread.State: RUNNABLE at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method) at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269) at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:93) at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86) - locked <78cad9cb> (a sun.nio.ch.Util$3) - locked <3a3a7d69> (a java.util.Collections$UnmodifiableSet) - locked <8885053> (a sun.nio.ch.EPollSelectorImpl) at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97) at org.apache.tomcat.util.net.NioEndpoint$Poller.run(NioEndpoint.java:709) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "http-nio-auto-28-exec-10" - Thread t@3548 java.lang.Thread.State: WAITING at sun.misc.Unsafe.park(Native Method) - parking to wait for <de97ff2> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:107) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "http-nio-auto-28-exec-9" - Thread t@3547 java.lang.Thread.State: WAITING at sun.misc.Unsafe.park(Native Method) - parking to wait for <de97ff2> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:107) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "http-nio-auto-28-exec-8" - Thread t@3546 java.lang.Thread.State: WAITING at sun.misc.Unsafe.park(Native Method) - parking to wait for <de97ff2> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:107) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "http-nio-auto-28-exec-7" - Thread t@3545 java.lang.Thread.State: WAITING at sun.misc.Unsafe.park(Native Method) - parking to wait for <de97ff2> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:107) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "http-nio-auto-28-exec-6" - Thread t@3544 java.lang.Thread.State: WAITING at sun.misc.Unsafe.park(Native Method) - parking to wait for <de97ff2> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:107) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "http-nio-auto-28-exec-5" - Thread t@3543 java.lang.Thread.State: WAITING at sun.misc.Unsafe.park(Native Method) - parking to wait for <de97ff2> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:107) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "http-nio-auto-28-exec-4" - Thread t@3542 java.lang.Thread.State: WAITING at sun.misc.Unsafe.park(Native Method) - parking to wait for <de97ff2> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:107) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "http-nio-auto-28-exec-3" - Thread t@3541 java.lang.Thread.State: WAITING at sun.misc.Unsafe.park(Native Method) - parking to wait for <de97ff2> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:107) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "http-nio-auto-28-exec-2" - Thread t@3540 java.lang.Thread.State: WAITING at sun.misc.Unsafe.park(Native Method) - parking to wait for <de97ff2> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:107) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "http-nio-auto-28-exec-1" - Thread t@3539 java.lang.Thread.State: WAITING at sun.misc.Unsafe.park(Native Method) - parking to wait for <de97ff2> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:107) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "http-nio-auto-28-BlockPoller" - Thread t@3538 java.lang.Thread.State: RUNNABLE at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method) at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269) at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:93) at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86) - locked <2343fb05> (a sun.nio.ch.Util$3) - locked <4afb0b31> (a java.util.Collections$UnmodifiableSet) - locked <3bd0f5> (a sun.nio.ch.EPollSelectorImpl) at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97) at org.apache.tomcat.util.net.NioBlockingSelector$BlockPoller.run(NioBlockingSelector.java:313) Locked ownable synchronizers: - None "Catalina-utility-2" - Thread t@3537 java.lang.Thread.State: WAITING at sun.misc.Unsafe.park(Native Method) - parking to wait for <466b29ef> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1088) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "container-0" - Thread t@3536 java.lang.Thread.State: TIMED_WAITING at java.lang.Thread.sleep(Native Method) at org.apache.catalina.core.StandardServer.await(StandardServer.java:570) at org.springframework.boot.web.embedded.tomcat.TomcatWebServer$1.run(TomcatWebServer.java:197) Locked ownable synchronizers: - None "Catalina-utility-1" - Thread t@3535 java.lang.Thread.State: TIMED_WAITING at sun.misc.Unsafe.park(Native Method) - parking to wait for <466b29ef> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "HikariPool-1 connection adder" - Thread t@3443 java.lang.Thread.State: TIMED_WAITING at sun.misc.Unsafe.park(Native Method) - parking to wait for <7a4c69f4> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078) at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:467) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1073) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "HikariPool-1 housekeeper" - Thread t@3442 java.lang.Thread.State: TIMED_WAITING at sun.misc.Unsafe.park(Native Method) - parking to wait for <68fc570f> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "server" - Thread t@3138 java.lang.Thread.State: WAITING at sun.misc.Unsafe.park(Native Method) - parking to wait for <369e8e9d> (a java.util.concurrent.CountDownLatch$Sync) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836) at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:997) at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1304) at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:231) at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:87) at reactor.core.publisher.Mono.block(Mono.java:1678) at org.springframework.boot.web.embedded.netty.NettyWebServer$1.run(NettyWebServer.java:160) Locked ownable synchronizers: - None "pool-14-thread-1" - Thread t@3100 java.lang.Thread.State: RUNNABLE at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "reactor-http-epoll-8" - Thread t@2383 java.lang.Thread.State: RUNNABLE at io.netty.channel.epoll.Native.epollWait(Native Method) at io.netty.channel.epoll.Native.epollWait(Native.java:148) at io.netty.channel.epoll.Native.epollWait(Native.java:141) at io.netty.channel.epoll.EpollEventLoop.epollWaitNoTimerChange(EpollEventLoop.java:290) at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:347) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "reactor-http-epoll-7" - Thread t@2382 java.lang.Thread.State: RUNNABLE at io.netty.channel.epoll.Native.epollWait(Native Method) at io.netty.channel.epoll.Native.epollWait(Native.java:148) at io.netty.channel.epoll.Native.epollWait(Native.java:141) at io.netty.channel.epoll.EpollEventLoop.epollWaitNoTimerChange(EpollEventLoop.java:290) at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:347) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "reactor-http-epoll-6" - Thread t@2381 java.lang.Thread.State: RUNNABLE at io.netty.channel.epoll.Native.epollWait(Native Method) at io.netty.channel.epoll.Native.epollWait(Native.java:148) at io.netty.channel.epoll.Native.epollWait(Native.java:141) at io.netty.channel.epoll.EpollEventLoop.epollWaitNoTimerChange(EpollEventLoop.java:290) at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:347) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "reactor-http-epoll-5" - Thread t@2380 java.lang.Thread.State: RUNNABLE at io.netty.channel.epoll.Native.epollWait(Native Method) at io.netty.channel.epoll.Native.epollWait(Native.java:148) at io.netty.channel.epoll.Native.epollWait(Native.java:141) at io.netty.channel.epoll.EpollEventLoop.epollWaitNoTimerChange(EpollEventLoop.java:290) at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:347) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "reactor-http-epoll-4" - Thread t@2379 java.lang.Thread.State: RUNNABLE at io.netty.channel.epoll.Native.epollWait(Native Method) at io.netty.channel.epoll.Native.epollWait(Native.java:148) at io.netty.channel.epoll.Native.epollWait(Native.java:141) at io.netty.channel.epoll.EpollEventLoop.epollWaitNoTimerChange(EpollEventLoop.java:290) at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:347) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "reactor-http-epoll-3" - Thread t@2378 java.lang.Thread.State: RUNNABLE at io.netty.channel.epoll.Native.epollWait(Native Method) at io.netty.channel.epoll.Native.epollWait(Native.java:148) at io.netty.channel.epoll.Native.epollWait(Native.java:141) at io.netty.channel.epoll.EpollEventLoop.epollWaitNoTimerChange(EpollEventLoop.java:290) at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:347) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "reactor-http-epoll-2" - Thread t@2377 java.lang.Thread.State: RUNNABLE at io.netty.channel.epoll.Native.epollWait(Native Method) at io.netty.channel.epoll.Native.epollWait(Native.java:148) at io.netty.channel.epoll.Native.epollWait(Native.java:141) at io.netty.channel.epoll.EpollEventLoop.epollWaitNoTimerChange(EpollEventLoop.java:290) at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:347) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "reactor-http-epoll-1" - Thread t@2376 java.lang.Thread.State: RUNNABLE at io.netty.channel.epoll.Native.epollWait(Native Method) at io.netty.channel.epoll.Native.epollWait(Native.java:148) at io.netty.channel.epoll.Native.epollWait(Native.java:141) at io.netty.channel.epoll.EpollEventLoop.epollWaitNoTimerChange(EpollEventLoop.java:290) at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:347) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "nioEventLoopGroup-4-1" - Thread t@1570 java.lang.Thread.State: RUNNABLE at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method) at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269) at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:93) at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86) - locked <29a5fdf0> (a io.netty.channel.nio.SelectedSelectionKeySet) - locked <303f32f9> (a java.util.Collections$UnmodifiableSet) - locked <3a714fde> (a sun.nio.ch.EPollSelectorImpl) at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97) at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:101) at io.netty.channel.nio.SelectedSelectionKeySetSelector.select(SelectedSelectionKeySetSelector.java:68) at io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:803) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:457) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "nioEventLoopGroup-2-1" - Thread t@909 java.lang.Thread.State: RUNNABLE at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method) at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269) at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:93) at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86) - locked <7859d46b> (a io.netty.channel.nio.SelectedSelectionKeySet) - locked <7e15eced> (a java.util.Collections$UnmodifiableSet) - locked <37f4b12c> (a sun.nio.ch.EPollSelectorImpl) at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97) at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:101) at io.netty.channel.nio.SelectedSelectionKeySetSelector.select(SelectedSelectionKeySetSelector.java:68) at io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:803) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:457) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "boundedElastic-1" - Thread t@15 java.lang.Thread.State: WAITING at sun.misc.Unsafe.park(Native Method) - parking to wait for <7cb07b3> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1081) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "boundedElastic-evictor-1" - Thread t@14 java.lang.Thread.State: TIMED_WAITING at sun.misc.Unsafe.park(Native Method) - parking to wait for <318771ad> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None "/127.0.0.1:42314 to /127.0.0.1:42969 workers Thread 3" - Thread t@13 java.lang.Thread.State: RUNNABLE at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method) at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269) at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:93) at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86) - locked <602491f4> (a sun.nio.ch.Util$3) - locked <72cb310d> (a java.util.Collections$UnmodifiableSet) - locked <2d624678> (a sun.nio.ch.EPollSelectorImpl) at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97) at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:101) at org.gradle.internal.remote.internal.inet.SocketConnection$SocketInputStream.read(SocketConnection.java:185) at com.esotericsoftware.kryo.io.Input.fill(Input.java:146) at com.esotericsoftware.kryo.io.Input.require(Input.java:178) at com.esotericsoftware.kryo.io.Input.readByte(Input.java:295) at org.gradle.internal.serialize.kryo.KryoBackedDecoder.readByte(KryoBackedDecoder.java:82) at org.gradle.internal.remote.internal.hub.InterHubMessageSerializer$MessageReader.read(InterHubMessageSerializer.java:64) at org.gradle.internal.remote.internal.hub.InterHubMessageSerializer$MessageReader.read(InterHubMessageSerializer.java:52) at org.gradle.internal.remote.internal.inet.SocketConnection.receive(SocketConnection.java:81) at org.gradle.internal.remote.internal.hub.MessageHub$ConnectionReceive.run(MessageHub.java:269) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - Locked <78e94dcf> (a java.util.concurrent.ThreadPoolExecutor$Worker) "/127.0.0.1:42314 to /127.0.0.1:42969 workers Thread 2" - Thread t@12 java.lang.Thread.State: WAITING at sun.misc.Unsafe.park(Native Method) - parking to wait for <27e24060> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) at org.gradle.internal.remote.internal.hub.queue.EndPointQueue.take(EndPointQueue.java:49) at org.gradle.internal.remote.internal.hub.MessageHub$ConnectionDispatch.run(MessageHub.java:321) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - Locked <223f3642> (a java.util.concurrent.ThreadPoolExecutor$Worker) "Test worker" - Thread t@11 java.lang.Thread.State: RUNNABLE at sun.management.ThreadImpl.dumpThreads0(Native Method) at sun.management.ThreadImpl.dumpAllThreads(ThreadImpl.java:454) at org.springframework.boot.actuate.management.ThreadDumpEndpoint.getFormattedThreadDump(ThreadDumpEndpoint.java:51) at org.springframework.boot.actuate.management.ThreadDumpEndpoint.textThreadDump(ThreadDumpEndpoint.java:47) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:282) at org.springframework.boot.actuate.endpoint.invoke.reflect.ReflectiveOperationInvoker.invoke(ReflectiveOperationInvoker.java:77) at org.springframework.boot.actuate.endpoint.annotation.AbstractDiscoveredOperation.invoke(AbstractDiscoveredOperation.java:60) at org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$ServletWebOperationAdapter.handle(AbstractWebMvcEndpointHandlerMapping.java:305) at org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(AbstractWebMvcEndpointHandlerMapping.java:388) at sun.reflect.GeneratedMethodAccessor548.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) at javax.servlet.http.HttpServlet.service(HttpServlet.java:645) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:72) at javax.servlet.http.HttpServlet.service(HttpServlet.java:750) at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:167) at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:183) at org.springframework.boot.actuate.autoconfigure.endpoint.web.documentation.ThreadDumpEndpointDocumentationTests.textThreadDump(ThreadDumpEndpointDocumentationTests.java:186) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:686) at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor$$Lambda$120/1790441099.apply(Unknown Source) at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall$$Lambda$121/1818507846.apply(Unknown Source) at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) at org.junit.jupiter.engine.execution.ExecutableInvoker$$Lambda$234/358919109.apply(Unknown Source) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:212) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor$$Lambda$273/2123029078.execute(Unknown Source) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:208) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:137) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:71) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:135) at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$178/284706674.execute(Unknown Source) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$177/1120248930.invoke(Unknown Source) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$176/480836340.execute(Unknown Source) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService$$Lambda$182/251724271.accept(Unknown Source) at java.util.ArrayList.forEach(ArrayList.java:1257) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$178/284706674.execute(Unknown Source) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$177/1120248930.invoke(Unknown Source) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$176/480836340.execute(Unknown Source) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService$$Lambda$182/251724271.accept(Unknown Source) at java.util.ArrayList.forEach(ArrayList.java:1257) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$178/284706674.execute(Unknown Source) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$177/1120248930.invoke(Unknown Source) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$176/480836340.execute(Unknown Source) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:248) at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$5(DefaultLauncher.java:211) at org.junit.platform.launcher.core.DefaultLauncher$$Lambda$145/1427429381.accept(Unknown Source) at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:226) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:199) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:132) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:99) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:79) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:75) at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:61) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94) at com.sun.proxy.$Proxy2.stop(Unknown Source) at org.gradle.api.internal.tasks.testing.worker.TestWorker.stop(TestWorker.java:132) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:182) at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:164) at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:413) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - Locked <3e3047e6> (a java.util.concurrent.ThreadPoolExecutor$Worker) "Signal Dispatcher" - Thread t@4 java.lang.Thread.State: RUNNABLE Locked ownable synchronizers: - None "Finalizer" - Thread t@3 java.lang.Thread.State: WAITING at java.lang.Object.wait(Native Method) - waiting on <630dde59> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165) at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:216) Locked ownable synchronizers: - None "Reference Handler" - Thread t@2 java.lang.Thread.State: WAITING at java.lang.Object.wait(Native Method) - waiting on <48e5c86c> (a java.lang.ref.Reference$Lock) at java.lang.Object.wait(Object.java:502) at java.lang.ref.Reference.tryHandlePending(Reference.java:191) at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153) Locked ownable synchronizers: - None