You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@wicket.apache.org by Martin Grigorov <mc...@e-card.bg> on 2007/01/06 12:45:27 UTC

Re: svn commit: r492845 - in /incubator/wicket: branches/wicket-1.x/wicket-jmx/src/main/java/wicket/jmx/Initializer.java trunk/wicket/src/main/java/wicket/jmx/Initializer.java

Hi Eelco,

The issue is closed and I cannot comment there.
The fix is fine. Everything is OK now.

My setup is: Debian, SUN JDK 6, maven-jetty-plugin 6.1-SNAPSHOT, Wicket
2.0 (trunk)

Martin

On Fri, 2007-01-05 at 02:04 +0000, ehillenius@apache.org wrote:
> Author: ehillenius
> Date: Thu Jan  4 18:04:40 2007
> New Revision: 492845
> 
> URL: http://svn.apache.org/viewvc?view=rev&rev=492845
> Log:
> WICKET-196
> 
> Modified:
>     incubator/wicket/branches/wicket-1.x/wicket-jmx/src/main/java/wicket/jmx/Initializer.java
>     incubator/wicket/trunk/wicket/src/main/java/wicket/jmx/Initializer.java
> 
> Modified: incubator/wicket/branches/wicket-1.x/wicket-jmx/src/main/java/wicket/jmx/Initializer.java
> URL: http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.x/wicket-jmx/src/main/java/wicket/jmx/Initializer.java?view=diff&rev=492845&r1=492844&r2=492845
> ==============================================================================
> --- incubator/wicket/branches/wicket-1.x/wicket-jmx/src/main/java/wicket/jmx/Initializer.java (original)
> +++ incubator/wicket/branches/wicket-1.x/wicket-jmx/src/main/java/wicket/jmx/Initializer.java Thu Jan  4 18:04:40 2007
> @@ -1,22 +1,19 @@
>  /*
> - * Licensed to the Apache Software Foundation (ASF) under one or more
> - * contributor license agreements.  See the NOTICE file distributed with
> - * this work for additional information regarding copyright ownership.
> - * The ASF licenses this file to You under the Apache License, Version 2.0
> - * (the "License"); you may not use this file except in compliance with
> - * the License.  You may obtain a copy of the License at
> - *
> - *      http://www.apache.org/licenses/LICENSE-2.0
> - *
> + * ==============================================================================
> + * Licensed under the Apache License, Version 2.0 (the "License"); you may not
> + * use this file except in compliance with the License. You may obtain a copy of
> + * the License at
> + * 
> + * http://www.apache.org/licenses/LICENSE-2.0
> + * 
>   * Unless required by applicable law or agreed to in writing, software
> - * distributed under the License is distributed on an "AS IS" BASIS,
> - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> - * See the License for the specific language governing permissions and
> - * limitations under the License.
> + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
> + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
> + * License for the specific language governing permissions and limitations under
> + * the License.
>   */
>  package wicket.jmx;
>  
> -import java.lang.management.ManagementFactory;
>  import java.util.ArrayList;
>  import java.util.List;
>  
> @@ -24,6 +21,7 @@
>  import javax.management.InstanceNotFoundException;
>  import javax.management.MBeanRegistrationException;
>  import javax.management.MBeanServer;
> +import javax.management.MBeanServerFactory;
>  import javax.management.MalformedObjectNameException;
>  import javax.management.NotCompliantMBeanException;
>  import javax.management.ObjectName;
> @@ -37,13 +35,36 @@
>  
>  /**
>   * Registers Wicket's MBeans.
> + * <p>
> + * Users can specify the MBeanServer implementation in which to register the
> + * MBeans by setting the <code>wicket.mbean.server.impl</code> property to the
> + * class name of the MBeanServer implementation they want. This is needed since
> + * running an application server like JBoss with Java 1.5 causes more than one
> + * MBeanServer to be created (the JVM one and the JBoss one). It is recognized
> + * that there could possibly be more than one instance of an MBeanServer for a
> + * given implementation class, but the assumption is that such a situation is
> + * rare. In the event that such a situation is encountered, the first instance
> + * encountered in the list returned by
> + * <code>MBeanServerFactory.findMBeanServer(null)</code> is used. This
> + * algorithm should handle most situations. Here is a list of known MBeanServer
> + * implementation class names:
> + * <ul>
> + * <li>Java 1.5 JVM - com.sun.jmx.mbeanserver.JmxMBeanServer</li>
> + * <li>JBoss - org.jboss.mx.server.MBeanServerImpl</li>
> + * </ul>
> + * </p>
>   * 
>   * @author eelcohillenius
> + * @author David Hosier
>   */
>  public class Initializer implements IInitializer, IDestroyer
>  {
>  	private static Log log = LogFactory.getLog(Initializer.class);
>  
> +	// It's best to store a reference to the MBeanServer rather than getting it
> +	// over and over
> +	private MBeanServer mbeanServer = null;
> +
>  	/**
>  	 * List of registered names
>  	 */
> @@ -54,20 +75,22 @@
>  	 */
>  	public void destroy(wicket.Application application)
>  	{
> -		MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
> -		for (ObjectName objectName : registered)
> +		if (mbeanServer != null)
>  		{
> -			try
> +			for (ObjectName objectName : registered)
>  			{
> -				mbs.unregisterMBean(objectName);
> -			}
> -			catch (InstanceNotFoundException e)
> -			{
> -				log.error(e.getMessage(), e);
> -			}
> -			catch (MBeanRegistrationException e)
> -			{
> -				log.error(e.getMessage(), e);
> +				try
> +				{
> +					mbeanServer.unregisterMBean(objectName);
> +				}
> +				catch (InstanceNotFoundException e)
> +				{
> +					log.error(e.getMessage(), e);
> +				}
> +				catch (MBeanRegistrationException e)
> +				{
> +					log.error(e.getMessage(), e);
> +				}
>  			}
>  		}
>  	}
> @@ -75,12 +98,55 @@
>  	/**
>  	 * @see wicket.IInitializer#init(wicket.Application)
>  	 */
> +	@SuppressWarnings("unchecked")
>  	public void init(wicket.Application application)
>  	{
> +		/*
> +		 * This method uses the wicket.mbean.server.impl property to know which
> +		 * MBeanServer to get, but it could just as easily allow users to
> +		 * specify the MBeanServer per Application by changing the line:
> +		 * 
> +		 * String mbeanServerImplClass =
> +		 * System.getProperty("wicket.mbean.server.impl");
> +		 * 
> +		 * TO
> +		 * 
> +		 * String mbeanServerImplClass =
> +		 * System.getProperty(System.getProperty("wicket." + name +
> +		 * ".mbean.server.impl"), "wicket.mbean.server.impl");
> +		 * 
> +		 * That will allow users to specify a per application MBeanServer
> +		 * implemenation class. However, the global reference to the MBeanServer
> +		 * will have to be changed to maybe like a HashMap where the key is the
> +		 * Application name and the value is the reference to that Application's
> +		 * specified MBeanServer.
> +		 */
> +
>  		try
>  		{
>  			String name = application.getName();
> -			MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
> +			ArrayList<MBeanServer> mbeanServers = (ArrayList<MBeanServer>)MBeanServerFactory
> +					.findMBeanServer(null);
> +
> +			mbeanServer = mbeanServers.get(0); // set the MBeanServer to the
> +												// zero entry as a default
> +			String mbeanServerImplClass = System.getProperty("wicket.mbean.server.impl");
> +			if (mbeanServerImplClass != null)
> +			{
> +				for (MBeanServer mbs : mbeanServers)
> +				{
> +					if (mbs.getClass().getName().equals(mbeanServerImplClass))
> +					{
> +						mbeanServer = mbs;
> +						/*
> +						 * this will cause the first instance to be accepted in
> +						 * the case that there is more than one MBeanServer of
> +						 * the given implementation Class
> +						 */
> +						break;
> +					}
> +				}
> +			}
>  
>  			// register top level application object, but first check whether
>  			// multiple instances of the same application (name) are running and
> @@ -89,7 +155,7 @@
>  			ObjectName appBeanName = new ObjectName(domain + ":type=Application");
>  			String tempDomain = domain;
>  			int i = 0;
> -			while (mbs.isRegistered(appBeanName))
> +			while (mbeanServer.isRegistered(appBeanName))
>  			{
>  				tempDomain = name + "-" + i++;
>  				appBeanName = new ObjectName(tempDomain + ":type=Application");
> @@ -97,30 +163,30 @@
>  			domain = tempDomain;
>  
>  			Application appBean = new Application(application);
> -			register(mbs, appBean, appBeanName);
> +			register(mbeanServer, appBean, appBeanName);
>  
> -			register(mbs, new ApplicationSettings(application), new ObjectName(domain
> +			register(mbeanServer, new ApplicationSettings(application), new ObjectName(domain
>  					+ ":type=Application,name=ApplicationSettings"));
> -			register(mbs, new DebugSettings(application), new ObjectName(domain
> +			register(mbeanServer, new DebugSettings(application), new ObjectName(domain
>  					+ ":type=Application,name=DebugSettings"));
> -			register(mbs, new MarkupSettings(application), new ObjectName(domain
> +			register(mbeanServer, new MarkupSettings(application), new ObjectName(domain
>  					+ ":type=Application,name=MarkupSettings"));
> -			register(mbs, new ResourceSettings(application), new ObjectName(domain
> +			register(mbeanServer, new ResourceSettings(application), new ObjectName(domain
>  					+ ":type=Application,name=ResourceSettings"));
> -			register(mbs, new PageSettings(application), new ObjectName(domain
> +			register(mbeanServer, new PageSettings(application), new ObjectName(domain
>  					+ ":type=Application,name=PageSettings"));
> -			register(mbs, new RequestCycleSettings(application), new ObjectName(domain
> +			register(mbeanServer, new RequestCycleSettings(application), new ObjectName(domain
>  					+ ":type=Application,name=RequestCycleSettings"));
> -			register(mbs, new SecuritySettings(application), new ObjectName(domain
> +			register(mbeanServer, new SecuritySettings(application), new ObjectName(domain
>  					+ ":type=Application,name=SecuritySettings"));
> -			register(mbs, new SessionSettings(application), new ObjectName(domain
> +			register(mbeanServer, new SessionSettings(application), new ObjectName(domain
>  					+ ":type=Application,name=SessionSettings"));
> -			register(mbs, new CookieValuePersisterSettings(application), new ObjectName(domain
> -					+ ":type=Application,name=CookieValuePersisterSettings"));
> +			register(mbeanServer, new CookieValuePersisterSettings(application), new ObjectName(
> +					domain + ":type=Application,name=CookieValuePersisterSettings"));
>  
>  			RequestLogger sessionsBean = new RequestLogger(application);
>  			ObjectName sessionsBeanName = new ObjectName(domain + ":type=RequestLogger");
> -			register(mbs, sessionsBean, sessionsBeanName);
> +			register(mbeanServer, sessionsBean, sessionsBeanName);
>  		}
>  		catch (MalformedObjectNameException e)
>  		{
> @@ -143,6 +209,7 @@
>  	/**
>  	 * @see java.lang.Object#toString()
>  	 */
> +	@Override
>  	public String toString()
>  	{
>  		return "Wicket JMX initializer";
> 
> Modified: incubator/wicket/trunk/wicket/src/main/java/wicket/jmx/Initializer.java
> URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/wicket/src/main/java/wicket/jmx/Initializer.java?view=diff&rev=492845&r1=492844&r2=492845
> ==============================================================================
> --- incubator/wicket/trunk/wicket/src/main/java/wicket/jmx/Initializer.java (original)
> +++ incubator/wicket/trunk/wicket/src/main/java/wicket/jmx/Initializer.java Thu Jan  4 18:04:40 2007
> @@ -1,22 +1,19 @@
>  /*
> - * Licensed to the Apache Software Foundation (ASF) under one or more
> - * contributor license agreements.  See the NOTICE file distributed with
> - * this work for additional information regarding copyright ownership.
> - * The ASF licenses this file to You under the Apache License, Version 2.0
> - * (the "License"); you may not use this file except in compliance with
> - * the License.  You may obtain a copy of the License at
> - *
> - *      http://www.apache.org/licenses/LICENSE-2.0
> - *
> + * ==============================================================================
> + * Licensed under the Apache License, Version 2.0 (the "License"); you may not
> + * use this file except in compliance with the License. You may obtain a copy of
> + * the License at
> + * 
> + * http://www.apache.org/licenses/LICENSE-2.0
> + * 
>   * Unless required by applicable law or agreed to in writing, software
> - * distributed under the License is distributed on an "AS IS" BASIS,
> - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> - * See the License for the specific language governing permissions and
> - * limitations under the License.
> + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
> + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
> + * License for the specific language governing permissions and limitations under
> + * the License.
>   */
>  package wicket.jmx;
>  
> -import java.lang.management.ManagementFactory;
>  import java.util.ArrayList;
>  import java.util.List;
>  
> @@ -24,6 +21,7 @@
>  import javax.management.InstanceNotFoundException;
>  import javax.management.MBeanRegistrationException;
>  import javax.management.MBeanServer;
> +import javax.management.MBeanServerFactory;
>  import javax.management.MalformedObjectNameException;
>  import javax.management.NotCompliantMBeanException;
>  import javax.management.ObjectName;
> @@ -37,13 +35,36 @@
>  
>  /**
>   * Registers Wicket's MBeans.
> + * <p>
> + * Users can specify the MBeanServer implementation in which to register the
> + * MBeans by setting the <code>wicket.mbean.server.impl</code> property to the
> + * class name of the MBeanServer implementation they want. This is needed since
> + * running an application server like JBoss with Java 1.5 causes more than one
> + * MBeanServer to be created (the JVM one and the JBoss one). It is recognized
> + * that there could possibly be more than one instance of an MBeanServer for a
> + * given implementation class, but the assumption is that such a situation is
> + * rare. In the event that such a situation is encountered, the first instance
> + * encountered in the list returned by
> + * <code>MBeanServerFactory.findMBeanServer(null)</code> is used. This
> + * algorithm should handle most situations. Here is a list of known MBeanServer
> + * implementation class names:
> + * <ul>
> + * <li>Java 1.5 JVM - com.sun.jmx.mbeanserver.JmxMBeanServer</li>
> + * <li>JBoss - org.jboss.mx.server.MBeanServerImpl</li>
> + * </ul>
> + * </p>
>   * 
>   * @author eelcohillenius
> + * @author David Hosier
>   */
>  public class Initializer implements IInitializer, IDestroyer
>  {
>  	private static Logger log = LoggerFactory.getLogger(Initializer.class);
>  
> +	// It's best to store a reference to the MBeanServer rather than getting it
> +	// over and over
> +	private MBeanServer mbeanServer = null;
> +
>  	/**
>  	 * List of registered names
>  	 */
> @@ -54,20 +75,22 @@
>  	 */
>  	public void destroy(wicket.Application application)
>  	{
> -		MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
> -		for (ObjectName objectName : registered)
> +		if (mbeanServer != null)
>  		{
> -			try
> +			for (ObjectName objectName : registered)
>  			{
> -				mbs.unregisterMBean(objectName);
> -			}
> -			catch (InstanceNotFoundException e)
> -			{
> -				log.error(e.getMessage(), e);
> -			}
> -			catch (MBeanRegistrationException e)
> -			{
> -				log.error(e.getMessage(), e);
> +				try
> +				{
> +					mbeanServer.unregisterMBean(objectName);
> +				}
> +				catch (InstanceNotFoundException e)
> +				{
> +					log.error(e.getMessage(), e);
> +				}
> +				catch (MBeanRegistrationException e)
> +				{
> +					log.error(e.getMessage(), e);
> +				}
>  			}
>  		}
>  	}
> @@ -75,12 +98,55 @@
>  	/**
>  	 * @see wicket.IInitializer#init(wicket.Application)
>  	 */
> +	@SuppressWarnings("unchecked")
>  	public void init(wicket.Application application)
>  	{
> +		/*
> +		 * This method uses the wicket.mbean.server.impl property to know which
> +		 * MBeanServer to get, but it could just as easily allow users to
> +		 * specify the MBeanServer per Application by changing the line:
> +		 * 
> +		 * String mbeanServerImplClass =
> +		 * System.getProperty("wicket.mbean.server.impl");
> +		 * 
> +		 * TO
> +		 * 
> +		 * String mbeanServerImplClass =
> +		 * System.getProperty(System.getProperty("wicket." + name +
> +		 * ".mbean.server.impl"), "wicket.mbean.server.impl");
> +		 * 
> +		 * That will allow users to specify a per application MBeanServer
> +		 * implemenation class. However, the global reference to the MBeanServer
> +		 * will have to be changed to maybe like a HashMap where the key is the
> +		 * Application name and the value is the reference to that Application's
> +		 * specified MBeanServer.
> +		 */
> +
>  		try
>  		{
>  			String name = application.getName();
> -			MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
> +			ArrayList<MBeanServer> mbeanServers = (ArrayList<MBeanServer>)MBeanServerFactory
> +					.findMBeanServer(null);
> +
> +			mbeanServer = mbeanServers.get(0); // set the MBeanServer to the
> +			// zero entry as a default
> +			String mbeanServerImplClass = System.getProperty("wicket.mbean.server.impl");
> +			if (mbeanServerImplClass != null)
> +			{
> +				for (MBeanServer mbs : mbeanServers)
> +				{
> +					if (mbs.getClass().getName().equals(mbeanServerImplClass))
> +					{
> +						mbeanServer = mbs;
> +						/*
> +						 * this will cause the first instance to be accepted in
> +						 * the case that there is more than one MBeanServer of
> +						 * the given implementation Class
> +						 */
> +						break;
> +					}
> +				}
> +			}
>  
>  			// register top level application object, but first check whether
>  			// multiple instances of the same application (name) are running and
> @@ -89,7 +155,7 @@
>  			ObjectName appBeanName = new ObjectName(domain + ":type=Application");
>  			String tempDomain = domain;
>  			int i = 0;
> -			while (mbs.isRegistered(appBeanName))
> +			while (mbeanServer.isRegistered(appBeanName))
>  			{
>  				tempDomain = name + "-" + i++;
>  				appBeanName = new ObjectName(tempDomain + ":type=Application");
> @@ -97,30 +163,30 @@
>  			domain = tempDomain;
>  
>  			Application appBean = new Application(application);
> -			register(mbs, appBean, appBeanName);
> +			register(mbeanServer, appBean, appBeanName);
>  
> -			register(mbs, new ApplicationSettings(application), new ObjectName(domain
> +			register(mbeanServer, new ApplicationSettings(application), new ObjectName(domain
>  					+ ":type=Application,name=ApplicationSettings"));
> -			register(mbs, new DebugSettings(application), new ObjectName(domain
> +			register(mbeanServer, new DebugSettings(application), new ObjectName(domain
>  					+ ":type=Application,name=DebugSettings"));
> -			register(mbs, new MarkupSettings(application), new ObjectName(domain
> +			register(mbeanServer, new MarkupSettings(application), new ObjectName(domain
>  					+ ":type=Application,name=MarkupSettings"));
> -			register(mbs, new ResourceSettings(application), new ObjectName(domain
> +			register(mbeanServer, new ResourceSettings(application), new ObjectName(domain
>  					+ ":type=Application,name=ResourceSettings"));
> -			register(mbs, new PageSettings(application), new ObjectName(domain
> +			register(mbeanServer, new PageSettings(application), new ObjectName(domain
>  					+ ":type=Application,name=PageSettings"));
> -			register(mbs, new RequestCycleSettings(application), new ObjectName(domain
> +			register(mbeanServer, new RequestCycleSettings(application), new ObjectName(domain
>  					+ ":type=Application,name=RequestCycleSettings"));
> -			register(mbs, new SecuritySettings(application), new ObjectName(domain
> +			register(mbeanServer, new SecuritySettings(application), new ObjectName(domain
>  					+ ":type=Application,name=SecuritySettings"));
> -			register(mbs, new SessionSettings(application), new ObjectName(domain
> +			register(mbeanServer, new SessionSettings(application), new ObjectName(domain
>  					+ ":type=Application,name=SessionSettings"));
> -			register(mbs, new CookieValuePersisterSettings(application), new ObjectName(domain
> -					+ ":type=Application,name=CookieValuePersisterSettings"));
> +			register(mbeanServer, new CookieValuePersisterSettings(application), new ObjectName(
> +					domain + ":type=Application,name=CookieValuePersisterSettings"));
>  
>  			RequestLogger sessionsBean = new RequestLogger(application);
>  			ObjectName sessionsBeanName = new ObjectName(domain + ":type=RequestLogger");
> -			register(mbs, sessionsBean, sessionsBeanName);
> +			register(mbeanServer, sessionsBean, sessionsBeanName);
>  		}
>  		catch (MalformedObjectNameException e)
>  		{
> 
> 
>