📄 server.java
字号:
package jndi;import javax.naming.InitialContext;import javax.naming.Context;import javax.naming.NamingEnumeration;import javax.naming.NameNotFoundException;import javax.naming.NamingException;import javax.naming.directory.DirContext;import javax.naming.directory.Attribute;import javax.naming.directory.BasicAttribute;import javax.naming.directory.Attributes;import javax.naming.directory.BasicAttributes;import javax.naming.directory.DirContext;import javax.naming.directory.Attribute;import javax.naming.directory.Attributes;import javax.naming.directory.SearchResult;import javax.naming.directory.SearchControls;import javax.naming.ldap.InitialLdapContext;import javax.management.*;import javax.management.remote.*;import javax.management.remote.rmi.*;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Map;import java.util.HashMap;import java.util.Hashtable;import java.util.List;import java.util.ArrayList;import java.util.Locale;import java.util.Vector;import java.io.IOException;import java.io.Serializable;import java.net.InetAddress;import java.net.MalformedURLException;/** * This class demonstrates how to use an LDAP directory as a lookup * service for JSR 160 connectors. It shows how to register a * JMXConnectorServer with the LDAP directory through JNDI. * <p> * See README file and {@link #main(String[])} for more details. * <p> * Make sure to read the section "Binding with Lookup Services" of * the JMX Remote API 1.0 Specification before looking at this example. */public class Server { // The URL will remain registered for 60 secs. // public final static int JMX_DEFAULT_LEASE = 60; private static boolean debug = false; /** * The local MBeanServer. */ private final MBeanServer mbs; /** * Constructs a Server object. Creates a new MBeanServer. */ public Server() { mbs = MBeanServerFactory.createMBeanServer(); } /** * Get a pointer to the root context of the directory tree * under which this server is supposed to register itself. * All LDAP DNs will be considered to be relative to that root. * <p> * Note that this root is not part of the JSR 160 specification, * since the actual location where a JMX Agent will register * its connectors is left completely open by the specification. * The specification only discuss what the JMX Agent must/may * put in the directory - but not where. * <p> * This method assumes that the root of the directory is * will be passed in a the {@link Context#PROVIDER_URL * Context.PROVIDER_URL} System property. * <p> * This method will transfer a fixed set of System Properties to * the Hashtable given to the JNDI InitialContext: * <ul><li>{@link Context#INITIAL_CONTEXT_FACTORY * Context.INITIAL_CONTEXT_FACTORY} - default is * <code>"com.sun.jndi.ldap.LdapCtxFactory"</code></li> * <li>{@link Context#PROVIDER_URL * Context.PROVIDER_URL}</li> * <li>{@link Context#SECURITY_PRINCIPAL * Context.SECURITY_PRINCIPAL} - default is * <code>"cn=Directory Manager"</code></li> * <li>{@link Context#SECURITY_CREDENTIALS * Context.SECURITY_CREDENTIALS}</li> * </ul> * * @return a pointer to the LDAP Directory. */ public static DirContext getRootContext() throws NamingException { // Prepare environment // final Hashtable env = new Hashtable(); // The Initial Context Factory must be provided, and // must point to an LDAP Context Factory // final String factory = System.getProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); // The LDAP Provider URL must be provided, and // must point to a running LDAP directory server // final String ldapServerUrl = System.getProperty(Context.PROVIDER_URL); // The LDAP user must be provided, and // must have write access to the subpart of the directory // where the agent will be registered. // final String ldapUser = System.getProperty(Context.SECURITY_PRINCIPAL, "cn=Directory Manager"); // Credentials must be provided, so that the user may // write to the directory. // final String ldapPasswd = System.getProperty(Context.SECURITY_CREDENTIALS); // Debug info: print provided values: // debug(Context.PROVIDER_URL + "=" + ldapServerUrl); debug(Context.SECURITY_PRINCIPAL + "=" + ldapUser); if (debug) { System.out.print(Context.SECURITY_CREDENTIALS + "="); final int len = (ldapPasswd==null)?0:ldapPasswd.length(); for (int i=0;i<len;i++) System.out.print("*"); System.out.println(); } // Put provided value in the environment table. // env.put(Context.INITIAL_CONTEXT_FACTORY,factory); env.put(Context.SECURITY_PRINCIPAL, ldapUser); if (ldapServerUrl != null) env.put(Context.PROVIDER_URL, ldapServerUrl); if (ldapPasswd != null) env.put(Context.SECURITY_CREDENTIALS, ldapPasswd); // Create initial context // InitialContext root = new InitialLdapContext(env,null); // Now return the root directory context. // return (DirContext)(root.lookup("")); } /** * Registers a JMX Connector URL with the LDAP directory. * <p> * This method expects to find the LDAP DN where it will register * the JMX Connector URL in the "dn" System property. If that * property is not set, then "cn=<var>name</var>" is assumed. * <p> * If the given DN does not point to an existing node in the * directory, then this method will attempt to create it. Yet, * the parent node must already exist in that case. * <p> * If the DN points to a node that is already of the <var>jmxConnector</var> * class, then this method will simply override its <var>jmxServiceURL</var> * ,<var>jmxAgentName</var>, <var>jmxProtocolType</var>, * <var>jmxAgentHost</var> and <var>jmxExpirationDate</var> attributes. * * @param root A pointer to the root context we are using, * as returned by {@link #getRootContext()}. * @param jmxUrl A JMX Connector Server URL, that should have * been obtained from * {@link JMXConnectorServer#getAddress() * JMXConnectorServer.getAddress()}; * @param name The AgentName with which the URL must be registered * in the LDAP directory. */ public static void register(DirContext root, JMXServiceURL jmxUrl, String name) throws NamingException, IOException { // Get the LDAP DN where to register // final String mydn = System.getProperty("dn","cn="+name); debug("dn: " + mydn ); // First check whether <mydn> already exists // Object o = null; try { o = root.lookup(mydn); // There is already a node at <mydn> // } catch (NameNotFoundException n) { // <mydn> does not exist! attempt to create it. // // Prepare attributes for creating a javaContainer // with the auxiliary class jmxConnector. // Attributes attrs = new BasicAttributes(); // Prepare objectClass attribute: we're going to create // a javaContainer with the jmxConnector auxiliary class. // Attribute objclass = new BasicAttribute("objectClass"); objclass.add("top"); objclass.add("javaContainer"); objclass.add("jmxConnector"); attrs.put(objclass); attrs.put("jmxAgentName", name); o = root.createSubcontext(mydn,attrs); } // That's not supposed to happen but who knows... // if (o == null) throw new NameNotFoundException(); // Check that the entry contains the jmxConnector objectClass // before modifying the attributes. // final Attributes attrs = root.getAttributes(mydn); final Attribute oc = attrs.get("objectClass"); if (!oc.contains("jmxConnector")) { // The node does not have the jmxConnector class. // final String msg = "The supplied node [" + mydn + "] does not " +
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -