[jboss-jira] [JBoss JIRA] (WFLY-3683) ScheduledFuture#cancel(boolean) failing to cancel tasks on bean PreDestroy

Aaron Cordova (JIRA) issues at jboss.org
Mon Jul 28 19:51:29 EDT 2014


     [ https://issues.jboss.org/browse/WFLY-3683?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Aaron Cordova updated WFLY-3683:
--------------------------------

    Issue Type: Bug  (was: Feature Request)


> ScheduledFuture#cancel(boolean) failing to cancel tasks on bean PreDestroy
> --------------------------------------------------------------------------
>
>                 Key: WFLY-3683
>                 URL: https://issues.jboss.org/browse/WFLY-3683
>             Project: WildFly
>          Issue Type: Bug
>      Security Level: Public(Everyone can see) 
>          Components: EE
>    Affects Versions: 8.1.0.Final
>            Reporter: Aaron Cordova
>            Assignee: David Lloyd
>
> Calls to ScheduledFuture#cancel on bean cleanup are failing to cancel subsequent tasks. 
> *NOTE* This only occurs when using the Trigger functionality. I tested the same code with scheduleAtFixedRate, and it works as expected.
> The following bean demonstrates the bug:
> {code:title=Executor.java|borderStyle=solid}
> import java.util.ArrayList;
> import java.util.Collections;
> import java.util.Date;
> import java.util.Iterator;
> import java.util.List;
> import java.util.concurrent.ScheduledFuture;
> import java.util.concurrent.TimeUnit;
> import javax.annotation.PostConstruct;
> import javax.annotation.PreDestroy;
> import javax.annotation.Resource;
> import javax.ejb.Singleton;
> import javax.ejb.Startup;
> import javax.enterprise.concurrent.LastExecution;
> import javax.enterprise.concurrent.ManagedScheduledExecutorService;
> import javax.enterprise.concurrent.Trigger;
> import org.slf4j.Logger;
> import org.slf4j.LoggerFactory;
> /**
>  * Session Bean implementation class DataRecorderManagerBean
>  */
> @Singleton
> @Startup
> public class ExecutorBug {
>     private static final Logger LOGGER = LoggerFactory.getLogger(ExecutorBug.class);
>     @Resource
>     private ManagedScheduledExecutorService executorService;
>     private List<ScheduledFuture<?>> scheduledTasks;
>     /**
>      * Default constructor.
>      */
>     public ExecutorBug() {
>     }
>     @PostConstruct
>     void intialize() {
>         this.scheduledTasks = Collections.synchronizedList(new ArrayList<ScheduledFuture<?>>());
>         // Schedule the device task.
>         PeriodicTrigger trigger = new PeriodicTrigger(0, 10, TimeUnit.SECONDS);
>         ScheduledFuture<?> future = this.executorService.schedule(new LogRunner(), trigger);
>         // Create the scheduled task and add it to the map.
>         this.scheduledTasks.add(future);
>     }
>     @PreDestroy
>     void cleanup() {
>         // Cancel any scheduled tasks, ensuring that the map is locked.
>         synchronized (this.scheduledTasks) {
>             Iterator<ScheduledFuture<?>> i = this.scheduledTasks.iterator();
>             while (i.hasNext()) {
>                 ScheduledFuture<?> future = i.next();
>                 // Cancel the task.
>                 future.cancel(true);
>             }
>         }
>         this.scheduledTasks.clear();
>         this.scheduledTasks = null;
>     }
>     private class LogRunner implements Runnable {
>         public LogRunner() {
>         }
>         @Override
>         public void run() {
>             LOGGER.info("I am running");
>         }
>     }
>     private class PeriodicTrigger implements Trigger {
>         private final long periodMillis;
>         private Date startTime;
>         /**
>          * Creates and executes a periodic action that becomes enabled first after the given initial delay, and subsequently with the given period; that is executions will commence after initialDelay
>          * then initialDelay+period, then initialDelay + 2 * period, and so on.
>          * 
>          * @param initialDelay the time to delay first execution
>          * @param period the period between successive executions
>          * @param unit the time unit of the initialDelay and period parameters
>          */
>         public PeriodicTrigger(final long initialDelay, final long period, final TimeUnit unit) {
>             this.periodMillis = TimeUnit.MILLISECONDS.convert(period, unit);
>             // Calculate the start time.
>             Date now = new Date();
>             long millis = TimeUnit.MILLISECONDS.convert(initialDelay, unit);
>             this.startTime = new Date(now.getTime() + millis);
>         }
>         @Override
>         public Date getNextRunTime(final LastExecution lastExecutionInfo, final Date taskScheduledTime) {
>             if (lastExecutionInfo == null) {
>                 return this.startTime;
>             }
>             else {
>                 return new Date(lastExecutionInfo.getScheduledStart().getTime() + this.periodMillis);
>             }
>         }
>         @Override
>         public boolean skipRun(final LastExecution lastExecutionInfo, final Date scheduledRunTime) {
>             return false;
>         }
>     }
> }
> {code}
> Steps:
> * Deploy bean in Wildfly 8.1.0-Final using maven deploy goal.
> * Verify log statement is output.
> * Un-deploy bean from admin console.
> *Expected*
> Log statement is no longer called
> *Actual*
> Log statement continues to output after bean is destroyed.



--
This message was sent by Atlassian JIRA
(v6.2.6#6264)


More information about the jboss-jira mailing list