This is very neat stuff. A quibble: I think the ObjectName should be "org.apache.tapestry5:service=PagePool" (i.e., reflecting that PagePool here is the service id, not the service interface).
On Wed, May 26, 2010 at 12:05 AM, <[email protected]> wrote: > Author: drobiazko > Date: Wed May 26 07:05:38 2010 > New Revision: 948348 > > URL: http://svn.apache.org/viewvc?rev=948348&view=rev > Log: > TAP5-978: Provide remote management of the page pool settings > > Added: > > tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/MBeanSupport.java > (with props) > > tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/MBeanSupportImpl.java > (with props) > > tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PagePoolImplMBean.java > (with props) > > tapestry/tapestry5/trunk/tapestry-core/src/test/app1/RemotePoolManagement.tml > > tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/RemotePoolManagement.java > (with props) > Modified: > > tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalModule.java > > tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PagePoolImpl.java > > tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/CoreBehaviorsTests.java > > tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java > > Modified: > tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalModule.java > URL: > http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalModule.java?rev=948348&r1=948347&r2=948348&view=diff > ============================================================================== > --- > tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalModule.java > (original) > +++ > tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalModule.java > Wed May 26 07:05:38 2010 > @@ -14,6 +14,7 @@ > > package org.apache.tapestry5.internal.services; > > +import javax.management.ObjectName; > import javax.servlet.http.Cookie; > > import org.apache.tapestry5.SymbolConstants; > @@ -36,6 +37,7 @@ import org.apache.tapestry5.ioc.services > import org.apache.tapestry5.ioc.services.ClasspathURLConverter; > import org.apache.tapestry5.ioc.services.PerthreadManager; > import org.apache.tapestry5.ioc.services.PropertyShadowBuilder; > +import org.apache.tapestry5.ioc.services.RegistryShutdownHub; > import org.apache.tapestry5.services.*; > import org.apache.tapestry5.services.templates.ComponentTemplateLocator; > import org.slf4j.Logger; > @@ -170,7 +172,9 @@ public class InternalModule > InvalidationEventHub templatesHub, > > @ComponentMessages > - InvalidationEventHub messagesHub) > + InvalidationEventHub messagesHub, > + > + MBeanSupport managedBeanSupport) > { > // This covers invalidations due to changes to classes > > @@ -188,6 +192,29 @@ public class InternalModule > > updateListenerHub.addUpdateListener(service); > > + final ObjectName objectName = > buildObjectName("org.apache.tapestry5:type=PagePool"); > + > + managedBeanSupport.register(service, objectName); > + > + return service; > + } > + > + private ObjectName buildObjectName(String name) > + { > + try > + { > + return new ObjectName(name); > + } > + catch (Exception e) > + { > + throw new RuntimeException(e); > + } > + } > + > + public MBeanSupport buildMBeanSupport(RegistryShutdownHub shutdownHub, > @Autobuild MBeanSupportImpl service) > + { > + shutdownHub.addRegistryShutdownListener(service); > + > return service; > } > > > Added: > tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/MBeanSupport.java > URL: > http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/MBeanSupport.java?rev=948348&view=auto > ============================================================================== > --- > tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/MBeanSupport.java > (added) > +++ > tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/MBeanSupport.java > Wed May 26 07:05:38 2010 > @@ -0,0 +1,42 @@ > +// Copyright 20010 The Apache Software Foundation > +// > +// 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. > + > +package org.apache.tapestry5.internal.services; > + > +import javax.management.ObjectName; > + > +/** > + * Creates an MBean server and registers MBeans with the created server. The > registered MBeans are unregistered when Registry is shut down. > + * > + * @since 5.2.0 > + */ > +public interface MBeanSupport > +{ > + > + /** > + * Registers the specified MBean with the server. > + * > + * @param bean the MBean instance > + * @param objectName the name for the MBean > + */ > + void register(final Object bean, final ObjectName objectName); > + > + /** > + * Unregisters the specified MBean from the server. > + * > + * @param objectName the name for the MBean > + */ > + void unregister(final ObjectName objectName); > + > +} > \ No newline at end of file > > Propchange: > tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/MBeanSupport.java > ------------------------------------------------------------------------------ > svn:eol-style = native > > Propchange: > tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/MBeanSupport.java > ------------------------------------------------------------------------------ > svn:mime-type = text/plain > > Added: > tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/MBeanSupportImpl.java > URL: > http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/MBeanSupportImpl.java?rev=948348&view=auto > ============================================================================== > --- > tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/MBeanSupportImpl.java > (added) > +++ > tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/MBeanSupportImpl.java > Wed May 26 07:05:38 2010 > @@ -0,0 +1,101 @@ > +// Copyright 20010 The Apache Software Foundation > +// > +// 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. > + > +package org.apache.tapestry5.internal.services; > + > +import static java.lang.String.format; > + > +import java.lang.management.ManagementFactory; > +import java.util.List; > +import java.util.Set; > + > +import javax.management.MBeanServer; > +import javax.management.MBeanServerFactory; > +import javax.management.ObjectInstance; > +import javax.management.ObjectName; > + > +import org.apache.tapestry5.ioc.internal.util.CollectionFactory; > +import org.apache.tapestry5.ioc.services.RegistryShutdownListener; > +import org.slf4j.Logger; > + > +public class MBeanSupportImpl implements MBeanSupport, > RegistryShutdownListener > +{ > + private Logger logger; > + > + private MBeanServer server; > + > + private final Set<ObjectName> registeredBeans = > CollectionFactory.newSet(); > + > + public MBeanSupportImpl(Logger logger) > + { > + this.logger = logger; > + > + // TODO: Agent Id should be configurable > + final List<MBeanServer> servers = > MBeanServerFactory.findMBeanServer(null); > + > + if (servers != null && 0 < servers.size()) > + { > + this.server = servers.get(0); > + } > + > + if (this.server == null) > + { > + this.server = ManagementFactory.getPlatformMBeanServer(); > + } > + } > + > + public void register(final Object object, final ObjectName objectName) > + { > + try > + { > + this.server.registerMBean(object, objectName); > + > + this.registeredBeans.add(objectName); > + > + this.logger.info(format("Registered MBean '%s' with server", > objectName)); > + } > + catch (final Exception e) > + { > + this.logger.error(format("Failed to register MBean '%s' with > server", objectName), e); > + } > + } > + > + public void unregister(final ObjectName objectName) > + { > + if (this.server.isRegistered(objectName)) > + { > + try > + { > + this.server.unregisterMBean(objectName); > + > + this.logger.info(format("Unegistered MBean '%s' from > server", objectName)); > + } > + catch (final Exception e) > + { > + this.logger.error(String.format("Failed to unregister MBean > '%s' from server", objectName), e); > + } > + } > + } > + > + public void registryDidShutdown() > + { > + for (final ObjectName name : this.registeredBeans) > + { > + unregister(name); > + } > + > + this.registeredBeans.clear(); > + > + } > +} > > Propchange: > tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/MBeanSupportImpl.java > ------------------------------------------------------------------------------ > svn:eol-style = native > > Propchange: > tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/MBeanSupportImpl.java > ------------------------------------------------------------------------------ > svn:mime-type = text/plain > > Modified: > tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PagePoolImpl.java > URL: > http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PagePoolImpl.java?rev=948348&r1=948347&r2=948348&view=diff > ============================================================================== > --- > tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PagePoolImpl.java > (original) > +++ > tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PagePoolImpl.java > Wed May 26 07:05:38 2010 > @@ -14,6 +14,7 @@ > > package org.apache.tapestry5.internal.services; > > +import org.apache.tapestry5.SymbolConstants; > import org.apache.tapestry5.internal.structure.Page; > import org.apache.tapestry5.ioc.annotations.IntermediateType; > import org.apache.tapestry5.ioc.annotations.Symbol; > @@ -47,7 +48,7 @@ import java.util.Map; > * > * @see org.apache.tapestry5.internal.services.PagePoolCache > */ > -public class PagePoolImpl implements PagePool, InvalidationListener, > UpdateListener > +public class PagePoolImpl implements PagePool, InvalidationListener, > UpdateListener, PagePoolImplMBean > { > private final Logger logger; > > @@ -55,13 +56,13 @@ public class PagePoolImpl implements Pag > > private final ThreadLocale threadLocale; > > - private final int softLimit; > + private int softLimit; > > - private final long softWait; > + private long softWait; > > - private final int hardLimit; > + private int hardLimit; > > - private final long activeWindow; > + private long activeWindow; > > private final Map<PageLocator, PagePoolCache> pool = > CollectionFactory.newMap(); > > @@ -71,16 +72,16 @@ public class PagePoolImpl implements Pag > > ThreadLocale threadLocale, > > - �...@symbol("tapestry.page-pool.soft-limit") > + �...@symbol(SymbolConstants.PAGE_POOL_SOFT_LIMIT) > int softLimit, > > - �...@symbol("tapestry.page-pool.soft-wait") > @IntermediateType(TimeInterval.class) > + �...@symbol(SymbolConstants.PAGE_POOL_SOFT_WAIT) > @IntermediateType(TimeInterval.class) > long softWait, > > - �...@symbol("tapestry.page-pool.hard-limit") > + �...@symbol(SymbolConstants.PAGE_POOL_HARD_LIMIT) > int hardLimit, > > - �...@symbol("tapestry.page-pool.active-window") > @IntermediateType(TimeInterval.class) > + �...@symbol(SymbolConstants.PAGE_POOL_ACTIVE_WINDOW) > @IntermediateType(TimeInterval.class) > long activeWindow) > { > this.logger = logger; > @@ -165,4 +166,53 @@ public class PagePoolImpl implements Pag > cache.cleanup(); > } > } > + > + public int getSoftLimit() > + { > + return softLimit; > + } > + > + public void setSoftLimit(int softLimit) > + { > + this.softLimit = softLimit; > + > + objectWasInvalidated(); > + } > + > + public long getSoftWait() > + { > + return softWait; > + } > + > + public void setSoftWait(long softWait) > + { > + this.softWait = softWait; > + > + objectWasInvalidated(); > + } > + > + public int getHardLimit() > + { > + return hardLimit; > + } > + > + public void setHardLimit(int hardLimit) > + { > + this.hardLimit = hardLimit; > + > + objectWasInvalidated(); > + } > + > + public long getActiveWindow() > + { > + return activeWindow; > + } > + > + public void setActiveWindow(long activeWindow) > + { > + this.activeWindow = activeWindow; > + > + objectWasInvalidated(); > + } > + > } > > Added: > tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PagePoolImplMBean.java > URL: > http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PagePoolImplMBean.java?rev=948348&view=auto > ============================================================================== > --- > tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PagePoolImplMBean.java > (added) > +++ > tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PagePoolImplMBean.java > Wed May 26 07:05:38 2010 > @@ -0,0 +1,78 @@ > +// Copyright 2010 The Apache Software Foundation > +// > +// 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. > +package org.apache.tapestry5.internal.services; > + > + > + > +/** > + * Exposes page pool settings as managed properties of a MBean. > + * > + * @since 5.2.0 > + */ > +public interface PagePoolImplMBean > +{ > + /** > + * Returns the soft limit. > + * > + * @see org.apache.tapestry5.SymbolConstants#PAGE_POOL_SOFT_LIMIT > + */ > + int getSoftLimit(); > + > + /** > + * Sets the soft limit. > + */ > + void setSoftLimit(int softLimit); > + > + /** > + * Returns the soft wait. > + * > + * @see org.apache.tapestry5.SymbolConstants#PAGE_POOL_SOFT_WAIT > + */ > + long getSoftWait(); > + > + /** > + * Sets the soft wait. > + */ > + void setSoftWait(long softWait); > + > + /** > + * Returns the hard limit. > + * > + * @see org.apache.tapestry5.SymbolConstants#PAGE_POOL_HARD_LIMIT > + * > + * @deprecated The hard limit will be removed in a later release of > Tapestry, as the maximum number of instance > + * is easily controlled by limiting the number of request > handling threads in the servlet container. > + */ > + int getHardLimit(); > + > + /** > + * Sets the hard limit. > + * > + * @deprecated The hard limit will be removed in a later release of > Tapestry, as the maximum number of instance > + * is easily controlled by limiting the number of request > handling threads in the servlet container. > + */ > + void setHardLimit(int hardLimit); > + > + /** > + * Returns the active window. > + * > + * @see org.apache.tapestry5.SymbolConstants#PAGE_POOL_ACTIVE_WINDOW > + */ > + long getActiveWindow(); > + > + /** > + * Sets the active window. > + */ > + void setActiveWindow(long activeWindow); > +} > > Propchange: > tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PagePoolImplMBean.java > ------------------------------------------------------------------------------ > svn:eol-style = native > > Propchange: > tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PagePoolImplMBean.java > ------------------------------------------------------------------------------ > svn:mime-type = text/plain > > Added: > tapestry/tapestry5/trunk/tapestry-core/src/test/app1/RemotePoolManagement.tml > URL: > http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/app1/RemotePoolManagement.tml?rev=948348&view=auto > ============================================================================== > --- > tapestry/tapestry5/trunk/tapestry-core/src/test/app1/RemotePoolManagement.tml > (added) > +++ > tapestry/tapestry5/trunk/tapestry-core/src/test/app1/RemotePoolManagement.tml > Wed May 26 07:05:38 2010 > @@ -0,0 +1,7 @@ > +<html t:type="Border" > xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd"> > + > + <h1>Remote Pool Management Demo</h1> > + > + <p>SoftWait: ${softWait}</p> > + > +</html> > \ No newline at end of file > > Modified: > tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/CoreBehaviorsTests.java > URL: > http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/CoreBehaviorsTests.java?rev=948348&r1=948347&r2=948348&view=diff > ============================================================================== > --- > tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/CoreBehaviorsTests.java > (original) > +++ > tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/CoreBehaviorsTests.java > Wed May 26 07:05:38 2010 > @@ -1488,4 +1488,13 @@ public class CoreBehaviorsTests extends > assertText("id=no-override", "[pre-app]"); > assertText("id=override", "[app]"); > } > + > + /** TAP5-978 */ > + �...@test > + public void remote_pool_management() > + { > + clickThru("Remote Pool Management"); > + > + assertTextPresent("SoftWait: 10"); > + } > } > > Modified: > tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java > URL: > http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java?rev=948348&r1=948347&r2=948348&view=diff > ============================================================================== > --- > tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java > (original) > +++ > tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java > Wed May 26 07:05:38 2010 > @@ -435,7 +435,9 @@ public class Index > new Item("unavailablecomponentdemo", "Report Location of > Unavailable Component", > "Report Location of Unavailable Component"), > > - new Item("discardafterdemo", "@DiscardAfter Demo", "Demo > using @DiscardAfter annotation") > + new Item("discardafterdemo", "@DiscardAfter Demo", "Demo > using @DiscardAfter annotation"), > + > + new Item("remotepoolmanagement", "Remote Pool > Management", "Proves that Page Pool MBean is registered") > > ); > > > Added: > tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/RemotePoolManagement.java > URL: > http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/RemotePoolManagement.java?rev=948348&view=auto > ============================================================================== > --- > tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/RemotePoolManagement.java > (added) > +++ > tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/RemotePoolManagement.java > Wed May 26 07:05:38 2010 > @@ -0,0 +1,31 @@ > +// Copyright 2010 The Apache Software Foundation > +// > +// 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. > +package org.apache.tapestry5.integration.app1.pages; > + > +import java.lang.management.ManagementFactory; > + > +import javax.management.MBeanServer; > +import javax.management.ObjectName; > + > +public class RemotePoolManagement > +{ > + > + public Object getSoftWait() throws Exception > + { > + MBeanServer server = ManagementFactory.getPlatformMBeanServer(); > + > + return server.getAttribute(new > ObjectName("org.apache.tapestry5:type=PagePool"), "SoftWait"); > + } > + > +} > > Propchange: > tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/RemotePoolManagement.java > ------------------------------------------------------------------------------ > svn:eol-style = native > > Propchange: > tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/RemotePoolManagement.java > ------------------------------------------------------------------------------ > svn:mime-type = text/plain > > > -- Howard M. Lewis Ship Creator of Apache Tapestry The source for Tapestry training, mentoring and support. Contact me to learn how I can get you up and productive in Tapestry fast! (971) 678-5210 http://howardlewisship.com --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
