You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2011/10/15 00:03:17 UTC
svn commit: r1183526 - in /tapestry/tapestry5/trunk/tapestry-ioc/src:
main/java/org/apache/tapestry5/ioc/internal/
main/java/org/apache/tapestry5/ioc/internal/services/
main/java/org/apache/tapestry5/ioc/internal/services/cron/
main/java/org/apache/tap...
Author: hlship
Date: Fri Oct 14 22:03:16 2011
New Revision: 1183526
URL: http://svn.apache.org/viewvc?rev=1183526&view=rev
Log:
TAP5-1539: Add registry will shutdown notifications
Deprecated RegistyDidShutdownListener ... a Runnable will due as well
Added methods to registry Runnables as "did" and "will" shutdown listeners
Modified:
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/RegistryImpl.java
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/RegistryShutdownHubImpl.java
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/cron/PeriodicExecutorImpl.java
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/RegistryShutdownHub.java
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/RegistryShutdownListener.java
tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/RegistryShutdownHubImplTest.java
Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/RegistryImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/RegistryImpl.java?rev=1183526&r1=1183525&r2=1183526&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/RegistryImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/RegistryImpl.java Fri Oct 14 22:03:16 2011
@@ -885,6 +885,20 @@ public class RegistryImpl implements Reg
registryShutdownHub.addRegistryShutdownListener(listener);
}
+ public void addRegistryShutdownListener(Runnable listener)
+ {
+ lock.check();
+
+ registryShutdownHub.addRegistryShutdownListener(listener);
+ }
+
+ public void addRegistryWillShutdownListener(Runnable listener)
+ {
+ lock.check();
+
+ registryShutdownHub.addRegistryWillShutdownListener(listener);
+ }
+
public String expandSymbols(String input)
{
lock.check();
Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/RegistryShutdownHubImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/RegistryShutdownHubImpl.java?rev=1183526&r1=1183525&r2=1183526&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/RegistryShutdownHubImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/RegistryShutdownHubImpl.java Fri Oct 14 22:03:16 2011
@@ -1,4 +1,4 @@
-// Copyright 2006, 2007 The Apache Software Foundation
+// Copyright 2006, 2007, 2011 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.
@@ -14,7 +14,8 @@
package org.apache.tapestry5.ioc.internal.services;
-import static org.apache.tapestry5.ioc.internal.util.CollectionFactory.newThreadSafeList;
+import org.apache.tapestry5.func.F;
+import org.apache.tapestry5.func.Worker;
import org.apache.tapestry5.ioc.internal.util.OneShotLock;
import org.apache.tapestry5.ioc.services.RegistryShutdownHub;
import org.apache.tapestry5.ioc.services.RegistryShutdownListener;
@@ -22,26 +23,54 @@ import org.slf4j.Logger;
import java.util.List;
+import static org.apache.tapestry5.ioc.internal.util.CollectionFactory.newThreadSafeList;
+
public class RegistryShutdownHubImpl implements RegistryShutdownHub
{
private final OneShotLock lock = new OneShotLock();
private final Logger logger;
- private final List<RegistryShutdownListener> listeners = newThreadSafeList();
+ private final List<Runnable> listeners = newThreadSafeList();
+
+ private final List<Runnable> preListeners = newThreadSafeList();
public RegistryShutdownHubImpl(Logger logger)
{
this.logger = logger;
}
- public void addRegistryShutdownListener(RegistryShutdownListener listener)
+ public void addRegistryShutdownListener(final RegistryShutdownListener listener)
+ {
+ assert listener != null;
+
+ addRegistryShutdownListener(new Runnable()
+ {
+ public void run()
+ {
+ listener.registryDidShutdown();
+ }
+ });
+ }
+
+ public void addRegistryShutdownListener(Runnable listener)
{
+ assert listener != null;
+
lock.check();
listeners.add(listener);
}
+ public void addRegistryWillShutdownListener(Runnable listener)
+ {
+ assert listener != null;
+
+ lock.check();
+
+ preListeners.add(listener);
+ }
+
/**
* Fires the {@link RegistryShutdownListener#registryDidShutdown()} method on each listener. At the end, all the
* listeners are discarded.
@@ -50,18 +79,21 @@ public class RegistryShutdownHubImpl imp
{
lock.lock();
- for (RegistryShutdownListener l : listeners)
+ F.flow(preListeners).concat(listeners).each(new Worker<Runnable>()
{
- try
- {
- l.registryDidShutdown();
- }
- catch (Exception ex)
+ public void work(Runnable element)
{
- logger.error(ServiceMessages.shutdownListenerError(l, ex), ex);
+ try
+ {
+ element.run();
+ } catch (RuntimeException ex)
+ {
+ logger.error(ServiceMessages.shutdownListenerError(element, ex), ex);
+ }
}
- }
+ });
+ preListeners.clear();
listeners.clear();
}
Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/cron/PeriodicExecutorImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/cron/PeriodicExecutorImpl.java?rev=1183526&r1=1183525&r2=1183526&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/cron/PeriodicExecutorImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/cron/PeriodicExecutorImpl.java Fri Oct 14 22:03:16 2011
@@ -19,7 +19,6 @@ import org.apache.tapestry5.ioc.annotati
import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
import org.apache.tapestry5.ioc.services.ParallelExecutor;
import org.apache.tapestry5.ioc.services.RegistryShutdownHub;
-import org.apache.tapestry5.ioc.services.RegistryShutdownListener;
import org.apache.tapestry5.ioc.services.cron.PeriodicExecutor;
import org.apache.tapestry5.ioc.services.cron.PeriodicJob;
import org.apache.tapestry5.ioc.services.cron.Schedule;
@@ -28,7 +27,7 @@ import org.slf4j.Logger;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
-public class PeriodicExecutorImpl implements PeriodicExecutor, Runnable, RegistryShutdownListener
+public class PeriodicExecutorImpl implements PeriodicExecutor, Runnable
{
private final ParallelExecutor parallelExecutor;
@@ -195,7 +194,13 @@ public class PeriodicExecutorImpl implem
@PostInjection
public void start(RegistryShutdownHub hub)
{
- hub.addRegistryShutdownListener(this);
+ hub.addRegistryShutdownListener(new Runnable()
+ {
+ public void run()
+ {
+ registryDidShutdown();
+ }
+ });
thread.start();
}
Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/RegistryShutdownHub.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/RegistryShutdownHub.java?rev=1183526&r1=1183525&r2=1183526&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/RegistryShutdownHub.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/RegistryShutdownHub.java Fri Oct 14 22:03:16 2011
@@ -1,4 +1,4 @@
-// Copyright 2006 The Apache Software Foundation
+// Copyright 2006, 2011 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.
@@ -23,4 +23,21 @@ public interface RegistryShutdownHub
* Adds a listener for eventual notification.
*/
void addRegistryShutdownListener(RegistryShutdownListener listener);
+
+ /**
+ * Adds a listener for eventual notification when the registry shuts down. Runtime exceptions thrown by the listener
+ * will be logged and ignored.
+ *
+ * @since 5.3
+ */
+ void addRegistryShutdownListener(Runnable listener);
+
+ /**
+ * Adds a listener for eventual notification. RegistryWillShutdownListeners are notified before any standard listeners,
+ * and before service proxies and other parts of the Registry are disabled. Runtime exceptions thrown by the listener will
+ * be logged and ignored.
+ *
+ * @since 5.3
+ */
+ void addRegistryWillShutdownListener(Runnable listener);
}
Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/RegistryShutdownListener.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/RegistryShutdownListener.java?rev=1183526&r1=1183525&r2=1183526&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/RegistryShutdownListener.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/RegistryShutdownListener.java Fri Oct 14 22:03:16 2011
@@ -18,6 +18,9 @@ import java.util.EventListener;
/**
* Event listener interfaces for objects that need to know when the Registry shutsdown.
+ *
+ * @see RegistryShutdownHub#addRegistryShutdownListener(Runnable)
+ * @deprecated In Tapestry 5.3, to be removed in a later release.
*/
public interface RegistryShutdownListener extends EventListener
{
Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/RegistryShutdownHubImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/RegistryShutdownHubImplTest.java?rev=1183526&r1=1183525&r2=1183526&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/RegistryShutdownHubImplTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/RegistryShutdownHubImplTest.java Fri Oct 14 22:03:16 2011
@@ -1,4 +1,4 @@
-// Copyright 2006, 2007 The Apache Software Foundation
+// Copyright 2006, 2007, 2011 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.
@@ -15,12 +15,16 @@
package org.apache.tapestry5.ioc.internal.services;
import org.apache.tapestry5.ioc.internal.IOCInternalTestCase;
+import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
import org.apache.tapestry5.ioc.services.RegistryShutdownListener;
-import static org.easymock.EasyMock.contains;
-import static org.easymock.EasyMock.same;
import org.slf4j.Logger;
import org.testng.annotations.Test;
+import java.util.List;
+
+import static org.easymock.EasyMock.contains;
+import static org.easymock.EasyMock.same;
+
public class RegistryShutdownHubImplTest extends IOCInternalTestCase
{
@@ -46,6 +50,40 @@ public class RegistryShutdownHubImplTest
verify();
}
+ @Test
+ public void pre_listeners_before_normal_listeners()
+ {
+ final List<String> ordering = CollectionFactory.newList();
+
+
+ RegistryShutdownHubImpl hub = new RegistryShutdownHubImpl(null);
+
+ for (int i = 1; i <= 3; i++)
+ {
+ final int k = i;
+
+ hub.addRegistryShutdownListener(new RegistryShutdownListener()
+ {
+ public void registryDidShutdown()
+ {
+ ordering.add("did:" + k);
+ }
+ });
+
+ hub.addRegistryWillShutdownListener(new Runnable()
+ {
+ public void run()
+ {
+ ordering.add("will:" + k);
+ }
+ });
+ }
+
+ hub.fireRegistryDidShutdown();
+
+ assertListsEquals(ordering, "will:1", "will:2", "will:3", "did:1", "did:2", "did:3");
+ }
+
/**
* Shows that multiple listener will be notified, and that an error in one doesn't prevent others from being
* notified.