001 package org.shiftone.jrat.core.jmx; 002 003 004 import org.shiftone.jrat.core.Environment; 005 import org.shiftone.jrat.util.log.Logger; 006 007 import javax.management.MBeanServer; 008 import javax.management.MBeanServerFactory; 009 import javax.management.ObjectName; 010 import javax.management.remote.JMXConnectorServer; 011 import javax.management.remote.JMXConnectorServerFactory; 012 import javax.management.remote.JMXServiceURL; 013 import java.rmi.registry.LocateRegistry; 014 import java.rmi.registry.Registry; 015 import java.util.ArrayList; 016 import java.util.Hashtable; 017 018 019 /** 020 * @author jeff@shiftone.org (Jeff Drost) 021 */ 022 public class ServerJmxRegistry implements JmxRegistry { 023 024 private static final Logger LOG = Logger.getLogger(ServerJmxRegistry.class); 025 private MBeanServer mBeanServer; 026 private String agentId = Environment.getSettings().getMBeanServerAgentId(); 027 028 // see com.sun.jmx.defaults.JmxProperties 029 public static final String JMX_INITIAL_BUILDER = "javax.management.builder.initial"; 030 031 public ServerJmxRegistry(boolean create) throws Exception { 032 033 if (create) { 034 this.mBeanServer = createMBeanServer(); 035 } 036 } 037 038 039 private static MBeanServer createMBeanServer() throws Exception { 040 041 if (Environment.getSettings().isRmiRegistryCreationEnabled()) { 042 043 int port = Environment.getSettings().getRmiRegistryPort(); 044 045 LOG.info("Creating local RMI jmx on port " + port + "."); 046 047 Registry registry = LocateRegistry.createRegistry(port); 048 } 049 050 LOG.info("Creating MBeanServer (MBeanServerFactory will refer to property '" + JMX_INITIAL_BUILDER + "')."); 051 052 MBeanServer mBeanServer = MBeanServerFactory.createMBeanServer(); 053 String urlText = Environment.getSettings().getMBeanServerServerUrl(); 054 055 if (urlText != null) { 056 057 // column a URL 058 JMXServiceURL url = new JMXServiceURL(urlText); 059 060 LOG.info("Binding JMXConnectorServer to RMI jmx."); 061 062 JMXConnectorServer connectorServer = JMXConnectorServerFactory.newJMXConnectorServer(url, null, 063 mBeanServer); 064 065 LOG.info("Starting JMXConnectorServer."); 066 connectorServer.start(); 067 } 068 069 return mBeanServer; 070 } 071 072 073 protected synchronized MBeanServer getMBeanServer() { 074 075 if (mBeanServer == null) { 076 ArrayList servers = MBeanServerFactory.findMBeanServer(agentId); 077 078 if (servers.size() == 0) { 079 LOG.debug("No MBeanServers were found."); 080 081 return null; 082 } else if (servers.size() > 1) { 083 LOG.warn("More than one MBeanServers (" + servers.size() + ") was found with agentId='" + agentId 084 + "'. Returning first."); 085 } 086 087 mBeanServer = (MBeanServer) servers.get(0); 088 } 089 090 return mBeanServer; 091 } 092 093 094 public boolean isReady() { 095 return (getMBeanServer() != null); 096 } 097 098 099 public void registerMBean(Object object, String objectNameText) { 100 101 LOG.debug("registerMBean..."); 102 103 MBeanServer server = getMBeanServer(); 104 105 if (server == null) { 106 LOG.info("MBeanServer is not available"); 107 108 return; 109 } 110 111 if (objectNameText == null) { 112 objectNameText = "shiftone.jrat:service=" + object.getClass().getName(); 113 } 114 115 try { 116 LOG.info("registerMBean " + object + " " + objectNameText); 117 118 ObjectName objectName = new ObjectName(objectNameText); 119 String domain = objectName.getDomain(); 120 Hashtable properties = objectName.getKeyPropertyList(); 121 int index = 0; 122 123 // this will loop until an avalible objectName is found 124 while (server.isRegistered(objectName)) { 125 properties.put("index", String.valueOf(++index)); 126 127 objectName = new ObjectName(domain, properties); 128 } 129 130 server.registerMBean(object, objectName); 131 } 132 catch (Exception e) { 133 LOG.warn("MBean registration failed", e); 134 } 135 } 136 }