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