2016-07-29 4 views
2

ManagedScheduledExecutorServiceで問題があります。私のアプリケーションを無効にしたり、展開したりすると、スケジューラはまだ動作しています。アプリケーションサーバーを再起動したときにのみ停止します。私のアプリケーションを無効にするか、または展開解除した後にスケジュールされたまま実行されています

私はJEE、アプリケーションサーバーWildfly 9Java8を使用しています。

下次のコード

package br.com.decarli; 

import java.time.LocalDateTime; 
import java.time.ZoneId; 
import java.util.Date; 

import javax.annotation.Resource; 
import javax.enterprise.concurrent.LastExecution; 
import javax.enterprise.concurrent.ManagedScheduledExecutorService; 
import javax.enterprise.concurrent.Trigger; 
import javax.enterprise.context.ApplicationScoped; 
import javax.enterprise.context.Destroyed; 
import javax.enterprise.context.Initialized; 
import javax.enterprise.event.Observes; 

@ApplicationScoped 
public class ApplicationSchedulerX { 

@Resource(lookup = "java:jboss/ee/concurrency/scheduler/MyScheduler") 
private ManagedScheduledExecutorService timerService; 

public void init(@Observes @Initialized(ApplicationScoped.class) Object o) { 

    timerService.schedule(() -> { 

     System.out.println(" Run scheduler... " ); 

    }, new Trigger() { 

     @Override 
     public Date getNextRunTime(LastExecution le, Date date) { 
      return getNextDateBySeconds(60); 
     } 

     @Override 
     public boolean skipRun(LastExecution le, Date date) { 
      return false; 
     } 

    }); 

} 

private Date getNextDateBySeconds(long seconds) { 
    LocalDateTime ldt = LocalDateTime.now().plusSeconds(seconds); 
    return Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant()); 
} 

public void destroy(@Observes @Destroyed(ApplicationScoped.class) Object o) { 
    //TODO error: Lifecycle operation not supported 
    //timerService.shutdown(); 
} 
} 

Wildfly 9スケジューラ構成:

<managed-scheduled-executor-service name="MyScheduler" jndi-name="java:jboss/ee/concurrency/scheduler/MyScheduler" hung-task-threshold="50000" long-running-tasks="true" core-threads="4" keepalive-time="500" reject-policy="ABORT"/> 
+0

あなたは[のServletContextListener](http://docs.oracle.com/javaee/7/api/javax/servlet/ServletContextListener.html)を使用することができますか? [例](https://www.mkyong.com/servlet/what-is-listener-servletcontextlistener-example/) – ebanouz

+0

起動時に正常に動作し、終了するとメソッドは実行されますが、timerServiceはまだ実行されています。 timerServiceのすべてのスケジュールをクリアする方法が見つかりませんでした。 –

答えて

3

Iリンクhttps://issues.jboss.org/browse/WFLY-3683に、解決策を見つけました。

スケジュールされたタスクのリストを作成し、destroyメソッドで取り消しました。

下記正しいコード:

package br.com.ciss.cissmart.client.core; 

import java.time.LocalDateTime; 
import java.time.ZoneId; 
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 javax.annotation.Resource; 
import javax.enterprise.concurrent.LastExecution; 
import javax.enterprise.concurrent.ManagedScheduledExecutorService; 
import javax.enterprise.concurrent.Trigger; 
import javax.enterprise.context.ApplicationScoped; 
import javax.enterprise.context.Destroyed; 
import javax.enterprise.context.Initialized; 
import javax.enterprise.event.Observes; 

@ApplicationScoped 
public class ApplicationSchedulerX { 

@Resource(lookup = "java:jboss/ee/concurrency/scheduler/MyScheduler") 
private ManagedScheduledExecutorService timerService; 

private List<ScheduledFuture<?>> scheduledTasks; 

/** 
* Método executado no start do servidor. 
* 
* @param o 
*    - {@link javax.servlet.ServletContext} - Contendo as configurações da aplicação 
*/ 
public void init(@Observes @Initialized(ApplicationScoped.class) Object o) { 

    this.scheduledTasks = Collections.synchronizedList(new ArrayList<ScheduledFuture<?>>()); 

    ScheduledFuture task = timerService.schedule(() -> { 


     System.out.println("Run scheduler... "); 

    }, new Trigger() { 

     @Override 
     public Date getNextRunTime(LastExecution le, Date date) { 
      return getNextDateBySeconds(60); 
     } 

     @Override 
     public boolean skipRun(LastExecution le, Date date) { 
      return false; 
     } 

    }); 

    scheduledTasks.add(task); 

} 

private Date getNextDateBySeconds(long seconds) { 
    LocalDateTime ldt = LocalDateTime.now().plusSeconds(seconds); 
    return Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant()); 
} 

public void destroy(@Observes @Destroyed(ApplicationScoped.class) Object o) { 

    // 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; 

} 
} 
関連する問題