[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&#39;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">&quot;</span>street1<span \
class="gmail-pl-pds">&quot;</span></span>, <span class="gmail-pl-s"><span \
class="gmail-pl-pds">&quot;</span>city<span \
class="gmail-pl-pds">&quot;</span></span>, <span class="gmail-pl-s"><span \
class="gmail-pl-pds">&quot;</span>state<span \
class="gmail-pl-pds">&quot;</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">&quot;</span>name<span \
class="gmail-pl-pds">&quot;</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">&quot;</span>name<span \
class="gmail-pl-pds">&quot;</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">&quot;</span>age<span \
class="gmail-pl-pds">&quot;</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">&quot;</span>com.tersesystems.jmxbuilder:type=UserBean,name=User<span \
                class="gmail-pl-pds">&quot;</span></span>);
        mBeanServer<span class="gmail-pl-k">.</span>registerMBean(userBean, \
objectName);  }
}</pre>

</div><div><br></div><div>The code&#39;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&#39;ve \
also got an MBeanServerInterceptor put together at <a \
href="https://github.com/tersesystems/jmxmvc">https://github.com/tersesystems/jmxmvc</a> \
although that&#39;s a lot more fiddly and I&#39;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