[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