Soften interface for javax.management.ObjectName.getInstance and friends
Daniel Fuchs
daniel.fuchs at oracle.com
Fri Feb 24 13:44:04 UTC 2017
Hi Dave,
I'm not sure this is quite a good idea because
order doesn't count when comparing ObjectNames.
So the folder analogy would just be a lure:
/a/b/c would be equal to /a/c/b
That said - I can see value in trying to get rid
of the legacy Hashtable - so adding a new method
that takes a Map<String,String> wouldn't necessarily
be a bad thing :-)
A work around for your use case would be to use:
static ObjectName getInstance(String name)
instead of
static ObjectName getInstance(String domain
Hashtable<String,String> table)
An object name has both a string representation
and a canonical representation.
IIRC we did try to preserve the original string
representation, even if it's not canonical.
It's also preserved in the serial form.
See:
https://docs.oracle.com/javase/8/docs/api/javax/management/ObjectName.html#getKeyPropertyListString--
Hope this helps,
-- daniel
On 24/02/17 00:17, Dave Brosius wrote:
> Greetings. the method
>
> public static ObjectName getInstance(String domain,
> Hashtable<String,String> table)
> throws MalformedObjectNameException {
> return new ObjectName(domain, table);
> }
>
> in javax.management.ObjectName allows for a provided Hashtable to
> specify properties for the objectname.
>
> The semantics of an ObjectName don't consider the order of these
> properties, however certain tools like jconsole (when used as a name for
> a jmx property) does consider the order.
>
> If you wish to create a folder structure to report metrics in jmx, you
> need to use this properties map to specify the folder names. JConsole,
> then, uses order of iteration to determine the order of the folder
> hierarchy.
>
> Suppose you want a folder hierarchy similar to a package name, you may
> specify properties like
>
> table.put("a0", "com");
> table.put("a1", "acme");
> table.put("name", "MyMetric");
>
> in hopes of producing a metric in JConsole in the folder structure,
> com/acme/MyMetric.
>
> The problem is of course, that the argument is a Hashtable, not a Map,
> and so the items are not ordered at all, yet JConsole uses iteration
> order to build the path, so you may get
>
> acme/ao/MyMetric or MyMetric/acme/ao or .....
>
> This means if you really want to have ordered packages, you have to
> derive from Hashtable, and override the entrySet() method, including
> that set's iterator() to return the values in the order you wish to have
> them shown.
>
> That is really janky.
>
> I'm proposing that the interface for getInstance be softened to
>
> public static ObjectName getInstance(String domain,
> Map<String,String> table)
>
> as well as
>
> public ObjectName(String domain, Map<String, String> table)
>
> thoughts?
>
More information about the serviceability-dev
mailing list