{"id":4127,"date":"2018-04-06T22:08:24","date_gmt":"2018-04-06T20:08:24","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=4127"},"modified":"2018-04-06T22:08:24","modified_gmt":"2018-04-06T20:08:24","slug":"jmx-in-spring-boot-nutzen","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2018\/04\/jmx-in-spring-boot-nutzen\/","title":{"rendered":"JMX in Spring Boot nutzen"},"content":{"rendered":"<h3 id=\"truejmx\">Die Java Management Extensions (JMX)<\/h3>\n<div class=\"sectionbody\">\n<div class=\"sect2 data-line-3\">\n<div class=\"ulist data-line-5\">\n<ul>\n<li>Die <strong>Java Management Extensions (JMX)<\/strong> ist eine Spezifikation zur Verwaltung und \u00dcberwachung von Java-Anwendungen.<\/li>\n<li>Teile der JMX Spezifikation sind ab Java 5 in der Java SE integriert.<\/li>\n<li>Es gibt einen JMX Agent, an dem Managed Beans angemeldet werden.<\/li>\n<li>Von au\u00dfen lassen sich diese Managed Beans erfragen.<\/li>\n<li>JConsole ist ein GUI-Programm im JDK, das zur Verwaltung von MBeans verwendet werden kann.<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<div class=\"sect2 data-line-16\">\n<h3 id=\"truejmx_in_spring_boot\">JMX in Spring Boot<\/h3>\n<div class=\"paragraph data-line-18\">\n<p>Spring nutzt drei Annotationen, um Managed Beans mit ihren Zust\u00e4nden und Operationen beim JMX Agent zu registrieren:<\/p>\n<\/div>\n<div class=\"dlist data-line-20\">\n<dl>\n<dt class=\"hdlist1\"><code>@ManagedResource<\/code><\/dt>\n<dd>Definiert mit der Typ-Annotation die Managed Bean<\/dd>\n<dt class=\"hdlist1\"><code>@ManagedAttribute<\/code><\/dt>\n<dd>Definiert ein Attribut (Setter\/Getter)<\/dd>\n<dt class=\"hdlist1\"><code>@ManagedOperation<\/code><\/dt>\n<dd>Definiert eine Operation<\/dd>\n<\/dl>\n<\/div>\n<\/div>\n<div class=\"sect2 data-line-28\">\n<h3 id=\"truebeispiel_managed_bean\">Beispiel-Managed-Bean<\/h3>\n<div class=\"listingblock data-line-31\">\n<div class=\"content\">\n<pre class=\"highlightjs highlight\"><code class=\"language-java hljs\" data-lang=\"java\"><span class=\"hljs-keyword\">package<\/span> com.tutego.boot.actuator;\r\n\r\n<span class=\"hljs-keyword\">import<\/span> java.util.HashMap;\r\n<span class=\"hljs-keyword\">import<\/span> java.util.Map;\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.jmx.export.annotation.ManagedAttribute;\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.jmx.export.annotation.ManagedOperation;\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.jmx.export.annotation.ManagedResource;\r\n<span class=\"hljs-keyword\">import<\/span> org.springframework.stereotype.Component;\r\n\r\n<span class=\"hljs-annotation\">@Component<\/span>\r\n<span class=\"hljs-annotation\">@ManagedResource<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">StringMapManagedBean<\/span> <\/span>{\r\n  <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">final<\/span> Map&lt;String, String&gt; map = <span class=\"hljs-keyword\">new<\/span> HashMap&lt;&gt;();\r\n\r\n  <span class=\"hljs-annotation\">@ManagedAttribute<\/span>\r\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">getSize<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\r\n    <span class=\"hljs-keyword\">return<\/span> map.size();\r\n  }\r\n\r\n  <span class=\"hljs-annotation\">@ManagedOperation<\/span>\r\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> String <span class=\"hljs-title\">get<\/span><span class=\"hljs-params\">( String key )<\/span> <\/span>{\r\n    <span class=\"hljs-keyword\">return<\/span> map.get( key );\r\n  }\r\n\r\n\r\n  <span class=\"hljs-annotation\">@ManagedOperation<\/span>\r\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> String <span class=\"hljs-title\">put<\/span><span class=\"hljs-params\">( String key, String value )<\/span> <\/span>{\r\n    <span class=\"hljs-keyword\">return<\/span> map.put( key, value );\r\n  }\r\n\r\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">remove<\/span><span class=\"hljs-params\">( String key )<\/span> <\/span>{\r\n    map.remove( key );\r\n  }\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect2 data-line-88\"><\/div>\n<div class=\"sect2 data-line-98\">\n<h3 id=\"trueannotationstyp_managedresource\">Annotationstyp @ManagedResource<\/h3>\n<div class=\"listingblock data-line-101\">\n<div class=\"content\">\n<pre class=\"highlightjs highlight\"><code class=\"language-java hljs\" data-lang=\"java\"><span class=\"hljs-annotation\">@Target<\/span>(ElementType.TYPE)\r\n<span class=\"hljs-annotation\">@Retention<\/span>(RetentionPolicy.RUNTIME)\r\n<span class=\"hljs-annotation\">@Inherited<\/span>\r\n<span class=\"hljs-annotation\">@Documented<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-annotation\">@interface<\/span> ManagedResource {\r\n\r\n\t<span class=\"hljs-annotation\">@AliasFor<\/span>(<span class=\"hljs-string\">\"objectName\"<\/span>)\r\n\t<span class=\"hljs-function\">String <span class=\"hljs-title\">value<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">default<\/span> \"\"<\/span>;\r\n\r\n\t<span class=\"hljs-annotation\">@AliasFor<\/span>(<span class=\"hljs-string\">\"value\"<\/span>)\r\n\t<span class=\"hljs-function\">String <span class=\"hljs-title\">objectName<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">default<\/span> \"\"<\/span>;\r\n\r\n\t<span class=\"hljs-function\">String <span class=\"hljs-title\">description<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">default<\/span> \"\"<\/span>;\r\n\r\n\t<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">currencyTimeLimit<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">default<\/span> -1<\/span>;\r\n\t<span class=\"hljs-function\"><span class=\"hljs-keyword\">boolean<\/span> <span class=\"hljs-title\">log<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">default<\/span> <span class=\"hljs-keyword\">false<\/span><\/span>;\r\n\t<span class=\"hljs-function\">String <span class=\"hljs-title\">logFile<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">default<\/span> \"\"<\/span>;\r\n\t<span class=\"hljs-function\">String <span class=\"hljs-title\">persistPolicy<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">default<\/span> \"\"<\/span>;\r\n\t<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">persistPeriod<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">default<\/span> -1<\/span>;\r\n\t<span class=\"hljs-function\">String <span class=\"hljs-title\">persistName<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">default<\/span> \"\"<\/span>;\r\n\t<span class=\"hljs-function\">String <span class=\"hljs-title\">persistLocation<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-keyword\">default<\/span> \"\"<\/span>;\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect2 data-line-129\">\n<h3 id=\"truesprings_eigene_managed_beans\">Springs eigene Managed Beans<\/h3>\n<div class=\"paragraph data-line-131\">\n<p>Spring Boot ver\u00f6ffentlicht selbst diverse Managed Beans unter der Dom\u00e4ne <code>org.springframework.boot<\/code>.<\/p>\n<\/div>\n<div class=\"ulist data-line-133\">\n<ul>\n<li><code>org.springframework.boot:type=Endpoint,name=Health<\/code> zum Beispiel f\u00fcr die Gesundheitsinformationen<\/li>\n<\/ul>\n<\/div>\n<div class=\"paragraph data-line-135\">\n<p>Sie lassen sich abschalten mit <code>management.endpoints.jmx.exposure.exclude=*<\/code>.<\/p>\n<\/div>\n<div class=\"paragraph data-line-137\">\n<p>Falls mehrere <code>ApplicationContext<\/code> exisistieren kommt es zum Namenskonflikt; der l\u00e4sst sich mit <code>management.endpoints.jmx.unique-names=true<\/code> vermeiden.<\/p>\n<\/div>\n<div class=\"paragraph data-line-139\">\n<p>Der Domain-Name l\u00e4sst sich anpassen mit <code>management.endpoints.jmx.domain<\/code>.<\/p>\n<\/div>\n<div class=\"paragraph data-line-142\">\n<p>Siehe auch <a class=\"bare\" href=\"https:\/\/docs.spring.io\/spring-boot\/docs\/current\/reference\/htmlsingle\/#boot-features-jmx\">https:\/\/docs.spring.io\/spring-boot\/docs\/current\/reference\/htmlsingle\/#boot-features-jmx<\/a>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Die Java Management Extensions (JMX) Die Java Management Extensions (JMX) ist eine Spezifikation zur Verwaltung und \u00dcberwachung von Java-Anwendungen. Teile der JMX Spezifikation sind ab Java 5 in der Java SE integriert. Es gibt einen JMX Agent, an dem Managed Beans angemeldet werden. Von au\u00dfen lassen sich diese Managed Beans erfragen. JConsole ist ein GUI-Programm [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[3],"tags":[],"class_list":["post-4127","post","type-post","status-publish","format-standard","hentry","category-spring"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4127","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=4127"}],"version-history":[{"count":1,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4127\/revisions"}],"predecessor-version":[{"id":4128,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4127\/revisions\/4128"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=4127"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=4127"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=4127"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}