[prev in list] [next in list] [prev in thread] [next in thread]
List: openjdk-serviceability-dev
Subject: Wrote a fluent builder library for JMX MBean creation
From: Will Sargent <will.sargent () gmail ! com>
Date: 2020-01-12 19:25:50
Message-ID: CAAvUidMKH0kegr-EYjAJ+HiAvefa2V=Or6VOjXhW5O0uyRGn2g () mail ! gmail ! com
[Download RAW message or body]
Hi all,
I've written a library that uses Java 8 functions and some type inference
to create MBeans in a single statement:
class UserExample {
static final MBeanServer mBeanServer =
ManagementFactory.getPlatformMBeanServer();
public static void registerUser() throws Exception {
Address address = new Address("street1", "city", "state");
final User user = new User("name", 12, address);
final DynamicMBean userBean = DynamicBean.builder()
.withSimpleAttribute(String.class, "name",
user::getName, user::setName)
.withSimpleAttribute(Integer.TYPE, "age",
user::getAge, user::setAge)
.build();
ObjectName objectName = new
ObjectName("com.tersesystems.jmxbuilder:type=UserBean,name=User");
mBeanServer.registerMBean(userBean, objectName);
}
}
The code's available at https://github.com/tersesystems/jmxbuilder
I wrote a blog post as well explaining the use case -- OpenMBean API
restrictions, no need for annotations or interface/class creation, and
being able build up CompositeData and TabularData so that more complex
MBeans can be created. Blog post is here
https://tersesystems.com/blog/2019/12/24/controlling-logging-in-a-running-jvm/
I've also got an MBeanServerInterceptor put together at
https://github.com/tersesystems/jmxmvc although that's a lot more fiddly
and I'm not sure I have the details worked out.
I am probably going to work on automatic registration using using Guice and
Sangria https://tavianator.com/announcing-sangria/ next, so anything
implementing an interface can have a JMX bean created for it, without tying
the interface directly to JMX implementation.
[Attachment #3 (text/html)]
<div dir="ltr"><div>Hi all,</div><div><br></div><div>I've written a library that \
uses Java 8 functions and some type inference to create MBeans in a single \
statement:</div><div><br></div><div> <pre><span class="gmail-pl-k">class</span> <span \
class="gmail-pl-en">UserExample</span> { <span class="gmail-pl-k">static</span> \
<span class="gmail-pl-k">final</span> <span class="gmail-pl-smi">MBeanServer</span> \
mBeanServer <span class="gmail-pl-k">=</span> <span \
class="gmail-pl-smi">ManagementFactory</span><span \
class="gmail-pl-k">.</span>getPlatformMBeanServer();
<span class="gmail-pl-k">public</span> <span class="gmail-pl-k">static</span> \
<span class="gmail-pl-k">void</span> <span class="gmail-pl-en">registerUser</span>() \
<span class="gmail-pl-k">throws</span> <span class="gmail-pl-smi">Exception</span> { \
<span class="gmail-pl-smi">Address</span> address <span class="gmail-pl-k">=</span> \
<span class="gmail-pl-k">new</span> <span class="gmail-pl-smi">Address</span>(<span \
class="gmail-pl-s"><span class="gmail-pl-pds">"</span>street1<span \
class="gmail-pl-pds">"</span></span>, <span class="gmail-pl-s"><span \
class="gmail-pl-pds">"</span>city<span \
class="gmail-pl-pds">"</span></span>, <span class="gmail-pl-s"><span \
class="gmail-pl-pds">"</span>state<span \
class="gmail-pl-pds">"</span></span>); <span class="gmail-pl-k">final</span> \
<span class="gmail-pl-smi">User</span> user <span class="gmail-pl-k">=</span> <span \
class="gmail-pl-k">new</span> <span class="gmail-pl-smi">User</span>(<span \
class="gmail-pl-s"><span class="gmail-pl-pds">"</span>name<span \
class="gmail-pl-pds">"</span></span>, <span class="gmail-pl-c1">12</span>, \
address);
<span class="gmail-pl-k">final</span> <span \
class="gmail-pl-smi">DynamicMBean</span> userBean <span class="gmail-pl-k">=</span> \
<span class="gmail-pl-smi">DynamicBean</span><span \
class="gmail-pl-k">.</span>builder()
.withSimpleAttribute(<span class="gmail-pl-smi">String</span><span \
class="gmail-pl-k">.</span>class, <span class="gmail-pl-s"><span \
class="gmail-pl-pds">"</span>name<span \
class="gmail-pl-pds">"</span></span>, user<span \
class="gmail-pl-k">::</span>getName, user<span \
class="gmail-pl-k">::</span>setName)
.withSimpleAttribute(<span class="gmail-pl-smi">Integer</span><span \
class="gmail-pl-c1"><span class="gmail-pl-k">.</span>TYPE</span>, <span \
class="gmail-pl-s"><span class="gmail-pl-pds">"</span>age<span \
class="gmail-pl-pds">"</span></span>, user<span \
class="gmail-pl-k">::</span>getAge, user<span \
class="gmail-pl-k">::</span>setAge)
.build();
<span class="gmail-pl-smi">ObjectName</span> objectName <span \
class="gmail-pl-k">=</span> <span class="gmail-pl-k">new</span> <span \
class="gmail-pl-smi">ObjectName</span>(<span class="gmail-pl-s"><span \
class="gmail-pl-pds">"</span>com.tersesystems.jmxbuilder:type=UserBean,name=User<span \
class="gmail-pl-pds">"</span></span>);
mBeanServer<span class="gmail-pl-k">.</span>registerMBean(userBean, \
objectName); }
}</pre>
</div><div><br></div><div>The code's available at <a \
href="https://github.com/tersesystems/jmxbuilder">https://github.com/tersesystems/jmxbuilder</a></div><div><br></div><div>I \
wrote a blog post as well explaining the use case -- OpenMBean API restrictions, no \
need for annotations or interface/class creation, and being able build up \
CompositeData and TabularData so that more complex MBeans can be created. Blog \
post is here <a href="https://tersesystems.com/blog/2019/12/24/controlling-logging-in- \
a-running-jvm/">https://tersesystems.com/blog/2019/12/24/controlling-logging-in-a-running-jvm/</a></div><div><br></div><div>I've \
also got an MBeanServerInterceptor put together at <a \
href="https://github.com/tersesystems/jmxmvc">https://github.com/tersesystems/jmxmvc</a> \
although that's a lot more fiddly and I'm not sure I have the details worked \
out.<br></div><div><br></div><div>I am probably going to work on automatic \
registration using using Guice and Sangria <a \
href="https://tavianator.com/announcing-sangria/">https://tavianator.com/announcing-sangria/</a> \
next, so anything implementing an interface can have a JMX bean created for it, \
without tying the interface directly to JMX implementation.<br></div></div>
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic