/** * Set the {@code ObjectName} used to register the {@code JMXConnectorServer} * itself with the {@code MBeanServer}, as {@code ObjectName} instance * or as {@code String}. * @throws MalformedObjectNameException if the {@code ObjectName} is malformed */ public void setObjectName(Object objectName) throws MalformedObjectNameException { this.objectName = ObjectNameManager.getInstance(objectName); }
/** * Set the {@code ObjectName} of the MBean which calls are routed to, * as {@code ObjectName} instance or as {@code String}. */ public void setObjectName(Object objectName) throws MalformedObjectNameException { this.objectName = ObjectNameManager.getInstance(objectName); }
/** * Attempts to retrieve the {@code ObjectName} via the given key, trying to * find a mapped value in the mappings first. */ @Override public ObjectName getObjectName(Object managedBean, @Nullable String beanKey) throws MalformedObjectNameException { Assert.notNull(beanKey, "KeyNamingStrategy requires bean key"); String objectName = null; if (this.mergedMappings != null) { objectName = this.mergedMappings.getProperty(beanKey); } if (objectName == null) { objectName = beanKey; } return ObjectNameManager.getInstance(objectName); }
/** * Return the list of {@link javax.management.ObjectName} String representations for * which the encapsulated {@link #getNotificationFilter() NotificationFilter} will * be registered as a listener for {@link javax.management.Notification Notifications}. * @throws MalformedObjectNameException if an {@code ObjectName} is malformed */ @Nullable public ObjectName[] getResolvedObjectNames() throws MalformedObjectNameException { if (this.mappedObjectNames == null) { return null; } ObjectName[] resolved = new ObjectName[this.mappedObjectNames.size()]; int i = 0; for (Object objectName : this.mappedObjectNames) { resolved[i] = ObjectNameManager.getInstance(objectName); i++; } return resolved; }
/** * Retrieve the {@code ObjectName} instance corresponding to the supplied name. * @param objectName the {@code ObjectName} in {@code ObjectName} or * {@code String} format * @return the {@code ObjectName} instance * @throws MalformedObjectNameException in case of an invalid object name specification * @see ObjectName#ObjectName(String) * @see ObjectName#getInstance(String) */ public static ObjectName getInstance(Object objectName) throws MalformedObjectNameException { if (objectName instanceof ObjectName) { return (ObjectName) objectName; } if (!(objectName instanceof String)) { throw new MalformedObjectNameException("Invalid ObjectName value type [" + objectName.getClass().getName() + "]: only ObjectName and String supported."); } return getInstance((String) objectName); }
/** * Returns an instance of {@code ObjectName} based on the identity * of the managed resource. */ @Override public ObjectName getObjectName(Object managedBean, @Nullable String beanKey) throws MalformedObjectNameException { String domain = ClassUtils.getPackageName(managedBean.getClass()); Hashtable<String, String> keys = new Hashtable<>(); keys.put(TYPE_KEY, ClassUtils.getShortName(managedBean.getClass())); keys.put(HASH_CODE_KEY, ObjectUtils.getIdentityHexString(managedBean)); return ObjectNameManager.getInstance(domain, keys); }
/** * Append an additional key/value pair to an existing {@link ObjectName} with the key being * the static value {@code identity} and the value being the identity hash code of the * managed resource being exposed on the supplied {@link ObjectName}. This can be used to * provide a unique {@link ObjectName} for each distinct instance of a particular bean or * class. Useful when generating {@link ObjectName ObjectNames} at runtime for a set of * managed resources based on the template value supplied by a * {@link org.springframework.jmx.export.naming.ObjectNamingStrategy}. * @param objectName the original JMX ObjectName * @param managedResource the MBean instance * @return an ObjectName with the MBean identity added * @throws MalformedObjectNameException in case of an invalid object name specification * @see org.springframework.util.ObjectUtils#getIdentityHexString(Object) */ public static ObjectName appendIdentityToObjectName(ObjectName objectName, Object managedResource) throws MalformedObjectNameException { Hashtable<String, String> keyProperties = objectName.getKeyPropertyList(); keyProperties.put(IDENTITY_OBJECT_NAME_KEY, ObjectUtils.getIdentityHexString(managedResource)); return ObjectNameManager.getInstance(objectName.getDomain(), keyProperties); }
/** * Returns an instance of {@code ObjectName} based on the identity * of the managed resource. */ @Override public ObjectName getObjectName(Object managedBean, @Nullable String beanKey) throws MalformedObjectNameException { String domain = ClassUtils.getPackageName(managedBean.getClass()); Hashtable<String, String> keys = new Hashtable<>(); keys.put(TYPE_KEY, ClassUtils.getShortName(managedBean.getClass())); keys.put(HASH_CODE_KEY, ObjectUtils.getIdentityHexString(managedBean)); return ObjectNameManager.getInstance(domain, keys); }
protected MBeanInfo getMBeanInfo() throws Exception { return getServer().getMBeanInfo(ObjectNameManager.getInstance(getObjectName())); }
@Test public void testOperationInvocation() throws Exception{ ObjectName objectName = ObjectNameManager.getInstance(getObjectName()); Object result = getServer().invoke(objectName, "add", new Object[] {new Integer(20), new Integer(30)}, new String[] {"int", "int"}); assertEquals("Incorrect result", new Integer(50), result); }
@Test public void lazyNaming() throws Exception { ConfigurableApplicationContext ctx = new ClassPathXmlApplicationContext("org/springframework/jmx/export/annotation/lazyNaming.xml"); try { MBeanServer server = (MBeanServer) ctx.getBean("server"); ObjectName oname = ObjectNameManager.getInstance("bean:name=testBean4"); assertNotNull(server.getObjectInstance(oname)); String name = (String) server.getAttribute(oname, "Name"); assertEquals("Invalid name returned", "TEST", name); } finally { ctx.close(); } }
@Test public void componentScan() throws Exception { ConfigurableApplicationContext ctx = new ClassPathXmlApplicationContext("org/springframework/jmx/export/annotation/componentScan.xml"); try { MBeanServer server = (MBeanServer) ctx.getBean("server"); ObjectName oname = ObjectNameManager.getInstance("bean:name=testBean4"); assertNotNull(server.getObjectInstance(oname)); String name = (String) server.getAttribute(oname, "Name"); assertNull(name); } finally { ctx.close(); } }
@Test public void testAppendIdentityToObjectName() throws MalformedObjectNameException { ObjectName objectName = ObjectNameManager.getInstance("spring:type=Test"); Object managedResource = new Object(); ObjectName uniqueName = JmxUtils.appendIdentityToObjectName(objectName, managedResource); String typeProperty = "type"; assertEquals("Domain of transformed name is incorrect", objectName.getDomain(), uniqueName.getDomain()); assertEquals("Type key is incorrect", objectName.getKeyProperty(typeProperty), uniqueName.getKeyProperty("type")); assertEquals("Identity key is incorrect", ObjectUtils.getIdentityHexString(managedResource), uniqueName.getKeyProperty(JmxUtils.IDENTITY_OBJECT_NAME_KEY)); }
private void validateMBeanAttribute(MBeanServer server, String objectName, String expected) throws Exception { ObjectName oname = ObjectNameManager.getInstance(objectName); assertNotNull(server.getObjectInstance(oname)); String name = (String) server.getAttribute(oname, "Name"); assertEquals("Invalid name returned", expected, name); }
@Test public void testAutodetectWithExclude() throws Exception { ConfigurableApplicationContext ctx = load("autodetectMBeans.xml"); try { ctx.getBean("exporter"); MBeanServer server = ctx.getBean("server", MBeanServer.class); ObjectInstance instance = server.getObjectInstance(ObjectNameManager.getInstance("spring:mbean=true")); assertNotNull(instance); thrown.expect(InstanceNotFoundException.class); server.getObjectInstance(ObjectNameManager.getInstance("spring:mbean=false")); } finally { ctx.close(); } }
@Test public void testAutodetectMBeans() throws Exception { ConfigurableApplicationContext ctx = load("autodetectMBeans.xml"); try { ctx.getBean("exporter"); MBeanServer server = ctx.getBean("server", MBeanServer.class); ObjectInstance instance = server.getObjectInstance(ObjectNameManager.getInstance("spring:mbean=true")); assertNotNull(instance); instance = server.getObjectInstance(ObjectNameManager.getInstance("spring:mbean2=true")); assertNotNull(instance); instance = server.getObjectInstance(ObjectNameManager.getInstance("spring:mbean3=true")); assertNotNull(instance); } finally { ctx.close(); } }
@Test public void testAutodetectLazyMBeans() throws Exception { ConfigurableApplicationContext ctx = load("autodetectLazyMBeans.xml"); try { ctx.getBean("exporter"); MBeanServer server = ctx.getBean("server", MBeanServer.class); ObjectName oname = ObjectNameManager.getInstance("spring:mbean=true"); assertNotNull(server.getObjectInstance(oname)); String name = (String) server.getAttribute(oname, "Name"); assertEquals("Invalid name returned", "Rob Harrop", name); oname = ObjectNameManager.getInstance("spring:mbean=another"); assertNotNull(server.getObjectInstance(oname)); name = (String) server.getAttribute(oname, "Name"); assertEquals("Invalid name returned", "Juergen Hoeller", name); } finally { ctx.close(); } }
private void assertListener(MockMBeanExporterListener listener) throws MalformedObjectNameException { ObjectName desired = ObjectNameManager.getInstance(OBJECT_NAME); assertEquals("Incorrect number of registrations", 1, listener.getRegistered().size()); assertEquals("Incorrect number of unregistrations", 1, listener.getUnregistered().size()); assertEquals("Incorrect ObjectName in register", desired, listener.getRegistered().get(0)); assertEquals("Incorrect ObjectName in unregister", desired, listener.getUnregistered().get(0)); }
protected ObjectInstance getObjectInstance() throws Exception { return getServer().getObjectInstance(ObjectNameManager.getInstance(getObjectName())); }
@Test public void testLazyInit() throws Exception { // start the MBeanExporter ConfigurableApplicationContext ctx = loadContext("org/springframework/jmx/export/notificationPublisherLazyTests.xml"); assertFalse("Should not have instantiated the bean yet", ctx.getBeanFactory().containsSingleton("publisher")); // need to touch the MBean proxy server.getAttribute(ObjectNameManager.getInstance("spring:type=Publisher"), "Name"); this.server.addNotificationListener(ObjectNameManager.getInstance("spring:type=Publisher"), listener, null, null); MyNotificationPublisher publisher = (MyNotificationPublisher) ctx.getBean("publisher"); assertNotNull("NotificationPublisher should not be null", publisher.getNotificationPublisher()); publisher.sendNotification(); assertEquals("Notification not sent", 1, listener.count); }