[jboss-cvs] JBossAS SVN: r111684 - in projects/jboss-jca/trunk: core/src/main/java/org/jboss/jca/core/api/workmanager and 7 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Tue Jun 28 11:14:13 EDT 2011
Author: jesper.pedersen
Date: 2011-06-28 11:14:13 -0400 (Tue, 28 Jun 2011)
New Revision: 111684
Added:
projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/spi/graceful/
projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/spi/graceful/GracefulShutdown.java
projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/spi/graceful/package.html
projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/workmanager/unit/WorkManagerGracefulShutdownTestCase.java
Modified:
projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/CoreBundle.java
projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/api/workmanager/WorkManager.java
projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/workmanager/WorkManagerImpl.java
projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/workmanager/WorkWrapper.java
projects/jboss-jca/trunk/core/src/test/resources/rejecting-workmanager.xml
projects/jboss-jca/trunk/core/src/test/resources/workmanager.xml
projects/jboss-jca/trunk/embedded/src/main/resources/jca.xml
projects/jboss-jca/trunk/sjc/src/main/resources/bootstrap/jca.xml
Log:
[JBJCA-609] Graceful shutdown
Modified: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/CoreBundle.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/CoreBundle.java 2011-06-28 12:32:25 UTC (rev 111683)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/CoreBundle.java 2011-06-28 15:14:13 UTC (rev 111684)
@@ -138,6 +138,12 @@
@Message(id = 262, value = "Duplicate HintWorkContext class: %s")
public String duplicateHintWorkContextClass(String classname);
+ /**
+ * WorkManager shutdown
+ * @return The value
+ */
+ @Message(id = 263, value = "WorkManager is shutting down")
+ public String workmanagerShutdown();
// CONNECTION MANAGER LISTENER (300)
Modified: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/api/workmanager/WorkManager.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/api/workmanager/WorkManager.java 2011-06-28 12:32:25 UTC (rev 111683)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/api/workmanager/WorkManager.java 2011-06-28 15:14:13 UTC (rev 111684)
@@ -22,6 +22,7 @@
package org.jboss.jca.core.api.workmanager;
+import org.jboss.jca.core.spi.graceful.GracefulShutdown;
import org.jboss.jca.core.spi.security.Callback;
import org.jboss.jca.core.spi.transaction.xa.XATerminator;
@@ -30,7 +31,7 @@
/**
* The JBoss specific work manager interface
*/
-public interface WorkManager extends javax.resource.spi.work.WorkManager, Cloneable
+public interface WorkManager extends javax.resource.spi.work.WorkManager, GracefulShutdown, Cloneable
{
/**
* Retrieve the executor for short running tasks
Added: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/spi/graceful/GracefulShutdown.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/spi/graceful/GracefulShutdown.java (rev 0)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/spi/graceful/GracefulShutdown.java 2011-06-28 15:14:13 UTC (rev 111684)
@@ -0,0 +1,47 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2011, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.jboss.jca.core.spi.graceful;
+
+/**
+ * The SPI for graceful shutdown
+ *
+ * @author <a href="mailto:jesper.pedersen at jboss.org">Jesper Pedersen</a>
+ */
+public interface GracefulShutdown
+{
+ /**
+ * Signal the component to prepare for shutdown
+ */
+ public void prepareShutdown();
+
+ /**
+ * Shutdown the component
+ */
+ public void shutdown();
+
+ /**
+ * Is the component shutdown
+ * @return True if shutdown; false if active
+ */
+ public boolean isShutdown();
+}
Added: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/spi/graceful/package.html
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/spi/graceful/package.html (rev 0)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/spi/graceful/package.html 2011-06-28 15:14:13 UTC (rev 111684)
@@ -0,0 +1,3 @@
+<body>
+This package contains the SPI for components that support a graceful shutdown mechanism.
+</body>
Modified: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/workmanager/WorkManagerImpl.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/workmanager/WorkManagerImpl.java 2011-06-28 12:32:25 UTC (rev 111683)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/workmanager/WorkManagerImpl.java 2011-06-28 15:14:13 UTC (rev 111684)
@@ -36,6 +36,7 @@
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
import javax.resource.spi.work.ExecutionContext;
import javax.resource.spi.work.HintsContext;
@@ -101,6 +102,12 @@
/** Security module for callback */
private Callback callbackSecurity;
+ /** Shutdown */
+ private AtomicBoolean shutdown;
+
+ /** Active work wrappers */
+ private Set<WorkWrapper> activeWorkWrappers;
+
/**Default supported workcontext types*/
static
{
@@ -116,6 +123,8 @@
{
specCompliant = true;
validatedWork = new HashSet<String>();
+ shutdown = new AtomicBoolean(false);
+ activeWorkWrappers = new HashSet<WorkWrapper>();
}
/**
@@ -246,6 +255,9 @@
if (trace)
log.tracef("doWork(%s, %s, %s, %s)", work, startTimeout, execContext, workListener);
+ if (shutdown.get())
+ throw new WorkRejectedException(bundle.workmanagerShutdown());
+
WorkException exception = null;
WorkWrapper wrapper = null;
try
@@ -323,7 +335,9 @@
}
if (wrapper != null)
+ {
checkWorkCompletionException(wrapper);
+ }
}
}
@@ -346,6 +360,9 @@
{
log.tracef("startWork(%s, %s, %s, %s)", work, startTimeout, execContext, workListener);
+ if (shutdown.get())
+ throw new WorkRejectedException(bundle.workmanagerShutdown());
+
WorkException exception = null;
WorkWrapper wrapper = null;
try
@@ -452,6 +469,9 @@
{
log.tracef("scheduleWork(%s, %s, %s, %s)", work, startTimeout, execContext, workListener);
+ if (shutdown.get())
+ throw new WorkRejectedException(bundle.workmanagerShutdown());
+
WorkException exception = null;
WorkWrapper wrapper = null;
try
@@ -530,6 +550,62 @@
}
/**
+ * {@inheritDoc}
+ */
+ public void prepareShutdown()
+ {
+ shutdown.set(true);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void shutdown()
+ {
+ prepareShutdown();
+
+ synchronized (activeWorkWrappers)
+ {
+ for (WorkWrapper ww : activeWorkWrappers)
+ {
+ ww.getWork().release();
+ }
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isShutdown()
+ {
+ return shutdown.get();
+ }
+
+ /**
+ * Add work wrapper to active set
+ * @param ww The work wrapper
+ */
+ void addWorkWrapper(WorkWrapper ww)
+ {
+ synchronized (activeWorkWrappers)
+ {
+ activeWorkWrappers.add(ww);
+ }
+ }
+
+ /**
+ * Remove work wrapper from active set
+ * @param ww The work wrapper
+ */
+ void removeWorkWrapper(WorkWrapper ww)
+ {
+ synchronized (activeWorkWrappers)
+ {
+ activeWorkWrappers.remove(ww);
+ }
+ }
+
+ /**
* Get the executor
* @param work The work instance
* @return The executor
Modified: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/workmanager/WorkWrapper.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/workmanager/WorkWrapper.java 2011-06-28 12:32:25 UTC (rev 111683)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/workmanager/WorkWrapper.java 2011-06-28 15:14:13 UTC (rev 111684)
@@ -90,7 +90,7 @@
private WorkListener workListener;
/** The work manager */
- private org.jboss.jca.core.api.workmanager.WorkManager workManager;
+ private WorkManagerImpl workManager;
/** The blocked time */
private long blockedTime;
@@ -115,7 +115,7 @@
* @param completedLatch The latch for when work has completed
* @throws IllegalArgumentException for null work, execution context or a negative start timeout
*/
- public WorkWrapper(org.jboss.jca.core.api.workmanager.WorkManager workManager,
+ public WorkWrapper(WorkManagerImpl workManager,
Work work,
ExecutionContext executionContext,
WorkListener workListener,
@@ -204,6 +204,7 @@
try
{
start();
+ workManager.addWorkWrapper(this);
if (startedLatch != null)
startedLatch.countDown();
@@ -220,6 +221,7 @@
}
finally
{
+ workManager.removeWorkWrapper(this);
work.release();
if (workListener != null)
Added: projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/workmanager/unit/WorkManagerGracefulShutdownTestCase.java
===================================================================
--- projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/workmanager/unit/WorkManagerGracefulShutdownTestCase.java (rev 0)
+++ projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/workmanager/unit/WorkManagerGracefulShutdownTestCase.java 2011-06-28 15:14:13 UTC (rev 111684)
@@ -0,0 +1,196 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2011, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.jboss.jca.core.workmanager.unit;
+
+import org.jboss.jca.core.api.workmanager.WorkManager;
+import org.jboss.jca.embedded.Embedded;
+import org.jboss.jca.embedded.EmbeddedFactory;
+
+import javax.resource.spi.work.Work;
+import javax.resource.spi.work.WorkRejectedException;
+
+import org.jboss.logging.Logger;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+/**
+ * Work manager test cases for graceful shutdown
+ *
+ * @author <a href="mailto:jesper.pedersen at jboss.org">Jesper Pedersen</a>
+ */
+public class WorkManagerGracefulShutdownTestCase
+{
+
+ // --------------------------------------------------------------------------------||
+ // Class Members ------------------------------------------------------------------||
+ // --------------------------------------------------------------------------------||
+
+ private static final Logger LOG = Logger.getLogger(WorkManagerGracefulShutdownTestCase.class);
+
+ /*
+ * Embedded
+ */
+ private Embedded embedded;
+
+ /**
+ * Work manager
+ */
+ private WorkManager workManager;
+
+ // --------------------------------------------------------------------------------||
+ // Tests --------------------------------------------------------------------------||
+ // --------------------------------------------------------------------------------||
+
+ /**
+ * Test graceful shutdown
+ * @throws Throwable throwable exception
+ */
+ @Test
+ public void testShutdown() throws Throwable
+ {
+ assertFalse(workManager.isShutdown());
+
+ workManager.prepareShutdown();
+
+ assertTrue(workManager.isShutdown());
+ }
+
+ /**
+ * Test doWork
+ * @throws Throwable throwable exception
+ */
+ @Test(expected = WorkRejectedException.class)
+ public void testDoWork() throws Throwable
+ {
+ workManager.prepareShutdown();
+
+ workManager.doWork(new Work()
+ {
+ /**
+ * Run
+ */
+ public void run()
+ {
+ }
+
+ /**
+ * Release
+ */
+ public void release()
+ {
+ }
+ });
+ }
+
+ /**
+ * Test startWork
+ * @throws Throwable throwable exception
+ */
+ @Test(expected = WorkRejectedException.class)
+ public void testStartWork() throws Throwable
+ {
+ workManager.prepareShutdown();
+
+ workManager.startWork(new Work()
+ {
+ /**
+ * Run
+ */
+ public void run()
+ {
+ }
+
+ /**
+ * Release
+ */
+ public void release()
+ {
+ }
+ });
+ }
+
+ /**
+ * Test scheduleWork
+ * @throws Throwable throwable exception
+ */
+ @Test(expected = WorkRejectedException.class)
+ public void testScheduleWork() throws Throwable
+ {
+ workManager.prepareShutdown();
+
+ workManager.scheduleWork(new Work()
+ {
+ /**
+ * Run
+ */
+ public void run()
+ {
+ }
+
+ /**
+ * Release
+ */
+ public void release()
+ {
+ }
+ });
+ }
+
+ // --------------------------------------------------------------------------------||
+ // Lifecycle Methods --------------------------------------------------------------||
+ // --------------------------------------------------------------------------------||
+
+ /**
+ * Lifecycle start, before the suite is executed
+ * @throws Throwable throwable exception
+ */
+ @Before
+ public void before() throws Throwable
+ {
+ // Create and set an embedded JCA instance
+ embedded = EmbeddedFactory.create();
+
+ // Startup
+ embedded.startup();
+
+ workManager = embedded.lookup("WorkManager", WorkManager.class);
+ assertNotNull(workManager);
+ }
+
+ /**
+ * Lifecycle stop, after the suite is executed
+ * @throws Throwable throwable exception
+ */
+ @After
+ public void after() throws Throwable
+ {
+ // Shutdown embedded
+ embedded.shutdown();
+
+ // Set embedded to null
+ embedded = null;
+ }
+}
Modified: projects/jboss-jca/trunk/core/src/test/resources/rejecting-workmanager.xml
===================================================================
--- projects/jboss-jca/trunk/core/src/test/resources/rejecting-workmanager.xml 2011-06-28 12:32:25 UTC (rev 111683)
+++ projects/jboss-jca/trunk/core/src/test/resources/rejecting-workmanager.xml 2011-06-28 15:14:13 UTC (rev 111684)
@@ -27,6 +27,8 @@
<!-- The XA terminator -->
<property name="XATerminator"><inject bean="TransactionIntegration" property="XATerminator"/></property>
+
+ <destroy method="shutdown"/>
</bean>
</deployment>
Modified: projects/jboss-jca/trunk/core/src/test/resources/workmanager.xml
===================================================================
--- projects/jboss-jca/trunk/core/src/test/resources/workmanager.xml 2011-06-28 12:32:25 UTC (rev 111683)
+++ projects/jboss-jca/trunk/core/src/test/resources/workmanager.xml 2011-06-28 15:14:13 UTC (rev 111684)
@@ -55,6 +55,8 @@
<!-- The XA terminator -->
<property name="XATerminator"><inject bean="TransactionIntegration" property="XATerminator"/></property>
+
+ <destroy method="shutdown"/>
</bean>
</deployment>
Modified: projects/jboss-jca/trunk/embedded/src/main/resources/jca.xml
===================================================================
--- projects/jboss-jca/trunk/embedded/src/main/resources/jca.xml 2011-06-28 12:32:25 UTC (rev 111683)
+++ projects/jboss-jca/trunk/embedded/src/main/resources/jca.xml 2011-06-28 15:14:13 UTC (rev 111684)
@@ -109,6 +109,8 @@
<!-- The callback security module -->
<property name="CallbackSecurity"><inject bean="UsersRoles"/></property>
+
+ <destroy method="shutdown"/>
</bean>
<!-- Default Bootstrap context -->
Modified: projects/jboss-jca/trunk/sjc/src/main/resources/bootstrap/jca.xml
===================================================================
--- projects/jboss-jca/trunk/sjc/src/main/resources/bootstrap/jca.xml 2011-06-28 12:32:25 UTC (rev 111683)
+++ projects/jboss-jca/trunk/sjc/src/main/resources/bootstrap/jca.xml 2011-06-28 15:14:13 UTC (rev 111684)
@@ -112,6 +112,8 @@
<!-- The callback security module -->
<property name="CallbackSecurity"><inject bean="UsersRoles"/></property>
+
+ <destroy method="shutdown"/>
</bean>
<!-- Default Bootstrap context -->
More information about the jboss-cvs-commits
mailing list